리눅스 드라이버 실습 #1

40
리리리 리리리리 리리 #1 2015/Jun/1 박박박

Upload: sangho-park

Post on 11-Aug-2015

304 views

Category:

Software


5 download

TRANSCRIPT

Page 1: 리눅스 드라이버 실습 #1

리눅스 드라이버 실습 #12015/Jun/1박상호

Page 2: 리눅스 드라이버 실습 #1

강의내용● 커널이란 ?

o 본 3 주 실습을 위한 간단한 정의● 간단한 C 프로그램

o 파일 reader/writer● 리눅스 디바이스 드라이버

o Character 디바이스 드라이버o echo 디바이스 드라이버

Page 3: 리눅스 드라이버 실습 #1

…커널이란

Page 4: 리눅스 드라이버 실습 #1

운영체제 (Operating System) 의정의http://en.wikipedia.org/wiki/Kernel_(operating_system)

Kernel (operating system)In computing, the kernel is a computer program that manages I/O (input/output) requests from software, and translates them into data processing instructions for the central processing unit and other electronic components of a computer. The kernel is a fundamental part of a modern computer's operating system.[1]

The critical code of the kernel is usually loaded into a protected area of memory, which prevents it from being overwritten by other, less frequently used parts of the operating system or by applications. The kernel performs its tasks, such as executing processes and handling interrupts, in kernel space, whereas everything a user normally does, such as writing text in a text editor or running programs in a GUI (graphical user interface), is done in user space. This separation is made in order to prevent user data and kernel data from interfering with each other and thereby diminishing performance or causing the system to become unstable (and possibly crashing).

When a process makes requests of the kernel, the request is called a system call. Various kernel designs differ in how they manage system calls and resources. For example, a monolithic kernel executes all the operating system instructions in the same address space in order to improve the performance[clarification needed] of the system. A microkernel runs most of the operating system's background processes in user space,[2] to make the operating system more modular and, therefore, easier to maintain.[3]

The kernel's interface is a low-level abstraction layer.

Page 5: 리눅스 드라이버 실습 #1

파일접근C:\Program Files\Internet Explorer\iexplorer.exe 실행하기

Page 6: 리눅스 드라이버 실습 #1

커널이도와주는부분은 ?

커널이 관리하는 것1. C:, D:,... 드라이브 관리 : 드라이브가 어떤 디스크의

파티션에 있는지2. 디렉토리 관리 : 디렉토리 이름과 디렉토리의 내용이

디스크의 어디에 있는지3. 파일 관리 : 파일의 내용이 어디에 있는

Page 7: 리눅스 드라이버 실습 #1

파일접근 ( 커널이없다면 -1)

1. 디스크 1 의 두번째 파티션을 찾아감

Page 8: 리눅스 드라이버 실습 #1

파일접근 ( 커널이없다면 -2)

2. C:\ “에 있는 Program Files” 디렉토리를 검색3. C:\Program Files\ “에 있는 Internet Explorer” 를 검색4. C:\Program Files\Internet Explorer\ “에 있는 iexplorer.exe”

파일을 검색하고 실행

Page 9: 리눅스 드라이버 실습 #1

파일접근 ( 커널이해주는건 ?)

● 디렉토리 관리 : 디렉토리내 파일 정보를 디스크에 저장○ 이름 , 유형 (파일 , 디렉토리 , 기타 )○ 파일 삭제 , 이름 변경

● 파일 관리 : 파일 정보를 디스크에 저장○ 이름 , 유형 , 크기○ 파일 삭제 , 크기 변경

● 커널이 해주는 건 ?○ 자원 (디스크 ) 의 효율적이고 간편한 API 제공

■ system call: system API by kernel

Page 10: 리눅스 드라이버 실습 #1

파일접근

마우스클릭 , 키보드입력

API, System-Call(2)

SCSI commandsData

Data, Action

View, Action

System-Call(2)● 경로 (path) 를통한 human-readable 한

접근지원● 크기 / 개수를신경쓰지않아도되도록지원● 하드디스크 , CD, USB stick 에관계없이

동일한 system-call 로접근가능

Page 11: 리눅스 드라이버 실습 #1

네트워크접근

마우스클릭 , 키보드입력

API, System-Call(2)

PCI/PCIe/USB commandsData

