커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치...

21
하하하하 4 하하 하하 하하 200924497 하하하 201224540 하하하 하하 하하 하하하하하하 하하 하하하하 하하하하 하하 하하하 I/O 하하 하하하하

Transcript of 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치...

Page 1: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

하드웨어 4 주차 실험 발표

200924497 이상호201224540 조용래

커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 I/O 장치 제어하기

Page 2: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 공간 vs 사용자 공간

디바이스 드라이버 소개

커널 모듈 프로그래밍

mmap 과의 차이 ?

예제코드 분석

이번 실습에 도움되는 리눅스 \APIQ&A

순서

실습

Page 3: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 공간 vs 사용자 공간

Page 4: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

디바이스 드라이버

01 리눅스는 모든 것을 파일로 다룸 . 디바이스도 파일 형태로 입출력 인터페이스 제공 .

하드웨어 관리는 커널 공간에서 이루어지기 때문에 사용자 공간에서 돌아가는 프로그램이 하드웨어에 접근하기 위해서는 커널에 요청을 해야함 . 사용자 프로세스가 하드웨어 자원을 독점하는 것이 아닌 이상 커널을 통하여 접근하는 것이 좋음 .02

사용자에게 디바이스를 제어하기 위해 커널이 제공하는 인터페이스를 디바이스 드라이버라 부름 . 커널 모듈에 속함 . 디바이스의 특성에 따라 , 문자 , 블럭 , 네트워크 디바이스 드라이버로 유형을 나눔 .03

리눅스 상의 각각의 디바이스 드라이버는 주번호 (Major), 부번호 (Minor) 로 구분 04

개요

Page 5: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

디바이스 드라이버리눅스에 연결된 디바이스 확인 방법

1 cat /proc/devices 2 ls –l /dev

Page 6: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

디바이스 드라이버리눅스에 설치된 디바이스 드라이버 ( 모듈 형태 )

3 cat /proc/modules 4 lsmod

Page 7: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 모듈 프로그래밍커널 모듈 ?

단일형 커널 vs 모듈형 커널 - 단일형 커널 (monolithic kernel) 은 커널의 다양한 서비스 및 높은 수준의 하드웨어 추상화를 하나의 주소공간 으로 묶은 것이다 . 유지보수가 어려우나 성능이 좋다 .

- 모듈형 커널 (modular kernel) 은 커널 모듈이 필요할때는 커널 이미지에 합류하고 필요하지 않을 때에는 커널에서 빠져나와 모듈 형태로 존재하므로 시스템의 메모리를 절약할 수 있다 .

Page 8: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 모듈 프로그래밍

insmod : 모듈추가 , 커널 디렉토리를 찾아서 해당 모듈을 추가시킨다 .

rmmod : 모듈삭제 .

depmod : 의존성 검사를 한뒤 modules.dep 파일을 갱신한다 .

modprobe : 모듈 추가 . depmod 에 의해 갱신된 modules.dep 에서 찾아 추가한다 . insmod 와 달리 해당 커널 디렉토리로 갈 필요없이 아무위치에서나 모듈을 추가할수 있다 .

Page 9: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 모듈 프로그래밍모듈 프로그램 내부 구조

Module_init( 함수포인터 ) : 모듈이 커널에 적재될 때 호출되는 시작 ( 초기화 ) 함수 . 시작할 때 register_chrdev( 주번호 , 이름 , 파일 연산 ) 를 호출하여 장치를 등록함 .

Module_exit( 함수포인터 ) : 모듈을 커널에서 제거하는 함수 . Unregister_chrdev() 함수로 등록된 디바이스 드라이버를 제거

Page 10: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 모듈 프로그래밍모듈 프로그램 내부 구조

mknod 로 노드 만들 때 사용될 번호

디바이스의 물리주소를 직접 접근 불가능하기 때문에 가상 주소로 매핑하는 것이 필요함

Page 11: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 모듈 프로그래밍모듈 프로그램 내부 구조 Ioremap 은 물리주소를 받아 커널 가상주소로 매핑 . 주로 디바이스의 메로리를 커널 주소 공간으로 매핑시키는 데 쓰임 .

Page 12: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 모듈 프로그래밍모듈 프로그램 내부 구조

사용자 공간에서 실행 중인 프로그램의 자료인 buf 를 커널 공간에서 관리하는 디바이스로 쓸 때 바로 못 쓰고 커널 공간에 복사한 뒤 , 커널이 대신 써줌

Page 13: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

커널 모듈 프로그래밍모듈 프로그램 내부 구조

Page 14: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

mmap 과의 차이 ?

사용자프로그램 메모리 디바이스

사용자프로그램 커널 메모리 디바이스System call 호출 ioremap

mmap 메모리에 있는 레지스터 값 반영

메모리에 있는 레지스터 값 반영

Page 15: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

mmap 과의 차이 ?디바이스 드라이버 (ioremap) vs mmap

High

Low(0x00000000) 메모리의 물리 주소

커널 공간

사용자 공간mmap

ioremap

Page 16: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

실습

1. application_peri 의 device driver 폴더에 각 디바이스 드라이버의 커널 모듈 파일들 , 예제 코드와 make 파일이 있다 .2. 실습에서 사용할 디바이스 드라이버 ( 키패드 , 부저 , textlcd, segment) 폴더에 들어가서 Makefile파일의 KDIR 을 linux-2.6.32-hanback 이 있는 경로로 지정해준다 .3. 이후 make 를 입력하여 커널 모듈을 컴파일 한다 .( 각기 다른 디바이스 드라이버 폴더마다 반복 )

5. insmod 모듈이름 .ko 를 입력하여 모듈을 커널에 로드한다 .

4. mknod /dev/ 모듈이름 c 주번호 0 : 주번호 (major number) 는로 dev 폴더에 주번호 부번호 0인 모듈이름의 장치 파일을 생성

6. lsmod 를 입력하여 적재된 모듈을 출력한다 . 적재된 모듈을 제거하고 싶으면 rmmod 모듈이름 을 사용한다 .

Page 17: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

예제 코드 분석Seg_test.c

Page 18: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

예제 코드 분석Segment.c

Page 19: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

이번 실습에 도움이 될 리눅스 API시간 계산 , 텍스트 lcd 띄우기 , 세그먼트 띄우기 , 키패드 입력 등등 여러 태스크를 동시에 수행하는 것이 효율적일 경우 멀티 스레드 사용thread 생성

thread 취소

Page 20: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

이번 실습에 도움이 될 리눅스 APIgmtime

Page 21: 커널 모듈 프로그래밍을 통한 디바이스 드라이버 제작 원리와 IO 장치 제어하기

Q&A