'device driver'에 해당되는 글 2건


디바이스 드라이버
 
 
http://blog.naver.com/iamlow/90006359729



변수

 

1. 지역변수와 전역변수의 선택

- 디바이스 드라이버 소스에 정의된 지역변수와 전역변수는 모두 커널 메모리공간에 배치

- 가급적 제진입 가능함수로 만들것(지역변수 사용할것)

 

2. 중복 함수명과 변수명방지

- 중복 우려 static 키워드 사용하여 해당 파일 소스에서만 참조하도록

- 지역 변수에서는 사용하지 말것

  지역변수에 static선언하면 전역 변수와 같이 종료시에도 값이 유지

  차이점은 외부 심볼 참조가 되지 않는점

 

3. 이식성과 데이터형

- 이식성 문제는 대부분 사용하는 변수의 데이터형을 명확히 하면 해결된다.

- 변수의 프로세서 의존성을 피하기 우해 리눅스 커널에서 제공하는 데이터형을 사용하라

  #include <asm/types.h>에 선언되어있다.

- 구조체에서 보통 int형 크기의 배수로 선언되므로 정확한 데이터크기를 위해

  packed키워드 사용할것 (강추~!)

  typedef struct

  {

         u16 index;

         u16 data;

         u8  data;

  } __attribute__ ((packed)) testctl_t;

- 바이트 순서(Big,Little Endian)

  바이트 순서를 정확하게 처리하도록 도와주는 헤더파일은 모두 include/linux/byteorder에있다.

  실제로 디바이스 드라이버에는 #include <asm/byteorder.h>를 포함시킨다.

 

4.I/O 메모리 접근 변수 처리

- volatile 사용~ 책참조~!

 

동적 메모리

 

일반 프로그램에서의 동적메모리와 디바이스 드라이버에서 사용되는 동적메모리는 차이가있다

알아보자~!!

- 커널과 프로세스의 메모리 공간은 서로 다른구조다

     - 사용자 메모리공간에서 메모리를 할당하는경우에는 커널의 메모리관리 루틴과 glibc의 메모

       리 할당 루틴에의해 할당받는다.

     - 디바이스 드라이버가 동작하는 메모리의 공간은 커널 메모리공간이다.

     - 특히 커널은 시스템 전체의 물리메모리에 접근할수 있고 자체적으로 관리하기때문에 MMU를

       고려한 처리가 필요하다.

- PAGE_SIZE 단위로 할당하는 특성

     - 메모르리를 특정단위로 할당(리눅스에서는 PAGE_SIZE,PAGE_SHIFT에의해 관리)

     - 특히 PAGE_SIZE값은 MMU가 관리하는 단위에 영향(보통 4KByte)

- 시스템에 가용 메모리가 없는 상황

     - malloc()은 실패가능성 거의없다(가상메모리 사용하기때문에...)

     - 커널 메모리는 가상메모리의 페이징 기능을 이용하지않는다.

- 가상 메모리 기법에 의해 접근하고자 하는 메모리가 보조 장치에 존재하는 상황

- DMA같은 디바이스가 사용하는 연속된 물리 메모리 주소가 필요한 상황

     - 디바이스 드라이버가 다루는 디바이스중에는 고속의 데이터전송을 수행하기위해 DMA이용

     - DMA의 경우에는 물리적으로 연속될 필요가 있어 이를 처리하기위한 메모리관리루틴 필요

- 인터럽트 상태에서 메모리를 할당하는 상황

 

1.kmalloc(),kfree()

- 할당속도가 빠르고 사용법 간단하여 디바이스 드라이버에서 가장 많이 사용

- 단 kmalloc()함수를 사용할때 할당 가능한 크기가 32 * PAGE_SIZE(131,072Byte)

- ex) char * buff;

        buff = kmalloc(1024, GFP_KERNEL);

        ...

        kfree(buff);

- kmalloc()함수의 옵션

     - GFP_KERNEL : 동적 메모리 할당이 항상 성공하도록...

                              메모리 부족할때는 할당가능할때까지 대기~

                              그래서 인터럽트 서비스에 사용할때는 이 값사용하면 안된다.

     - GFP_ATOMIC : 메모리있으면 무조건 할당 없으면 즉시 리턴(NULL)

                              프로세스가 잠들문제는 없지만 NULL일경우 대비하여 프로그래밍해야...

     - GFP_DMA : 연속된 물리 메모리를 할당받을때 사용

                         DMA컨트롤러 사용시..

2.vmalloc(),vfree()

- malloc과 가장 유사

- kmalloc()은 크기가 제한(32*PAGE_SIZE)되어있지만 vmalloc()함수는 가상 공간이 허용하는

  한 크기 제한없이 사용가능

- 그래서 큰 메모리공간을 할당할때 주로 사용

- 가상 메모리 관리루틴이 수행되기때문에 kmalloc()함수보다 속도가 매우느리다

- 옵션이 없어서(GFP_ATOMIC같은..) 인터럽트 서비스 함수 안에서 사용할수 없다.
신고
블로그 이미지

꽃중년

불만있으면 떠나라...

mmap, ioremap

Software 관련 2008.03.09 20:34

mmap은 응용 프로그램 level에서 주소를 접근하고자 할 때 사용합니다. (사용자 레벨 <-> 커널 레벨간)
ioremap은 같은 역할을 하는 함수인데 이는 커널 내부에서 주소 접근시 사용하게 됩니다. (커널 레벨 <-> 커널 레벨)
device driver작성시에는 mmap대신 ioremap을 쓰게 되겠지요.

코드를 작성할 때 ioremap을 사용해서 하는 것이 safe한 프로그램을 만드는 관점에서는 정석.
user level에서 작성했던 예제는 그 device의 physical address를 mmap을 이용해서 virtual address를 얻어와 제어를 한 것입니다.
커널 내 module에서도 이와 같이 ioremap을 통해서 device의 physical address를 mmap를 이용하여 mapping후 사용합니다. (device driver인 경우)
 
신고
블로그 이미지

꽃중년

불만있으면 떠나라...

티스토리 툴바