1 / 14

인턴사원 주간 OJT 실습발표 임베디드 시스템의 구성 / 역할 리눅스 디바이스 드라이버 작성 실습

인턴사원 주간 OJT 실습발표 임베디드 시스템의 구성 / 역할 리눅스 디바이스 드라이버 작성 실습. SW 팀 김정섭. 발 표 목 록 부트로더 루트 파일시스템 커 널 디바이스 드라이버 / 작성실습 결 론 / 보완사항 . 부트로더. 부트로더 란 운영 체제가 시동되기 이전에 미리 실행되면서 커널이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 운영체제를 시동시키기 위한 목적 을 가진 프로그램을 말한다 .

rico
Download Presentation

인턴사원 주간 OJT 실습발표 임베디드 시스템의 구성 / 역할 리눅스 디바이스 드라이버 작성 실습

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 인턴사원 주간 OJT 실습발표임베디드 시스템의 구성 / 역할리눅스 디바이스 드라이버 작성 실습 SW팀김정섭

  2. 발 표 목 록 부트로더 루트 파일시스템 커 널 디바이스 드라이버 / 작성실습 결 론/ 보완사항

  3. 부트로더 부트로더란 운영 체제가 시동되기 이전에 미리 실행되면서 커널이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 운영체제를 시동시키기 위한 목적을 가진 프로그램을 말한다. 하드디스크의 첫 번째 섹터인 마스터 부트 섹터(Master Boot Sector, MBR)에 위치하여 임베디드 보드에 전원입력시 제일먼저 동작하여, 1. 하드웨어를 초기화 시켜주고 2. 커널을메모리에 적재 ==(플래시메모리에 있는 커널을 휘발성 메모리공간에 복사해서) 사용자 명령처리를 준비하는 역할을 한다. 종류 LILO, GRUB, U-boot… U-boot란? Universal Bootloader의 약자로 PPC와 ARM에 기반을 둔 임베디드용 부트로더이다. PPC, ARM, MIPS, SH, x86 등 다양한 CPU를 지원하며, 오픈소스이다.

  4. 루트파일 시스템 리눅스가동작하기 위해서는 운영체제의 핵심인 커널 이외에 루트 파일 시스템(RFS)이라는 것이 추가로 필요하다. 리눅스에서는 ‘/ ’라는 디렉토리에 하드디스크 등의 저장장치를 연결하여 필요한 기능들을 수행할 수 있게 하고 있다. 루트 파일 시스템은 커널이 동작하기 위한 공간, 라이브러리, 유틸리티를 포함 부트로더의역할이 끝나고 커널이 프로세스 제어권을가질때커널이 제일먼저 하는일은init프로세서를 실행하는 것이다. Init프로세서는 램디스크에존재하는 루트파일시스템에 있는 다른 프로세서를 부화 시킨다. 커널이init 프로세스를 동작시키려면 루트 파일시스템에 있는 파일과 라이브러리가 필요하다. 램디스크 램디스크는 별다른 물리적 장치를 지칭하는 것이 아니라, 메모리의 일부분을 디스크 드라이브로 인식시켜 이를 하드디스크처럼 사용하기 위한 것이다. 램디스크를쓰기위해서는마운트 과정이 필요하다. 램디스크마운트 과정 #mkdir-p /tmp/ramdisk0 //램디스크가 위치할 디렉토리(tmp) 생성 후 #mkfs-t ext2 /dev/ram0 //램디스크를 포맷(mkfs)하고 #mount /dev/ram0/tmp/ramdisk0 //램 디스크를 "/tmp/ramdisk0"디렉토리로마운트시킨다.

  5. 커 널 • 커 널 • 프로세서와 시스템 메모리에 상주하면서 디바이스나 메모리같은 하드웨어 자원을 관리하고 프로세스의 스케줄을 관리하여 다중프로세스를 구성하고 시스템에 연결된 입출력을 관리하여 운영체제의 핵심역할을 한다. 현재3.7.5 버전까지 나와있으며 자신이 사용하는 시스템에 최적화 시키고 싶은경우커널 컴파일 옵션 설정을 통해 수정 가능하여 원하는 기능만 뽑아내서 사용할 수 있는 특징이 있다. • 커널의 역할 • 프로세스 관리 • 프로세스의 생성 및 소멸, 프로세스 사이의 통신, 프로세스 스케줄링 • 메모리 관리 • 가상 메모리 관리 기법 제공, 메모리 하드웨어의 효율적 관리 • 파일 시스템 관리 • 가상 파일시스템(VFS, Virtual File System)에 의한 다양한 파일시스템 지원, 파일 및 디렉토리관리 • 디바이스 제어 • 입출력 요청 작업의 검증 및 스케줄링, 주변장치와 메모리간의 데이터 전송 • 네트워크 관리 • 통신 프로토콜 구현, 네트워크 라우팅 및 주소 지정

  6. 디바이스 드라이버 디바이스 네트워크 어댑터,LCD, 디스플레이 등과 같은 H / W 주변장치 디바이스 드라이버 디바이스 관리에 필요한 인터페이스 구현에 요구되는 함수와 자료구조의 집합 응용프로그램이 HW를 제어할 수 있도록 인터페이스 제공 문자 디바이스 드라이버 디바이스를 파일처럼 접근하여 직접 READ WRITE수행 data형태는 stream 방식으로 전송 Ex) 키보드 시리얼포트 드라이버 등 블록디바이스 드라이버 Disk와 같은 파일시스템을 기반으로 block 단위로 데이터의 read / write 수행 ex) hard disk, CD ROM driver, floppy disk 네트워크 디바이스 드라이버 network의 물리계층과 frame 단위의 데이터 송수신 Ex) ethernet device driver

  7. 디바이스 파일 개 요 리눅스는시스템에 있는 모든 자원을 파일 형식으로 표현하는 특성을 지니는데, 응용프로그램이 디바이스 프로그램에 접근을 하여 주번호와부번호를근거로하여커널에 적재된 모듈과의 함수호출을 실행하기 때문에 디바이스 파일없이는 응용프로그램과 디바이스모듈과의 호출이 불가능하다. 디바이스 파일이 가진 정보 디바이스 타입(문자형인지 블록형인지) Major number(주번호) 커널에서디바이스 드라이버를 구분/연결하는데 사용 같은 Device의 종류를 지칭 Minor number(부번호) 디바이스 드라이버 내에서 장치를 구분하기 위해 사용 각 Device의 부가적인 정보를 나타냄 디바이스 파일 생성법 디바이스 파일명 인자를 쓴 후 그 파일의 특수 형태를 알리는 값을 지정해준다. 디바이스 파일명 디바이스 종류 부번호 주번호 #mknod /dev/drive_file_name c 주번호부번호

  8. 모 듈 모 듈 모듈방식은 커널이 부팅되어 동작중인 상황에서 디바이스 드라이버를동적으로 적재, 제거 할수 있는 개념이며 필요없는 모듈을커널에서 제거가 가능하기 때문에 커널자원을 효율적으로 다루게 한다. 디바이스 드라이버소스를 make파일로 컴파일하게되면module_name.ko의 파일이 생성되며 insmod명령어를 통해 커널에 적재할 수 있다. 생성된 모듈을 커널에 로딩 #insmodmodule_name.ko 커널에 적재된 모듈 목록 보기 #lsmod 로딩된 모듈을 커널에서 제거 rmmodmodule_name .ko가 붙지 않음!

  9. 문자 디바이스 드라이버의 흐름도 Insmod명령어를 통해 디바이스 드라이버를 커널에 적재한다. Insmod 디바이스 드라이버 디바이스 드라이버 함수사용을 위해 장치파일에 접근하여 주번호와부번호에대한 정보를 얻는다. Module_init(xxx_init) xxx_init() { register_chdrv(…) }; 장치파일 /dev/calldev 이 정보를 이용하여 chrdevs배열에 등록된 디바이스 드라이버의 인덱스를 얻는다. 응용프로그램 chrdevs[MAX_PROBE_HASH] Structfile_opreations *fops; Structfile_operationsxxx_fop= { open : xxx_open, read : xxx_read, write : xxx_write, ioctl : xxx_ioctl, release : xxx_release, }; // #define DEVICE_FILENAME /dev/calldev Open() Write(…) Ioctl(…) Close(…) 인덱스값으로chrdevs변수에 등록된 file_operations구조체 주소를 얻음 chrdevs배열변수를 참조하고 이 변수 필드에있는fops를 얻고 각각의 함수에 대응하는 필드함수를 호출한다. Module_exit(xxx_exit) xxx_exit() { unregister_chdrv(…) }; rmmod rmmod명령어를 통해 디바이스 드라이버를 커널에서 제거한다.

  10. 모듈을 커널에 적재하고 응용프로그램과 함수호출을 주고받는 예제 • #include <linux/init.h> • #include <linux/module.h> • #include <linux/kernel.h> • #include <linux/fs.h> • #include <linux/errno.h> • #include <linux/types.h> • #include <linux/fcntl.h> • /*디바이스 드라이버 모듈 소스 내에는 main()이 없으며응용프로그램과 커널에 올라간 모듈과의 통신을 위한 함수들의 집합 형태이다.*/ • #define CALL_DEV_NAME "calldev“ //디바이스명 정의 • #define CALL_DEV_MAJOR 240 //메이저 넘버 부여 • intcall_open(structinode *inode, struct file *flip) • { • //응용프로그램에서 open()은 /dev/calldev파일을 열어 주번호를근거로 하여 file operation 구조체에 접근 • intnum = MINOR(inode->i_rdev); //MINOR() : kdev_t에서 minor number를 얻어내는 매크로 • printk("call open -> minor : %d\n",num); //printk()커널상에 출력하는 함수 #dmesg로 볼수있음 • return 0; //정상적이면 0을반환하여 응용프로그램에 전달 • } • loff_tcall_llseek(struct file *flip, loff_t off, int whence) • { • 응용프로그램에서 읽기쓰기 포인터 변경함수lseek(dev, 0x20, SEEK_SET)함수는 커널에서 디바이스 드라이버의 call_llseek() 를 호출한다. 실패시-1 변경된 파일 포인터 값을 반환한다. • printk("call llseek->off:%08X, whence %08X\n",off, whence); • return 0x23; • }

  11. ssize_tcall_read(struct file *flip, char *buf, size_t count, loff_t *f_pos) { // 응용프로그램의 read(dev,0x30,0x31)이 커널을 통하여 디바이스의 call_read()를 호출하게 한다. //실패시 음수, 성공시 처리된 바이트수를 반환 printk("call read->buf : %08X, count : %08X\n",buf,count); return 0x33; //그 결과값을 응용프로그램에 리턴한다. } ssize_tcall_write(struct file *flip, char *buf, size_t count, loff_t *f_pos) { //write() //응용프로그램의 write(dev,0x40,0x41)이 커널을 통하여 디바이스의call_write()를 호출하게 한다. //오류발생시 음수, 성공시 처리된 바이트수 반환 //정상동작시buf에는 read()에서 전달한 0x40이 count에는 read()에서 전달한 0x40이 들어간다. printk("call write -> buf : %08x, count : %08x\n",buf,count); return 0x43; } intcall_ioctl(structinode *inode, struct file *flip, unsigned intcmd, unsigned long arg) { printk("call ioctl -> cmd : %08x, arg : %08x\n",cmd,arg); return 0x53; } intcall_release (structinode *inode, struct file *flip) { //응용프로그램의 close()가 디바이스 드라이버의 release()를 호출하여 디바이스를 닫는다. printk("call release\n"); return 0; }

  12. structfile_operationscall_fops= /*structfile_operations변수선언 파일연산구조체는 char device driver에 대한 모든 연산을 포함한다. 여기에 정의된 함수를 통해서 커널이 접근하게 된다.즉 응용프로그램에서 open함수를 호출하면 이는 driver의 call_open()과 mapping되어있어 이를 실행하게 된다.*/ { .owner = THIS_MODULE, //맵핑 .llseek = call_llseek, .read = call_read, .write = call_write, .unlocked_ioctl = call_ioctl, .open = call_open, .release = call_release, }; intcall_init(void) // register char()을 통해서 커널에 문자디바이스 드라이버를 적재하는 함수 { int result; printk("call call_init\n"); result = register_chrdev(CALL_DEV_MAJOR, CALL_DEV_NAME, &call_fops); if (result<0) return result; return 0; // } void call_exit(void) //unregister_chrdev()를 이용해 커널에 등록된 문자 디바이스 드라이버 제거하는 함수 { printk("call call_exit\n"); unregister_chrdev(CALL_DEV_MAJOR,CALL_DEV_NAME); } module_init(call_init); //insmod로 호출되는 함수,커널에 모듈이 올라가는 결과 module_exit(call_exit); //rmmod로 호출되는 함수,커널에서 모듈이 내려가는 결과 MODULE_LICENSE("Dual BSD/GPL"); //라이센스 명시 커널버전2.6에서는 필수

  13. 실습과정 Makefile 디바이스 드라이버와 응용프로그램과의 함수호출 결과 확인 컴파일 결과로생성될 목적 파일 커널의 소스위치 컴파일 대상 소스파일 위치 컴파일 명령 return value of call_llseek return value of call_read return value of call_write return value of call_ioctl return value of call_release

  14. 결 론 부트로더의역할숙지 루트파일 시스템의 역할과 램디스크의 역할 / 마운트법 응용프로그램과 커널에로드된 모듈과의 함수호출이 가능하기 위한 조건구성 / 실습을 통하여 둘의 상관관계 이해 보완할 사항 C언어 기본기 컴퓨터 자료구조와 하드웨어 이해 커널에대한심도있는 이해

More Related