디바이스 드라이버 작성시 고려사항
디바이스 드라이버 작성시 고려사항
변수
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같은..) 인터럽트 서비스 함수 안에서 사용할수 없다.
'Embedded System > Device Driver' 카테고리의 다른 글
[본문스크랩] Kernel Version 2.6.X에서 모듈 프로그래밍 방법 (0) | 2006.07.20 |
---|---|
커널 2.6.x 디바이스 드라이버 (0) | 2006.07.20 |
Linux Device Drivers, Third Edition (0) | 2006.07.20 |
양산시에 문제되는 NAND의 배드 테이블 관리기법 (0) | 2006.06.20 |
Linux Framebuffer Driver Writing HOWTO (0) | 2006.06.14 |