C & Docker & LINUX

리눅스 커널) 모듈 프로그래밍(읽기 쓰기가 가능한 Character Device 모듈 구현)

로픽 2017. 5. 10. 21:20
300x250

읽기 쓰기가 가능한 Character Device 모듈 구현


내용 : 리눅스 커널 2.6.36 버전에서 간단한 character device와 그 device driver를 만드는 커널 모듈을 제작한다.

1. 루트 권한을 획득한다.

2. 홈 디렉터리 밑에 module 이라는 디렉터리를 생성하고 그 디렉토리로 이동한다.

3. #yum install -y module-init-tools를 수행한다.

4. #cp minibuf.c minibuf2.c를 수행한다.

5. vi minibuf2.c를 수행하여 기존 코드의 device_write() 함수 내부를 아래와 같이 작성한다.

#define DEV_MAJOR 254 #define DEV_MINOR 6 ssize_t device_write(struct file *filp, const char *buffer, size_t length, loff_t *offset) {     int count = 0;     if(is_buffer_full()) {         printk(DEVICE_NAME " : Write return Out of Buffer\n");         return -ENOMEM;     }     while(!is_buffer-full() && length > 0) {         write_buffer_char((char *)buffer);         ++buffer;         --length;         ++count;     }     filp->f_pos += count;     printk(DEVICE_NAME " : Write %d bytes\n", count);     return count; }


6. #vi Makefile을 수행하여 아래와 같이 코딩한다.
KERNELDIR = /lib/modules/$(shell uname -r)/build

obj-m = minibuf2.o

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
    rm -rf  *.ko
    rm -rf  *.mod.*
    rm -rf  .*.cmd
    rm -rf  *.o


7. #make를 수행하여 커널 모듈을 생성한다.


8. #/sbin/insmod minibuf2.ko를 수행하여 모듈을 로드시킨다.


9. #/sbin/lsmod를 수행하여 로드된 모듈을 확인한다.


10. #mknod /dev/minibuf2 c 254 6 를 수행하여 가상 디바이스를 생성한다.


11. #cat /dev/minibuf2 를 수행하여 가상 디바이스에 저장된 문자열을 읽어 화면에 출력한다.


12. #cat > /dev/minibuf2를 수행하여 아무 문자열이나 입력해본다.

  (입력 후 엔터 입력 후 ctrl+d)

13. 다시 #cat /dev/minibuf2를 수행하여 자신이 입력한 문자열이 읽혀지나 확인한다.


14. #dmesg로 커널 로그를 확인한다.


15. #/sbin/rmmod minibuf2를 수행하여 로드된 모듈을 언로드한다.


16. #rm /dev/minibuf2를 수행하여 가상 디바이스를 삭제한다.


반응형