이젠 kernel_program.tar.gz와 drivers.tar.gz를 가지고 실습한다!
drivers.tar.gz kernel_program.tar.gz
driver만들때 include해야할 헤더파일
- init.h
- module.h
- fs.h
- slab.h -> kmalloc(); kfree();
- uaccess.h -> 커널에 있는 데이터를 사용자 스페이스와 갖다 쓰고 싶을 때.
- cdev.h 혹은 bdev.h
안드로이드는 major 넘버를 254까지만 인식을 한다.
MYDEV_NAME은 driver name이다.
Makefile을 새롭게 만들자.
위치는
~/SOLUTION/s_02/ 아래에 한다고 했을 때.
vi Makefile
vi lab1_chrdrv.c
커널 메모리 할당
- kmalloc(); / kfree(); 이것은 물리적으로 연속된 공간에 할당한다. 32bytes ~ 126kbytes (page = 4k)
- vmalloc(); / vfree(); 이것은 논리적으로만 연속된공간이다. 따라서 물리적으로는 연속적이지 않을 수 있다.
- get_free_pages(); / free_pages(); page단위로.
kmalloc의 파라메타의 경우의 수.
GFP_KERNEL
인터럽트 핸들러를 사용했을 때 wait한다.
GFP_ATOMIC
인터럽트 핸드러를 사용했을 때 기다리지 않는다.
dmesg : 커널 로그를 출력할 수 있다.
/proc/kmsg : 커널 메세지가 발생할 때마다 관찰 가능.
cat /proc/kmsg
커널 메세지 출력 방법
printk(KERN_WARNING "system ok");
printk("<4>" "system ok");
printk("system ok");
printk() 사용시 주의할 점
printk를 과도하게 사용하지 않는다. -> 실행시간이 길어지기 때문이다.
minicom에서 quiet라는 것을 넣으면 부팅시간을 단축시킬 수 있다.
드라이버 정보 매크로 중에서 가장 중요한것은
MODULE_LICENSE()이다. 이것을 꼭 명시해주자.
__setup();은 init.h에 들어 있다.
module_param(); 은 moduleparam.h에 있다.
Kernel code = 디바이스 드라이버는 커널의 한 부분이므로, 커널의 다른 코드와 마찬가지로 잘못되면 시스템에 치명적인 영향을 줄 수 있다.
요즘은 CPU가 각 device들에게 종료 signal을 각각 다 보낸다. 요즘 device들은 정교하기 때문에 그냥 종료하면 문제가 발생할 소지가 크기 때문이다.
<<minicom에서 NFS로 부팅한 이후에 모듈 올려보는 것 테스트해보기(커맨드리스트)>>
----------Makefile 최상단--------obj-m을 하나씩 늘려가며 테스트해보자.---
obj-m += lab1_char.o lab1_interrupt.o lab5_dynamic_udev.o procfs_example.o
export KROOT=나의커널루트디렉토리로설정
-----------------------------------------------------------------
sample에는 lab1_char.c lab1_sem1.c lab1_sem3.c lab5_dynamic_udev.c lab1_interrupt.c lab1_sem2.c lab2_maxmem.c procfs_example.c가 들어있다.
cd /nfsdir/sample에서 위 Makefile처럼 수정한 후
make 명령을 하고 나서 minicom 화면으로 이동.
ca sample
insmod lab1_char.ko
insmod lab5_dynamic_udev.ko
ls -l /dev/mycdr
insmod lab1_interrupt.ko
cat /proc/inturrupts
insmod procfs_example.ko
cd /proc/
cd procfs_example
ls
아어렵다
이 글은 스프링노트에서 작성되었습니다.
'[Developer] > Android' 카테고리의 다른 글
Linux4Android 5th Afternoon (0) | 2010.11.12 |
---|---|
Linux4Android 5th Morning (0) | 2010.11.12 |
Linux4Android 4th Morning (0) | 2010.11.11 |
Linux4Android 3rd Afternoon (0) | 2010.11.10 |
Linux4Android 3rd Morning (0) | 2010.11.10 |
댓글