리눅스 · 1 min read · Dec 06, 2025

리눅스 커널 공간에서 파일 읽기 (모듈/드라이버) (페도라 14)

리눅스 커널 공간에서 파일 읽기 (모듈/드라이버) (페도라 14)

사용자 공간과 통신하는 작업은 정말로 권장되지 않는 것 같습니다. 그리고 저는 그에 대해 논쟁하지 않습니다. 하지만 그렇다고 해서 그것이 불가능하다는 의미는 아닙니다. 드라이버는 HDD에만 저장될 수 있는 구성을 로드합니다. MS 윈도우 XP가 부팅될 때 블루투스를 끄면 전원이 켜지지 않도록 기억하는 반면, 최신 리눅스(현재 작성 시점의 페도라 14)에서는 많은 드라이버에서 이러한 기능이 구현되지 않았습니다. 개발자가 procfs 또는 문자 장치를 사용할 때는 실제로 파일에서 특정 장치로 정보를 전송하는 다른 소프트웨어나 스크립트가 부팅 시퀀스에 있어야 합니다.

인터넷을 살펴본 후, 파일을 읽는 모듈을 작성하는 데 성공했습니다. 그리고 여기 있습니다:

#include   // 모든 모듈에 필요
#include   // KERN_INFO에 필요
#include       // filp에 필요
#include    // 세그먼트 설명자에 필요

int init_module(void)
{
    // 변수 생성
    struct file *f;
    char buf[128];
    mm_segment_t fs;
    int i;
    // 버퍼를 0으로 초기화
    for(i=0;i<128;i++)
        buf[i] = 0;
    // 모듈이 작동 중임을 /var/log/messages에서 보기 위해
    printk(KERN_INFO "내 모듈이 로드되었습니다\n");
    // 나는 페도라를 사용하고 테스트를 위해 다음 파일을 선택했습니다
    // 분명히 128바이트보다 훨씬 작지만, 상관없습니다 =)
    f = filp_open("/etc/fedora-release", O_RDONLY, 0);
    if(f == NULL)
        printk(KERN_ALERT "filp_open 오류!!.\n");
    else{
        // 현재 세그먼트 설명자 가져오기
        fs = get_fs();
        // 커널 공간과 관련된 세그먼트 설명자 설정
        set_fs(get_ds());
        // 파일 읽기
        f->f_op->read(f, buf, 128, &f->f_pos);
        // 세그먼트 설명자 복원
        set_fs(fs);
        // 파일에서 읽은 내용 보기
        printk(KERN_INFO "buf:%s\n",buf);
    }
    filp_close(f,NULL);
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "내 모듈이 언로드되었습니다\n");
}

/etc/fedora-release 파일을 읽는 데 필요한 모든 것입니다. 만약 소스가 module.c로 저장된다면, Makefile에 다음이 필요합니다:

obj-m += module.o


all:

    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

다음 명령을 실행합니다:

$ make

$ su

# insmod module.ko

그런 다음 /var/log/messages의 끝에서 다음을 봅니다:

Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] 내 모듈이 로드되었습니다

Dec 11 13:06:11 thinkpad kernel: [ 2410.431993] buf:페도라 릴리스 14 (Laughlin)

Dec 11 13:06:11 thinkpad kernel: [ 2410.431995]

추가적인 새 줄은 파일에서 온 것일 수 있습니다. 하지만 이게 바로 그 파일에 있는 내용입니다!!!

쓰기 함수도 있는 것처럼 보이므로, 누군가 커널 공간에서 파일로 무언가를 쓰고 싶다면 – 기능이 거의 준비되어 있습니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.