08. 디바이스 드라이버의 읽기와 쓰기 김진홍 jhkim3624@etri.re.kr 2015.10.11.
목차 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 4. 디바이스 드라이버의 읽기 쓰기 구현 예제
개요 개요 하드웨어의 동작 동작을 위한 의미있는 데이터를 써야함 상태를 알기 위해 하드웨어 데이터를 읽어야함 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 개요 하드웨어의 동작 동작을 위한 의미있는 데이터를 써야함 상태를 알기 위해 하드웨어 데이터를 읽어야함 read, write, inb, outb, readb, writeb, get_user, put_user 사용법
요구사항 구현 요구사항 사용자 메모리 공간과 커널 메모리 공간 사이의 데이터 이동 처리 조건이 되지 않을 때의 블록 처리 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 구현 요구사항 사용자 메모리 공간과 커널 메모리 공간 사이의 데이터 이동 처리 조건이 되지 않을 때의 블록 처리 하드웨어 제어 함수 여러 프로세스가 동시 접근 했을 때의 경쟁 처리 인터럽트 서비스 함수와의 경쟁 처리
구현 read() 목적 처리 디바이스에서 발생한 데이터나 상태 정보를 응용에서 읽어가도록 하는 것 응용 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 read() 목적 디바이스에서 발생한 데이터나 상태 정보를 응용에서 읽어가도록 하는 것 처리 응용 read() 함수를 이용해 디바이스 파일에 데이터 읽기를 시도 커널 file_operations 구조체의 read필드에 저장된 xxx_read()수행
구현 read() 응용계층에서의 open() 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 read() 응용계층에서의 open() fd = open(const char *pathname, int flags); ret = read(int fd, void *buf1, size_t count); ssize_t xxx_read(struct file *filp, char *buf2, size_t count, loff_t *f_pos) { return ret; }
구현 read() 디바이스 드라이버의 open() *buf1 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 read() 디바이스 드라이버의 open() ssize_t xxx_read(struct file *filp, const char *buf, size_t count, loff_t *f_pos) { if(!(준비된 데이터가 있는가?)) { if(!(filp -> f_flags & O_NONBLOCK)) { //블록 모드로 열렸다면 프로세스를 재운다 } } //하드웨어에서 데이터를 읽는다. //inb(), out(), … , readb(), writeb() 이용 //사용자 공간에 데이터를 전달한다. //copy_to_user, put_user return 처리된 데이터 개수; } *buf1 *buf2 copy_to_user() inb(), readb()… 디바이스 메모리 유저 메모리 사용자영역 커널영역
file 구조체 struct file *filp 내용 핵심 필드 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 struct file *filp 내용 디바이스 파일이 어떤 형식으로 열렸는가에 대한 정보 핵심 필드 unsigned int f_flags 응용에서 open(const char *pathname, int flags)했을때 flags에 설정된 값 디바이스 파일을 열었을 때 처리하는 방식을 결정 O_RDONLY : 읽기전용 처리 O_NONBLOCK, O_NDELAY : 블록처리를 하지 않음 O_SYNC : 써넣는 데이터를 반드시 디바이스에 적용함 loff_t f_pos f_pos 필드 변수에 현재 읽기/쓰기 위치를 담음 read()write()llseek()과 같이 파일 포인터를 다루는 디바이스 드라이버에 쓰임 void *private_data 프로세스가 함수간에 메모리를 공유할때 사용.(전역변수 처럼) struct file_operations *f_op; 부 번호 처리시 사용
개요 메모리와 I/O처리의 구분 CPU는 하드웨어를 처리하기 위해 I/O 명령을 내림 I/O명령은 CPU의 종류에 따라 나뉨 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 메모리와 I/O처리의 구분 CPU는 하드웨어를 처리하기 위해 I/O 명령을 내림 I/O명령은 CPU의 종류에 따라 나뉨 메모리를 처리하는 명령과 다르게 다루는 경우 I/O Mapped I/O 인텔 계열 프로세서 in/out이라는 명령이 별도로 존재 동일하게 처리하는 경우 Memory Mapped I/O Arm 계열 프로세서
I/O Mapped 입출력 처리 함수 인텔 계열 처리하고자 하는 시스템의 I/O 버스폭에 따라 사용 함수가 나뉨 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 인텔 계열 처리하고자 하는 시스템의 I/O 버스폭에 따라 사용 함수가 나뉨 b = byte(8 bit) w= word(16 bit) l = long(32 bit) 하드웨어에서 데이터 읽기 inb(), inw(), inl(), insb(), insw(), insl() 하드웨어에 데이터 쓰기 outb(), outw(), outl(), outsb(), outsw(), outsl()
Memory Mapped 입출력 처리 함수 PCI디바이스나 ARM 계열 프로세서 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 PCI디바이스나 ARM 계열 프로세서 하드웨어가 I/O 포트에 연결되어 있지 않고 메모리 공간에 연결되어 있음 읽기 readb(), readw(), readl(), memcpy_fromio() 쓰기 writeb(), writew() writel(), memcpy_toio()
개요 사용자와 커널의 메모리 매핑 커널에서 제공하는 함수를 통해 메모리의 데이터를 주고 받음 1. 읽기와 쓰기의 구현 2. I/O처리 3. 사용자 프로세스 공간과 커널 프로세스 공간 사용자와 커널의 메모리 매핑 커널에서 제공하는 함수를 통해 메모리의 데이터를 주고 받음 verify_area(type, addr, size) copy_to_user(to, from, n) copy_from_user(to, from, n) get_user(x, ptr) put_user(x, ptr)
Qna