Data, Action

View, Action

System-Call(2)● socket system-call 을통한쉬운 TCP/IP

통신지원● WiFi, Ethernet 에관계없이동일한

system-call 을통해접근가능

Page 12: 리눅스 드라이버 실습 #1

Kernel 의역할

● 자원 (Resource) 관리○ 자원 : CPU, Memory, Storage, Network, Graphic Card, etc

■ S/W 자원도 포함됨 : 응용 프로그램 ID, TCP 포트 등○ 자원들을 여러 응용 프로그램이 공유할 수 있도록 제공

■ 배분 정책● 공정성 : Fairness● 시급성 : Time critical

○ 보안■ 다른 프로그램의 정보가 공유되지 않도록 보호 (virus,

hack)● Abstracted API 제공

○ H/W 특성에 관계없는 일관된 API(System-call) 을 응용 프로그램에 제공

Page 13: 리눅스 드라이버 실습 #1

현존하는 Kernel들

Page 14: 리눅스 드라이버 실습 #1

리눅스● 1991 년 리누스 토발즈에 의해 개발 시작된 UNIX● 가장 성공적인 open source project 중 하나● 리눅스 기반의 운영체제

○ RedHat, OpenSUSE, Debian, Ubuntu○ Android○ Tizen

● http://www.kernel.org● License: GPLv2

Page 15: 리눅스 드라이버 실습 #1

reader/writer 매우 간단한 파일 입출력 C 프로그램

Page 16: 리눅스 드라이버 실습 #1

C 코딩조언● Manual page

o 유닉스 시스템 ( 리눅스 포함 ) 에서의 표준 가이드o man <term> or man <section> <term>o Section

■ 1: Shell command■ 2. System calls■ 3. Library calls■ 4. Special files■ 5. File formats and conventions■ 6. Games■ 7. Miscellaneous (man(7))■ 8. System administration command (only for root)■ 9. Kernel routines [Non standard]

● 정의 : wikipedia.org● 특정 문제의 해결 방법 : google, stackoverflow.com

o Easy come, easy goo 찾은 방법을 자신에게 체화시키길 ..

Page 17: 리눅스 드라이버 실습 #1

reader

● readero 파일 경로를 argument 로 받아o 파일의 내용을 화면에 출력

Page 18: 리눅스 드라이버 실습 #1

writer

● writero 파일 경로를 argument 로 받아o 키보드 입력을 파일에 저장

Page 19: 리눅스 드라이버 실습 #1

Makefile & run

all:cc reader.c -o readercc writer.c -o writer

$ make$ writer /tmp/a1234qwerasdf^C$ reader /tmp/a1234qwerasdf$

Page 20: 리눅스 드라이버 실습 #1

코드흐름

fd = open(argv[1], O_RDONLY);…while ret = read(fd, buf, sizeof(buf)); … ret = write(STDOUT_FILENO, buf, ret)); …close(fd);

reader

fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC);…while ret = read(STDIN_FILENO, buf, sizeof(buf)); … ret = write(fd, buf + i, len - i)); …close(fd);

writer

● STDIN_FILENO: standard input fd● STDOUT_FILENO: standard output fd● Standard input/output

○ Terminal: keyboard & display → Character device in unix system● 파일 접근을 위한 system call

○ open, read, write, close...

Page 21: 리눅스 드라이버 실습 #1

Kernel Module Driver

Page 22: 리눅스 드라이버 실습 #1

우분투에서커널버전확인하기

Page 23: 리눅스 드라이버 실습 #1

커널빌드● 절차

o http://www.kernel.org 에서 소스 다운로드o make menuconfig

■ Kernel configuration■ Kernel 의 각 특성을 잘 알고 있어야 설정 가능

o make■ 3 시간 소요 (in my VirtualBox)

Page 24: 리눅스 드라이버 실습 #1

커널모듈

Page 25: 리눅스 드라이버 실습 #1

모듈코딩

Makefile

# Prerequisite$ uname -r3.13.0-generic$ sudo apt-get install kernel-headers-3.13.0-generic$ ls -l /lib/modules/3.13.0-generic/build

Page 26: 리눅스 드라이버 실습 #1

모듈코딩echo.c

모듈을 위한 최소한의 세트MODULE_LICENSE

