Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


[리눅스커널] 가상파일시스템/소개: 함수 오퍼레이션이란 무엇인가 13. Virtual Filesystem

이번 절에서 소개했듯이, 각각 파일 시스템에 액세스를 하기 위해서 먼저 가상 파일시스템에 접근합니다. 이 때 가상 파일 시스템에서 지원하는 4가지 객체에서 지정한 함수 포인터를 통해 파일 시스템 세부 함수에 접근합니다.  

    4개 객체별로 지정한 함수 포인터 연산을 함수 오퍼레이션이라고 말합니다.
   
즉, 이전 소절에서 소개한 슈퍼블록, 아이노드, 파일, 덴트리 객체들은 모두 함수 오퍼레이션(연산)을 지원합니다.  

슈퍼 블록 함수 오퍼레이션 코드와 동작 파악해보기

먼저 슈퍼 블록 함수 오퍼레이션 코드 분석으로 함수 오퍼레이션 동작을 소개합니다. 다음 코드를 같이 분석해봅시다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/fs/inode.c]
1 static struct inode *alloc_inode(struct super_block *sb)
2 {
3 struct inode *inode;
4
5 if (sb->s_op->alloc_inode)
6 inode = sb->s_op->alloc_inode(sb);

5번째 줄을 보면 if 문으로 sb->s_op->alloc_inode 필드가 NULL이 아닌지 점검합니다.

왼쪽 변수 순서부터 그 의미를 살펴보겠습니다.

*sb 는 포인터형 변수이고 구조체는 struct super_block입니다. struct super_block 구조체 필드인 s_op란 필드에 접근을 합니다. 

struct super_block 구조체 선언부를 같이 보면서 s_op 필드의 의미를 살펴봅시다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/fs.h]
1 struct super_block {
2 struct list_head s_list;
...
3 const struct super_operations *s_op;

3번째 줄을 보면 struct super_operations 구조체로 정의된 *s_op란 필드가 보입니다.

    이를 파일시스템별 함수 오퍼레이션이라고 말합니다.

struct super_operations 구조체를 보면서 함수 오퍼레이션의 의미를 확인해 보겠습니다. 

struct super_operations 구조체를 보면서 함수 오퍼레이션의 의미를 확인해 보겠습니다. 
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/fs.h]
1 struct super_operations {
2    struct inode *(*alloc_inode)(struct super_block *sb);
3 void (*destroy_inode)(struct inode *);
4
5 void (*dirty_inode) (struct inode *, int flags);
6 int (*write_inode) (struct inode *, struct writeback_control *wbc);
...

struct super_operations 필드들은 모두 함수 포인터 연산을 위해 함수 주소를 저장하고 있습니다. struct super_block 구조체에서 struct super_operations 구조체 필드까지 알아봤으니 6번째 줄 코드의 의미를 알아볼 차례입니다.

다시 파일시스템 함수 오퍼레이션 코드 분석으로 되돌아 가겠습니다.
5 if (sb->s_op->alloc_inode)
6 inode = sb->s_op->alloc_inode(sb);

6번째 줄 코드를 실행하면 struct super_operations 구조체 필드인 alloc_inode가 저장한 함수 주소를 호출합니다. ext4 파일시스템인 경우 ext4_alloc_inode() 함수를 실행하고 proc 파일시스템은 proc_alloc_inode() 함수를 호출합니다.

그 이유는 무엇일까요? 각 파일시스템별로 alloc_inode 필드에 서로 다른 함수 즉 ext4_alloc_inode() 함수와 proc_alloc_inode() 함수를 지정했기 때문입니다.


alloc_inode() 함수는 어떤 동작을 수행할까요? 

    파일을 생성할 때 파일에 해당하는 아이노드를 생성한다.

그런데 파일시스템 종류별로 아이노드를 생성하는 방식이 다릅니다. 그래서 함수 포인터를 이용해 각 파일시스템 별로 아이노드를 생성하는 함수를 호출하는 것입니다.


이렇게 가상 파일시스템은 파일시스템 계층 위에서 파일시스템별로 등록된 함수를 실행시키는 역할을 수행합니다. 그래서 가상 파일시스템 커널 함수에서 함수 포인터 연산이 많습니다.

여기까지 슈퍼블록 객체의 함수 오퍼레이션을 예를 들어서 설명을 드렸습니다. 

가상 파일시스템 객체 별 함수 오퍼레이션 소개하기

이렇게 각 객체별로 다음 구조체를 활용해 함수 오퍼레이션을 처리합니다. 각 객체별 함수 오퍼레이션 구조체는 다음과 같습니다.
종류 속성
struct super_operations 특정 파일시스템별로 호출하는 함수
struct inode_operations 특정 파일에 대해 커널이 호출하는 함수
struct file_operations 오픈한 파일에 대해 프로세스가 호출하는 함수
struct dentry_operations 특정 디렉토리 항목에 대해 호출하는 함수

이렇게 가상 파일 시스템을 구현하기 위해 쓰는 4개의 객체들은 가상 파일시스템에서 지원하는 API와 연관이 돼 있습니다. 따라서 자료구조와 세부 동작을 잘 알 필요가 있습니다.


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


Reference(가상 파일시스템)

가상 파일시스템 소개
파일 객체
파일 객체 함수 오퍼레이션 동작
프로세스는 파일객체 자료구조를 어떻게 관리할까?
슈퍼블록 객체
아이노드 객체
덴트리 객체
가상 파일시스템 디버깅




핑백

덧글

댓글 입력 영역