노무현 대통령 배너


2006. 7. 20. 13:07

디바이스 드라이버 작성시 고려사항

디바이스 드라이버 작성시 고려사항

변수

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

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

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

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

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

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

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

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

3. 이식성과 데이터형

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

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

#include 에 선언되어있다.

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

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

typedef struct

{

u16 index;

u16 data;

u8 data;

} __attribute__ ((packed)) testctl_t;

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

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

실제로 디바이스 드라이버에는 #include 를 포함시킨다.

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같은..) 인터럽트 서비스 함수 안에서 사용할수 없다.