linux/drivers/char/mem.c 드라이버 분석

2025. 9. 20. 13:34·Linux

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
'Linux' 카테고리의 다른 글
  • 프로세스 생성 분석 fork(콜 스택) - 1
  • 커널에서 static inline 함수선언과 wrapping
  • objdump활용 vmlinux 분석시 start address의미
  • 디바이스 드라이버
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    memory mapped io
    버퍼
    포인터
    commit
    C++
    arm
    파이썬
    소수
    스택
    백준
    rubik pi
    c언어
    드라이버 분석
    Git
    이진 트리
    Branch
    buildroot
    yolo
    순환
    Qualcomm
    시스템콜
    INIT
    exception vector table
    rubikpi3
    aapcs
    파일 입출력
    커널
    동적메모리
    자료구조
    피보나치
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
linux/drivers/char/mem.c 드라이버 분석
상단으로

티스토리툴바