디바이스 드라이버(23)
-
파일 특수 제어 (ioctl) 구현
ioctl이란?유닉스 및 리눅스 시스템에서 디바이스 드라이버와 사용자 공간 프로그램 간의 특별한 입출력 작업을 수행하기 위해 사용되는 시스템 콜 long (*unlocked_ioctl)(file,cmd,arg) : 파일의 특수 제어(ioctl) 동작을 구현 단순 읽기/쓰기 동작 이외의 명령을 디바이스에 전달하고 싶을 때 사용● 일반적으로 디바이스를 설정하거나 설정을 확인하는 동작 기존의 lkm안에 있는 main.c에 추가한 부분이다. #define DEVICE_IOCTL_CLEAR _IO는 리눅스 커널에서 I/O 제어 명령을 정의할 때 사용되는 매크로이다. 여기서 c와 0은 각각 type과 number이다. type은 장치 유형을 나타내는 문자이고 c는 문자형 디바이스를 뜻한다. number는 명령 ..
2024.12.29 -
디바이스 드라이버 개발 (2)
파일 열기/닫기 구현int(*open)(inode,file) : 파일 열기 동작 구현void(*release)(inode,file) : 파일 닫기 동작 구현 inode : 파일에 대한 정보를 명시하는 구조체● i_rdev : 디바이스 노드의 주번호와 부번호를 나타내는 번호 , MAJOR() MINOR() 매크로로 주번호,부번호를 추출 가능 file : open으로 열었을 때 반환되는 fd(file descriptor)의 커널 공간 데이터● f_inode : 파일 정보를 갖고 있는 inode● f_cred : 파일을 열었을 때의 로그인 정보 (사용자 아이디, 그룹 아이디)● f_pos : 현재의 파일 커서 위치● f_mode : open으로 열 때 사용 한 모드 (O_APPEND , O_TRUNC , O_..
2024.12.28 -
디바이스 드라이버 개발 (1)
디바이스 드라이버의 종류● 문자 디바이스 드라이버- 대부분의 디바이스 드라이버가 이에 해당, 구현이 매우 간편● 블록 디바이스 드라이버- 대용량의 데이터를 저장하는 디바이스에 대해 사용● 네트워크 디바이스 드라이버- 외부와 통신을 하며 특히 소켓을 사용하여 통신하는 디바이스에 대해 사용● 버스 디바이스 드라이버- USB나 PCI등 여러 다른 디바이스가 꽂히는 포트 디바이스에 대해 사용- 디바이스를 탐색하고 인식하는 것이 주역할 디바이스 노드디바이스 드라이버를 다루기 위한 특수 파일 모든 디바이스 노드는 고유의 타입, 주번호, 부번호를 가짐● 타입 : 문자형 (c), 블록형 (b)● 주번호 : 디바이스 드라이버를 구분하기 위한 번호 (0~511)● 부번호 : 디바이스를 구분하기 위한 번호 (0~104857..
2024.12.28 -
해시테이블 (Hash Table)
데이터 검색시 걸리는 시간 복잡도를 줄이기 위한 자료구조 DEFINE_HASHTABLE(name) : 해시테이블 선언 hash_add(table,new,key) : 새로운 노드 추가 hash_del(target) : 해당 노드를 해시테이블에서 제거 hash_for_each_possible(table,node,member,key) {...} : key에 해당하는 해시테이블 순회 hash_for_each(table,bkt,node,hash) : 모든 노드를 순회 buffer 구조체를 설정해준다. buffer 구조체 안에는 실질적인 data값과 data값을 특정할 수 있는 key값과 node가 들어간다.DEFINE_HASHTABLE 명령어를 통해 해시테이블을 구축하는데 크기는 2의 제곱인 4이다. add_..
2024.12.23 -
커널의 기본 API 익히기
메모리 관련 함수copy_from_user(to,from,size) : 사용자 공간에서 커널 공간으로 메모리를 복사할 때 사용copy_to_user(to,from,size) : 커널 공간에서 사용자 공간으로 메모리를 복사할 때 사용● 커널에서 직접적으로 사용자 공간을 접근하지 못하도록 막혀있음● 커널의 데이터가 사용자 공간으로 유출되는 보안상 취약점이 많이 발생했기 때문● 반환 값 : 복사 실패한 byte 수 kmalloc(size,type), kzalloc(size,type) : 커널 공간에서 메모리 동적 할당● kzalloc은 0으로 초기화하는 기능까지 있음● type은 GFP_KERNEL을 사용하는 것이 일반적 ● GFP_KERNEL : 메모리 확보할 때까지 대기 ●..
2024.12.23 -
커널 모듈 만들기
로드 가능한 커널 모듈(Loadable Kernel Module, LKM)이란?운영 체제 커널의 기능을 동적으로 확장하거나 수정하기 위해 사용되는 소프트웨어 모듈.LKM은 커널이 실행 중인 상태에서 시스템에 로드(추가)하거나 언로드(제거)할 수 있는 모듈로 재부팅 없이 커널의 기능을 추가하거나 수정할 수 있게 해준다. 커널 설정 문법menu ~ endmenu : 설정 메뉴 추가config : Makefile과 코드에서 사용할 이름을 지정tristate : 3가지 설정값(Y/N/M)을 가짐 (Y는 커널에 포함, N은 미포함, M은 모듈로 빌드를 의미)bool : 2가지 설정값(Y/N)을 가짐default : 별도로 설정하지 않았을 때 사용할 값help : Help로 봤을 때 보이는 상세한 설명 새로..
2024.12.19