본문 바로가기
[Developer]/Android

Linux4Android 4th Afternoon

by 해피빈이 2010. 11. 11.

 

이젠 kernel_program.tar.gz와 drivers.tar.gz를 가지고 실습한다!

drivers.tar.gz kernel_program.tar.gz

 

driver만들때 include해야할 헤더파일

  1. init.h
  2. module.h
  3. fs.h
  4. slab.h -> kmalloc(); kfree();
  5. uaccess.h -> 커널에 있는 데이터를 사용자 스페이스와 갖다 쓰고 싶을 때.
  6. cdev.h 혹은 bdev.h

 

안드로이드는 major 넘버를 254까지만 인식을 한다.

MYDEV_NAME은 driver name이다.

 

Makefile을 새롭게 만들자.

위치는

~/SOLUTION/s_02/ 아래에 한다고 했을 때.

vi Makefile

 Makefile

 

vi lab1_chrdrv.c

 lab1_chrdrv.c

 

커널 메모리 할당

  1. kmalloc(); / kfree(); 이것은 물리적으로 연속된 공간에 할당한다. 32bytes ~ 126kbytes (page = 4k)
  2. vmalloc(); / vfree(); 이것은 논리적으로만 연속된공간이다. 따라서 물리적으로는 연속적이지 않을 수 있다.
  3. 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

댓글