일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- allocator
- devicedriver
- Network
- page
- BLOCK
- vm_area_struct
- NDK
- strex
- Android
- vmalloc
- spinlock
- Apache
- kmalloc
- pmap
- 카프카
- Kernel
- memory
- Linux
- slab
- mm_struct
- lruvec
- slub
- blk-mq
- multiqueue
- fastpath
- proc
- slowpath
- kafka
- commit
- buddy_system
- Today
- Total
목록IT (43)
Art of Pr0gr4m
이번 포스트에선 리눅스 커널에서 제공하는 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..
Character Device Driver는 유저 프로세스로부터 직접 (버퍼 캐시 등을 사용하지 않고) 데이터를 읽고 쓰는 디바이스 드라이버다. 이 외에 블록 디바이스, 네트워크 디바이스 드라이버는 추후 포스팅 예정 리눅스는 VFS를 통해 디바이스를 파일로 다루고 있다 /dev 아래 있는 디바이스 파일(노드)들은 디바이스와 커널 및 응용프로그램간 인터페이스를 제공한다 디바이스의 major number는 디바이스들을 구분하기 위해 사용하며 minor number는 동일한 디바이스가 여러 개 있을 때, 이들을 구분하기 위해 사용한다 1. struct file_operations struct file_oeprations 구조체는 드라이버와 유저 프로세스간의 인터페이스로, 함수 포인터로 선언되어있는 멤버들을 구..
1. Hello 모듈 작성 모듈이 초기화 될 때의 엔트리 포인트를 module_init에 등록, 모듈이 제거 될 때의 엔트리 포인트를 module_eixt에 등록 MODULE_LICENSE에 라이센스 기재 이 후 빌드를 위한 Makefile 작성 make 명령으로 빌드 성공 시 hello.ko 커널 오브젝트가 생성됨 insmod로 모듈 삽입, rmmod로 모듈 제거 2. 모듈 참조 작성한 함수를 외부에 커널 심볼로 공개하기 위해서는 EXPORT_SYMBOL 매크로 사용 참고로 커널 영역에서 공개되는 심볼 리스트는 /proc/kallsyms에서 볼 수 있음 심볼 타입은 링크 참고 이 후 Makefile 오브젝트 목록에 callee.o와 caller.o를 추가하여 빌드하면 callee.ko와 caller.k..