'전체'에 해당되는 글 148건

Table of Content
1. 환경변수 설정
2. 환경변수 실행
3. spi flash cmd



1. 환경변수 설정
  command : setenv
  example:
    setenv ipaddr 10.100.4.48
    setenv my_test 'setenv ipaddr 10.100.4.96; setenv serverip 10.100.4.48'
    setenv my_run 'run my_test;tftp 0x20000000 vmlinux'

2. 환경변수 실행
  command : run
  example : 
    run my_run   => my_run 이라는 환경 변수로 등록해 놓은 내용들을 실행한다.


3. spi flash cmd
  command : sflash
  example : 
    sflash protect off => spi flash 에 write 할 수 있도록 함.

    sflash read 0xf8100000 0xa00000 0x3ffff  => 0xf8100000  에서 0x3fff 만큼 읽어서 0xa00000 로 저장한다.

















 






'development' 카테고리의 다른 글

[etc] Reglar expressions  (0) 2012.09.19
[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
[etc] 네트웍 용어 정리  (0) 2012.03.06
[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
블로그 이미지

김유석0

,
- L2TP
  Layer 2 Tunneling Protocol
  http://www.computerhope.com/jargon/l/l2tp.htm   

- BRAS
  Broadband Remote Access Server 
  http://en.wikipedia.org/wiki/Broadband_Remote_Access_Server



 

'development' 카테고리의 다른 글

[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
[u-boot] u-boot 사용법  (0) 2012.03.08
[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[kernel] 스핀락  (1) 2012.01.04
블로그 이미지

김유석0

,

애기 이름 공모중

일상사 2012. 2. 17. 16:38
애기 이름을 공모합니다. 

1. 추천하실 이름은 아래쪽 "comment" 에 리플로 남겨 주세요. 
2. 새로 공모하시려면 아래쪽 "comment" 에 리플로 남겨 주세요.
 


 김유석, 주현영  김지후, 김선우
 김장미  김지석, 김지환, 김주원
 민경대  김태양, 김가야, 김지후선배, 김우진, 김산, 김민준, 김메대이슨, 김현서, 김하람, 김바다, 김우리, 김만, 김경대
 황진상  김아무개
 김은희  김천국
 최창환  김가네, 김구라, 김C
 배장규  김율
 우승훈  김수한
 김기훈  김얼굴, 김공모
 황성주 김현석
   
   
   
   
   
   


확  정

김  율

'일상사' 카테고리의 다른 글

놀러 가는거  (0) 2014.08.12
면도기 샀음  (0) 2012.07.17
우리 제이 돌잔치  (0) 2011.11.06
관악산  (0) 2011.10.31
  (0) 2011.10.10
블로그 이미지

김유석0

,
2차원 배열 동적 할당

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
 
#define BUCKET 5
#define SLOT     5 

int main(int argc, char *argv[])
{
  int i = 0;
  char **array=NULL;

  array = (char **)malloc(sizeof(char *) * BUCKET);
  
  for(i=0;i<BUCKET;i++){
    array[i] = (char *)malloc(sizeof(char) * SLOT);
    memset(array[i], 0x00, SLOT);
    memcpy(array[i], "12345", 5);
  }

  for(i=0;i<BUCKET;i++){
    printf("%s\n", array[i]); 
  }
  
  return 0;
}




'development' 카테고리의 다른 글

[u-boot] u-boot 사용법  (0) 2012.03.08
[etc] 네트웍 용어 정리  (0) 2012.03.06
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[kernel] 스핀락  (1) 2012.01.04
[program] Makefile  (0) 2012.01.04
블로그 이미지

김유석0

,

iproute2

linux 2012. 2. 7. 14:48

기존 리눅스 시스템에서 사용하던 네트웍 관련 툴들을 하나로 묶어 놓은 유틸리티 입니다.

예를 들면 아래 표와 같이 기존 유틸리티와 iproute2 의 상관 관계를 살펴볼 수 있다.

 용도 기존 net-tools  iproute2 
 Address and link configuration  ifconfig  ip addr, ip link 
 Routing tables  route  ip route
 Neighbors  arp  ip neigh
 VLAN  vconfig  ip link
 Tunnels  iptunnel  ip tunnel
 Multicast  ipmaddr  ip maddr
 Statistics  netstat  ss

자세한 사용법은 계속 추가해 나갈 예정입니다.

1. Address and link configuration

2. Routing tables
  legacy command : route
  new command : ip route
  
  2.1 기본 라우팅 룰 확인하는 방법
    mkkim_babo $ ip rule list
    0: from all lookup local
    32766:  from all lookup main
    32767:  from all lookup default

  
2.2 show routing table
    ip route
    ip route show table main
    ip route show table local
    ip route show table all

 


3. Neighbors

4. VLAN

5. Tunnels

6. Multicast

7. Statistics

'linux' 카테고리의 다른 글

IPv4 packet forwarding  (0) 2012.05.03
리눅스 콘솔내용을 시리얼로 출력해서 보려면  (0) 2012.04.03
ubuntu 에서 tftp server 설치하는법  (0) 2011.11.24
GNOME 설정  (0) 2011.09.27
Iconv 로 인코딩 변경하기  (0) 2011.09.26
블로그 이미지

김유석0

,
보배드림에서 있었던 일






자게에서 퍼옴. 아..아닙니다. 



 

'재밌는거' 카테고리의 다른 글

수류탄 투척 실패  (0) 2011.12.25
근본있는 이름  (0) 2011.11.26
이말년의 패기  (0) 2011.11.26
내 손이 도구냐?  (0) 2011.11.26
냥이들  (0) 2011.11.26
블로그 이미지

김유석0

,
 Top Half? Bottom Half? 이게 뭐하는 녀석이지?

 용어만 보면 정확히 어떤 개념인지 와닿지가 않습니다.

 HW 인터럽트가 발생하였다고 가정하고,
 인터럽트가 발생하면 보통 아래와 같이 처리를 하게 됩니다.

    step 1. 인터럽트 disable
    step 2. 해당 인터럽트에 관련된 기능 동작
    step 3. 인터럽트 enable

 인터럽트가 발생하게 되면 우선 인터럽트 기능 자체를 disable 하게 됩니다. 
 지금 발생한 인터럽트에 관련된 기능을 모두 처리하기 전까지는 다른 인터럽트들은 무시하기 위해서입니다.
 인터럽트에 대한 처리가 모두 완료되면 인터럽트 기능을 enable 하고 기능을 종료하게 됩니다.

 여기서 간단히 생각해 볼 수 있는 것이 무엇이냐면

 "인터럽트 처리를 하는 시간이 길면 길수록 시스템이 멈춘것 같이 보일 수 있다"

 입니다. 

 예를 들어서 네트웍 패킷이 들어왔는데 패킷 처리 시간이 1초라면 패킷을 처리하는 동안은 키보드 입력도 안되고, 마우스 입력도 안되는 상황이 벌어지게 됩니다. 

 이런 상황을 개선하고자 Top half 와 Bottom half 라는 개념을 생각해 내게 되었습니다. 

 어떤 개념이냐면,

 "인터럽트가 발생했을때 데이터를 가져오는 등의 기능은 반드시 바로 처리해야 하고 속도도 빠르니까 데이터 가져오는 것까지만 잽싸게 처리하고, 그 데이터를 가져온 이후 동작은 꼭 지금 해야 하는 것은 아니니 나중에 처리하자"

 라는 것이지요.

 여기서 말하는

 데이터 가져오는 동작 : Top half
 가져온 데이터를 처리하는 동작 : Bottom half


 라고 부르기로 한 것이 Top half 와 Bottom half 의 개념입니다. (다시 설명하면 빠른 동작 하는 녀석은 Top half 라 부르기고 하고 느린 동작 하는 녀석은 Bottom half 라고 부르자 입니다. )

 window NT 계열에서는  "Deferred Procedure Call", "Asynchronous Procedure Call" 등과 같은 개념으로 부르고 있습니다. 

 인터럽트가 발생하는 Top half 동작부터 잽싸게 해치웁니다. 이렇게 하면 속도 저하를 느끼기가 어렵겠지요?
 그럼 Top half 동작을 통해서 가져온 데이터를 처리하는 느린 동작은 언제 시작하게 될까요?

 그것을 위해서 필요한 여러가지 기능이 있는데 가장 대표적인 것이 work_queue 입니다.

 work_queue 는 커널이 제공하는 기본 기능입니다.

 이름 대로 work(=function) 들을 queue 에 넣어서 관리하는 기능인데 work(=function) 들을 work_queue 에 넣어 주면 Top half 동작이 완료된후 차례대로 work(=function) 들을 호출해서 Bottom half 기능을 수행해 주게 됩니다.

 work_queue 에 대한 자세한 내용은 따로 다루도록 하겠습니다.



 
 

 

'development' 카테고리의 다른 글

[etc] 네트웍 용어 정리  (0) 2012.03.06
[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] 스핀락  (1) 2012.01.04
[program] Makefile  (0) 2012.01.04
[kernel] 커널 쓰레드  (0) 2012.01.04
블로그 이미지

김유석0

,

[kernel] 스핀락

development 2012. 1. 4. 16:17
Table of content
  1. spin lock?
  2. example of spin_lock 












1. spin lock?
  프로세스 한개만 계속 수행되는 경우라면 critical section 에 대해서 신경쓸 필요가 없다.
  하지만, 현실은 여러 프로세스가 함께 동작하는 상황이므로 LOCK 에 대한 고민을 할 수 밖에 없다. 
 
  spin lock 은 커널에서 사용하는 LOCK 기법중의 하나이며 대표적인 기법이다.

  spin lock 의 API 들은 아래와 같다.

    spin_lock_init();
    spin_lock();
    spin_unlock();
    spin_locK_irqsave():
    spin_lock_irq();
    spin_lock_bh();
    spin_unlock_irqrestore();
    spin_unlock_irq();
    spin_unlock_bh();
    spin_trylock();
    spin_trylock_bh();

  spin lock() 이 커널의 LOCK 기법중 하나인 것을 감안하면 api 의 숫자가 많은 것에 놀랄수도 있다. 그만큼 LOCK 기법은 어렵고 신경써야 할 점이 많다는 것이라고 이해하면 된다. 


2. example of spin_lock
  spin lock 을 사용하려면
  
 
첫번째, spin lock 변수를 선언해야 하고
 
두번째, spin lock 변수를 초기화 해야 하며
    : static 과 dynamic 방식으로 구분된다. 
 
세번째, lock 을 얻어야 하며
    : spin_lock();
 
네번째, lock 을 풀어주어야 한다.
    : spin_unlock(); 

  아래는 spin lock 을 사용하는 가장 간단한 예제이다.

#include <asm/init.h>
#include <asm/kernel.h>
#include <asm/module.h>
#include <asm/version.h>
#include <asm/delay.h>
#include <asm/spinlock.h>
#include <asm/kthread.h>

spinlock_t g_this_lock;
struct task_struct *g_th_id1;
struct task_struct *g_th_id1;

static int
 thr_spin_lock_1(void *arg)
{
  int i = 0;
 
  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);

  spin_lock(&g_this_lock);

  
printk(KERN_ALERT "@ %s() : get locked\n", __FUNCTION__);

  for(i=0;i<30;i++){
    
printk(KERN_ALERT "@ %s() : loop\n", __FUNCTION__);
    ssleep(1); 

  } 
 

  spin_unlock(&g_this_lock); 

  printk(KERN_ALERT "@ %s() : unlocked\n", __FUNCTION__);
 
 
return 0; 



static int
 thr_spin_lock_2(void *arg)

  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);

  spin_lock(&g_this_lock);

  
printk(KERN_ALERT "@ %s() : get locked\n", __FUNCTION__);

  ssleep(10);

  spin_unlock(&g_this_lock); 


  
printk(KERN_ALERT "@ %s() : unlocked\n", __FUNCTION__);
  
  
return 0; 


static void __init only_spin_lock_init(void)
{
  spin_lock_init(&_ghis_lock);

  g_th_id1 = kthread_run(thr_spin_lock_1, NULL, "LOCK1");
  g_th_id2 = kthread_run(thr_spin_lock_2, NULL, "LOCK2");

  return 0; 



 위 예제는 문제를 내포하고 있는 코드입니다. spin_lock 이 걸려 있는 상태에서 rmmod 로 모듈을 제거하게 되면 "device is busy" 가 발생하게 됩니다. 
 

'development' 카테고리의 다른 글

[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[program] Makefile  (0) 2012.01.04
[kernel] 커널 쓰레드  (0) 2012.01.04
[kernel] 시간지연  (1) 2012.01.02
블로그 이미지

김유석0

,

[program] Makefile

development 2012. 1. 4. 13:15

Table of Content
  1. Example of Makefile
  2. 텍스트 함수









1. Example of Makefile
  하위 디렉토리를 관리하는 가장 기본적인 예제

 .SILENT:

SUB_DIRS=$(shell ls -d */ |cut -f1 -d/)

all:
    @for list in $(SUB_DIRS); do make -C $$list ; done

clean:
    @for list in $(SUB_DIRS); do make -C $$list clean ; done

distclean:
    @make clean
  위 예제는 하위 디렉토리를 자동 검색하게 하여 make list 에 넣는 형태로 되어 있다.
  배포용으로는 아주 좋은 형태이지만, 실제 개발 프로젝트 진행시에는 모든 하위 디렉토리를 컴파일하게 만들면 불편한 상황이 발생하게 된다.  
  그래서 아래와 같이 make list 를 명시적으로 지정하게 하는 것이 개발할 때 더 편하다.
 
  개발 프로젝트 진행시 가장 편리한 예제
 .SILENT:

SUB_DIRS=project1\
               project2\
               project3

all:
    @for list in $(SUB_DIRS); do make -C $$list ; done

clean:
    @for list in $(SUB_DIRS); do make -C $$list clean ; done

distclean:
    @make clean
 


2. 텍스트 함수

makefile 은 텍스트를 다루는 다양한 기능(함수) 를 제공한다.

subst

문법

  $(subst TARGET,DEST,SRC_TEXT)

설명

  SRC_TEXT 에서 TARGET 을 DEST 로 변환한다.

예제

  SRC_STRING="I am a boy"

  RESULT=$(subst boy,man,$(SRC_STRING))

  => I am a man 으로 변환됨.

notdir :

wildcard

'development' 카테고리의 다른 글

[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[kernel] 스핀락  (1) 2012.01.04
[kernel] 커널 쓰레드  (0) 2012.01.04
[kernel] 시간지연  (1) 2012.01.02
[kernel] 커널 메모리 모델  (0) 2011.12.29
블로그 이미지

김유석0

,

Table of Content
  1. kernel_thread VS kthread
  
2. kernel_thread 
     A. 소개
     B. daemonize()
     
  3
. kthread 
  
4. kthread 예제 

1. kernel_thread VS kthread
  linux kernel 에서 쓰레드를 구현하는 기법엔 크게 두가지가 있습니다.
  첫번째는 kernel_thread() 를 사용하는 것이고
  두번째는 kthread_xxxx() 를 사용하는 것입니다.

  kernel_thread() 는 가장 기본적인 쓰레드 구현 방법인데 실제 커널 코드상에서는 사용 빈도가 극히 드뭅니다. 
  kernel_thread() 를 직접 사용하면 이것저것 해 줘야 할 것들이 많아지는데  
kthread_xxxx() 계열을 사용하면 코드가 상당히 간단해 집니다.  

kthread_create()
kthread_run()
kthread_bind()
kthread_sop()
kthread_should_stop()
kthread_data() 

 자세한 내용은 커널 소스 트리와 linux/kthread.h 를 참조해 주십시요. 

2. kernel_thread
A. 소개 

  kernel_thread 는 잘 사용안하는 방법으로 생각됩니다. 커널 코드를 살펴보아도 5~6 군데에서만 사용하고 있습니다. 
  쓰레드 종료와 SMP 에 대해서는 크게 신경쓰고 있지 않는 것으로 보입니다.
  샘플 코드는 아래와 같습니다. 
  
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/kthread.h>

int flag=0;
struct task_struct *th_id;

static int kernel_thread_thr_wait(void *arg)
{
  int i = 0;
  char *text = (char *)arg;
  while(flag)
  {
    printk(KERN_ALERT "KERNEL_THREAD. %d [ %s ]\n", i, text);
    ++i;
    udelay(1000);
  }
  printk(KERN_ALERT "KERNEL_THREAD. Stoped\n");
 
return 0;


static void DONE(void)
{
  flag = 0;
}  


static int __init kernel_thread_init(void)
{
  flag = 1;
  th_id = (struct task_struct *)kernel_thread(kernel_thread_thr_wait, "TEST", CLONE_KERNEL);
  if(IS_ERR(th_id)){
    printk(KERN_ALERT "Fail to create the thread\n");
    return -1;
  }
  udelay(5000);
  DONE();
  로 udelay(5000);
 
return 0;


static void kernel_thread_release(void)
{
  printk(KERN_ALERT "Exit %s()\n", __FUNCTION__);


module_init(kernel_thread_init);
module_exit(kernel_thread_release);
MODULE_LICENSE("Dual BSD/GPL"); 

B. daemonize()
  kernel_thread() 로 생성된 쓰레드는 부모 쓰레드가 자식 쓰레드보다 먼저 죽게되면 자식 쓰레드는 좀비 쓰레드가 됩니다. 
  이런 일을 방지하기 위해서 daemonize() 를 호출하여 부모 쓰레드를 kthreadd 라는 커널 쓰레드로 바꿔주어서 자식 쓰레드가 죽을 때까지 기다릴 수 있게 만들어 줍니다. 

  사용방법은 커널 소스트리를 살펴봐 주세요. 

3. kthread
  대다수의 커널 쓰레드 들은 kthread 를 사용하여 구현되어 있습니다. (커널 소스 트리 검색)

  쓰레드 생성 api
   
kthread_create();
    kthread_run();


  쓰레드 정지 api
    kthread_stop();
    kthread_should_stop();


  그외 api
    kthread_bind();
    kthread_data();
    kthreadadd();
    kthread_worker();
    init_kthread_worker();
    init_kthread_work();
    kthread_worker_fn();
    queue_kthread_work();
    flush_kthread_work();
    flush_kthread_worker();

  많은 API 가 있지만 주로 사용하는 API 는 아래와 같습니다. 
    kthread_create();        : 쓰레드 생성
    kthread_run();            : 쓰레드 생성 + 잘생성되었는지 검사
    kthread_stop();           : 쓰레드 종료하라고 명령 내림
    kthread_should_stop(); : 쓰레드 종료 명령이 내려졌는지 검사함. 
    kthread_bind()            : 쓰레드가 사용할 cpu 지정.

4. kthread 예제
  kthread 에 대한 간단한 예제는 아래와 같습니다. 

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/kthread.h>

struct task_struct
 *g_th_id=NULL;

static int kthread_example_thr_fun(void *arg)
{
  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);
  while(!kthread_should_stop())
  {
    printk(KERN_ALERT "@ %s() : loop\n", __FUNCTION__);
    ssleep(1); 

  }
  printk(KERN_ALERT "@ %s() : kthread_should_stop() called. Bye.\n", __FUNCTION__);
  return 0;


static int __init kthread_example_init(void)
{
  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);
 
  if(g_th_id == NULL){ 

     g_th_id = (struct task_struct *)kthread_run(kthread_example_thr_fun, NULL, "kthread_example");
  }
 
return 0;


static void __exit kthread_example_release(void)
{
  if(g_th_id){
     kthread_stop(g_th_id);
     g_th_id = NULL;
  }
  printk(KERN_ALERT "@ %s() : Bye.\n", __FUNCTION__);

 

module_init(kthread_example_init);
module_exit(kthread_example_release);
MODULE_LICENSE("Dual BSD/GPL"); 

  위 코드를 살펴보면 g_th_id 을 자동관리해 주지 않는다는 것을 알 수 있습니다.
  항상 g_th_id 에 대한 관리를 확실히 해 주는 것이 중요할 것으로 예상됩니다.
 


 


  


'development' 카테고리의 다른 글

[kernel] 스핀락  (1) 2012.01.04
[program] Makefile  (0) 2012.01.04
[kernel] 시간지연  (1) 2012.01.02
[kernel] 커널 메모리 모델  (0) 2011.12.29
[etc] 빌드 시스템  (0) 2011.12.23
블로그 이미지

김유석0

,