init_module: 모듈초기화시 (insmod) 호출cleanup_module: 모듈삭제시 (rmmod) 호출

* printk: 커널용 printf- 앞에 LOG LEVEL 이 붙음

Page 27: 리눅스 드라이버 실습 #1

드라이버관리

$ insmod echo.ko

$ rmmod echo

$ lsmod$ cat /proc/modules…while ret = read(fd, buf, sizeof(buf)); … ret = write(STDOUT_FILENO, buf, ret)); …close(fd);

드라이버 장착

드라이버 제거

드라이버 검색

$ dmesg Kernel 로그

Page 28: 리눅스 드라이버 실습 #1

Echo Driver

Page 29: 리눅스 드라이버 실습 #1

장치유형● 전통적 디바이스 유형

o Block: 디스크■ 특정 offset 의 데이터를 접근할 수 있음

o Character: 시리얼 포트 , 터미널■ 특정 offset 의 개념이 없음

● UNIX 는 장치를 특수 유형의 파일로 관리o /dev/sdao /dev/consoleo Network 디바이스는 예외 : 이단아

$ ls -l /dev

Page 30: 리눅스 드라이버 실습 #1

디바이스드라이버● 디바이스 드라이버

o 디바이스를 이용하기 위한 커널 S/W 모듈● UNIX 에서 장치는 파일 (/dev/XXX)

o 장치를 이용하기 위해서는 드라이버가 필요o 장치와 드라이버를 어떻게 연결할까 ?

■ 장치별로 Major/Minor 번호 부여

● Major 번호를 담당하는 드라이버 연결

Page 31: 리눅스 드라이버 실습 #1

Echo 드라이버● Echo

● Echo 드라이버o 장치에 WRITE 한 것을 READ 할 수 있도록 하는드라이버

o Character device

Page 32: 리눅스 드라이버 실습 #1

드라이버코딩 (1)

Page 33: 리눅스 드라이버 실습 #1

드라이버코딩 (2)

__open(inode, file)● inode: 특정 노드 (파일 ) 을

가리키는 structure● file: inode 를 open 한 뒤 ,

사용할 structure (flag, offset 저장 )

○ fd 는 *file array의index

__read(file, buf, len, off)● file: fd 에 해당하는 file

structure● buf: user argument● len: user argument● off: offset in the file

Page 34: 리눅스 드라이버 실습 #1

드라이버코딩 (3)

__write(file, buf, len, off)● file: fd 에 해당하는 file

structure● buf: user argument● len: user argument● off: offset in the file

__release_(inode, file)● close(fd) 시 불릴 수 있는 함수

Page 35: 리눅스 드라이버 실습 #1

드라이버코딩 (4)

$ make$ sudo insmod echo.ko$ dmesg

$ ls -al /dev/echo$ sudo mknod /dev/echo c 250 0$ ls -al /dev/echo

$ sudo ./writer /dev/echo1234^C$ sudo ./reader /dev/echo1234$

Page 36: 리눅스 드라이버 실습 #1

프로그램실행 Flow

reader/writer

VFS(Virtual File Switch): 디바이스 드라이버 , 파일 시스템의 file_operations 호출

echo driver

open(“/dev/echo”, O_RDONLY)

__open(inode, file)

read(fd, buf, sizeof(buf))

__read(file, buf, len, off)

close(fd)

__release_(inode, file)

Page 37: 리눅스 드라이버 실습 #1

금일정리● 커널 : 자원관리 , H/W Abstraction 제공● Simple C 프로그램● 장치드라이버 : Block/Character● Simple character driver

o open/read/write/release

Page 38: 리눅스 드라이버 실습 #1

숙제● 금일 coding 한드라이버로커널을죽게만들기

[email protected], (due: next lecture)

$ sudo insmod echo.ko$ sudo mknod /dev/echo c 250 0

$ ????

Page 39: 리눅스 드라이버 실습 #1

Exercise #1

● Add log in read/writeo Print file, function name and line number

String: __FILE__ String: __func__ Integer: __LINE__

Page 40: 리눅스 드라이버 실습 #1

Exercise #2

● Add delay in open/read/write/release

#include <linux/delay.h>

… msleep(1000); /* wait for 1000 msecs */…

$ sudo ./writer /dev/echo1234^C$ sudo ./reader /dev/echo1234$