300x250
08. 디바이스 드라이버의
읽기와 쓰기
0. 개요
•개요
•하드웨어의
동작
•동작을
위한 의미있는 데이터를 써야함
•상태를
알기 위해 하드웨어 데이터를 읽어야함
•read,
write, inb, outb, readb, writeb, get_user, put_user 사용법
1. 요구사항
•구현
요구사항
•사용자
메모리 공간과 커널 메모리 공간 사이의 데이터 이동
•처리
조건이 되지 않을 때의 블록 처리
•하드웨어
제어 함수
•여러
프로세스가 동시 접근 했을 때의 경쟁 처리
•인터럽트
서비스 함수와의 경쟁 처리
2. 구현
•read()
•목적
•디바이스에서
발생한 데이터나 상태 정보를 응용에서 읽어가도록 하는 것
•처리
•응용
•read()
함수를
이용해 디바이스 파일에 데이터 읽기를 시도
•커널
•file_operations
구조체의 read필드에
저장된 xxx_read()수행
•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 처리된 데이터 개수;
}
{
if(!(준비된 데이터가 있는가?))
{
if(!(filp -> f_flags & O_NONBLOCK))
{
//블록 모드로 열렸다면 프로세스를 재운다
}
}
//하드웨어에서 데이터를 읽는다.
//inb(), out(), … , readb(), writeb() 이용
//사용자 공간에 데이터를 전달한다.
//copy_to_user, put_user
return 처리된 데이터 개수;
}
3. file 구조체
•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;
•부
번호 처리시 사용
4. I/O 처리
개요
•메모리와
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 버스폭에
따라 사용 함수가 나뉨
•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
계열
프로세서
•하드웨어가
I/O 포트에
연결되어 있지 않고 메모리 공간에 연결되어 있음
•읽기
•readb(),
readw(), readl(), memcpy_fromio()
•쓰기
•writeb(),
writew() writel(), memcpy_toio()
•사용자와
커널의 메모리 매핑
•커널에서
제공하는 함수를 통해 메모리의 데이터를 주고 받음
•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)
반응형
'IT > 디바이스드라이버' 카테고리의 다른 글
22. 블록 디바이스 드라이버 (0) | 2015.11.10 |
---|---|
20. 다중 프로세스 환경의 디바이스 드라이버 (0) | 2015.11.10 |
07. 디바이스 드라이버의 초기화와 종료 (0) | 2015.10.15 |
06. 디바이스의 등록과 해제 (0) | 2015.10.15 |
내용 보충(ioctl, mmap, fsync&flush) (0) | 2015.10.15 |