https://github.com/Jminu/linux/blob/master/drivers/char/mem.c
linux/drivers/char/mem.c at master · Jminu/linux
Linux kernel source tree. Contribute to Jminu/linux development by creating an account on GitHub.
github.com
일단 mem.c의 코드를 보면
그렇게 엄청나게 길지는 않다.
그리고 구현이 가장 쉬운 문자 디바이스 드라이버라 분석이 그렇게 까다롭지 않을 것 같다.
일단 마지막 부분에 보이는 코드를 보자
fs_initcall은 모듈을 시작하는 함수이다.
fs_initcall을 좀 더 들어가보자.
grep으로 긁었더니,
이렇게 나오고, fs_initcall은 include/linux/module.h의 119번에 정의되어있는 것을 알 수 있다.
들어가서 확인해보자.
결국 module_init을 호출한다.
더 들어가면 결국 module_init은 커널 모듈을 시작하는 함수라고 생각하면 된다.
그러면 다시 돌아가서,
fs_initcall(chr_dev_init)으로 chr_dev_init모듈을 시작한다.
chr_dev_init의 흐름만 살펴보면,
- register_chrdev
- device_create
만 보면되는데,
register_chrdev는 결국 __register_chrdev를 호출하는 것을 할 수 있고,
결국 캐릭터 디바이스 드라이버를 커널에 등록하는 함수이다.
여기에 정의되어있고,
내부를 들어가보면, 동적으로 디바이스를 생성한다. 라고 되어있다.
즉, 장치파일 생성이라고 보면된다.
여기까지 보면, register_chrdev로 디바이스 드라이버등록, device_create장치파일 생성
큰 그림은 이렇다.
여기서 방금전의 chr_dev_init함수의 내용을 잠깐 살펴보자.
드라이버 등록시 인자로, memory_fops함수의 주소를 전달해줬다.
즉, 등록한 장치에 파일 접근이 발생시 일반적인 file operation대신에 우리가 따로 정의한 memory_fops가 실행된다는 의미이다.
memory_fops를 살펴보자.
등록한 장치에 파일 open이 발생하면, memory_open이 실행된다. 라고 나와있다.
그러면 또 memory_open함수를 찾아보자.
여기서 file operation의 변경이 일어난다.
devlist에서 디바이스 번호를 가져오고 dev에 저장한다.
해당 디바이스(dev)의 fops를 filp->f_op에 저장하므로써
파일 오퍼레이션을 변경한다.
dev는 memdev 구조체의 포인터인데,
memdev를 봐보자.
이 코드에서 보이듯
만약, 5번 장치(zero)에 open이 발생한다면,
zero_fops를 사용하는것을 볼 수 있다.
즉, 메모리를 일종의 파일처럼 다루는데 5번 장치에 open이 발생하면
파일 오퍼레이션을 zero_fops로 변경한다고 볼 수 있다.
그러면 zero_fops를 봐보자.
일단 write부분만 분석하기로 하자.
이 zero_fops를 보면
write발생시에 write_zero를 실행한다고 되어있다.
그러면 또 write_zero를 살펴보자
write_zero는 write_null로 정의되어있고
write_null을 보면
이렇게 되어있다.
이 함수를 보면 아무행동도 하지않는데, 단순히 return count라는 리턴문만 있을 뿐이다.
즉, 받을 데이터를 메모리에서 실제로 읽거나 처리하지 않고 바로 count를 반환한다.
드라이버를 전체적으로 요약하면
만약 zero디바이스 (5번 디바이스)에 write이 발생하면, file operation의 교체로 인해
결국엔 write_null이 실행되고, 이 함수는 count값을 통해 데이터가 성공적으로 쓰여졌다.!라고만 말하고
아무런 행동을 하지 않는다.
'Linux' 카테고리의 다른 글
프로세스 생성 분석 fork(콜 스택) - 1 (4) | 2025.09.28 |
---|---|
커널에서 static inline 함수선언과 wrapping (0) | 2025.09.20 |
objdump활용 vmlinux 분석시 start address의미 (0) | 2025.09.11 |
디바이스 드라이버 (0) | 2025.08.01 |
커널 모듈 (insmod, lsmod, rmmod) 커널 API (5) | 2025.07.30 |