일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Linux
- commit
- pmap
- fastpath
- Apache
- devicedriver
- buddy_system
- strex
- allocator
- vm_area_struct
- multiqueue
- memory
- proc
- BLOCK
- vmalloc
- kafka
- slub
- 카프카
- lruvec
- spinlock
- mm_struct
- Network
- NDK
- slowpath
- slab
- page
- kmalloc
- blk-mq
- Kernel
- Android
- Today
- Total
목록devicedriver (5)
Art of Pr0gr4m
이번 포스트에선 저번 포스트에 이어 Block Device Driver의 예제를 작성해본다. 블록 디바이스 드라이버는 문자 디바이스 드라이버에 비해 복잡한 만큼 새로운 기반 개념들이 많이 등장했고, 이에 따른 드라이버 작성을 위한 인터페이스에 변화가 컸다. 사실 문자 디바이스 드라이버의 경우엔 인터넷에 떠돌아다니는 2.6버전 예제 아무거나 가져다 빌드 에러 메시지 보면서 대충 고치면 어찌저찌 동작하게 만들 수 있다. 반면 블록 디바이스 드라이버의 경우엔 (램디스크가 가장 대표적이다) 2.6 버전의 자료를 보고 공부하고 예제를 작성하면 어찌 되는게 없을 것이다. 아무리 고치려 해도 처음부터 싹 갈아엎어야 하는 대공사가 필요하다. 이게 어느정도냐면 비교적 최신 버전의 커널에 대한 다큐먼트 프로젝트 페이지를 ..
블록 디바이스 드라이버는 Block 단위(사실은 세그먼트 단위)로 입출력을 하는 디바이스 드라이버다. 문자 디바이스 드라이버와의 가장 큰 차이는 Random Access 가능 여부다. Random Access가 가능한 HDD, SSD 등을 제어하기 위해 사용한다. 단순히 데이터 스트림을 처리하는 문자 디바이스 드라이버와 다르게 제어해야할 범위도 넓고 성능 개선도 신경을 써야하기 때문에 기반에 깔린 개념들이 꽤나 복잡하다. 따라서 해당 포스트에서는 기반 개념들을 간단히 정리하고, 실제 디바이스 드라이버 예제는 다음 포스트에서 작성하기로 한다. 1. LBA LBA는 Logical Block Addressing의 약자로 모든 블록을 선형적으로 다루는 모드이다. 참고로 섹터는 디스크상 저장 기본 Unit이고 블..
이번 포스트에선 리눅스 커널에서 제공하는 CryptoAPI를 이용한 문자 디바이스 드라이버를 작성한다 1. CryptoAPI 리눅스 커널에서 제공하는 암호화 관련 인터페이스를 CryptoAPI라고 한다 include/crypto 디렉토리 하위의 헤더 파일을 인클루드하여 사용할 수 있다 커널 2.6 버전에서는 대부분의 암호화 알고리즘을 비슷한 인터페이스로 이용했는데 현재는 지원 대상도 다양해지고 기능도 많아져서 꽤나 복잡해졌다 해당 포스트는 CryptoAPI 자체에 대해 집중하기보단, CryptoAPI를 사용하는 문자 디바이스 드라이버 작성이 주이기 때문에 자세한 내용은 다음 링크(Crypto API, Crypto Architecture)에 맡기고 사용하기 쉬운 MD5 해쉬 알고리즘으로 예제를 작성한다 2..
ioctl은 스트림 디바이스를 다루기 위한 확장이었다 현재는 기능이 더욱 확장되어 vfs상의 파일(하드웨어, 파일 등)을 제어하기 위한 오퍼레이션이 되었다 ioctl에 대한 더 자세한 정보는 다음 링크를 참고하며, 매뉴얼은 다음 링크를 참고한다 1. IOCTL 구조 ioctl의 인자로 전달되는 request는 커널 내부의 cmd로 전달되며, 기타 인자들은 arg로 전달된다 시스템 호출 절차를 간략화하면 ioctl() -> sys_ioctl() -> dev_ioctl() 이 된다 디바이스 드라이버에서 작성하는 ioctl은 대략 다음과 같다 static long chardev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { switch (cm..