Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

130199
1107
135858


[리눅스커널] 가상파일시스템: 파일시스템별 파일 함수 오퍼레이션 처리 과정 - p 13. 가상 파일 시스템

지금까지 ext4 파일 시스템에서 파일을 오픈할 때 함수 실행 흐름을 살펴봤습니다.
이번에는 proc과 sysfs 파일 시스템에서 관리하는 파일을 오픈할 때 어떤 함수가 호출되는지 살펴보겠습니다.  

proc 파일시스템 함수 오퍼레이션 동작 확인하기
먼저 리눅스 시스템 상태 정보를 출력해주는 proc 파일시스템 함수 오퍼레이션 동작을 알아봅시다.

그러면 proc 파일시스템 함수 오퍼레이션 동작을 확인하려면 어떻게 해야 할까요? 방법은 간단합니다. 다음 파일을 열면 됩니다.
root@raspberrypi:/proc # cat kmsg 

위 파일을 읽을 때 가상 파일시스템 관점으로 어떻게 동작할까요?
 
  [그림 13.4] proc 파일 시스템에서 open 함수 오퍼레이션 실행 흐름도

do_dentry_open() 함수에서 이번에는 proc_reg_open() 함수를 호출합니다.

이전 소절에서 배운 바와 같이  /home/pi/sample_text.text 파일을 열 때는 do_dentry_open() 함수에서 ext4_file_open() 함수를 호출했습니다. 이는 가상 파일시스템에서 sample_text.text 파일은 ext4 파일시스템에서 관리한다는 사실을 알고 있기 때문입니다.

do_dentry_open() 함수 코드를 보면서 처리 과정을 살펴봅시다.
[https://elixir.bootlin.com/linux/v4.19.30/source/fs/open.c]
1 static int do_dentry_open(struct file *f,
2   struct inode *inode,
3   int (*open)(struct inode *, struct file *),
4   const struct cred *cred)
5 {
...
6 if (!open)
7 open = f->f_op->open;
8 if (open) {
9 error = open(inode, f);

9번째 줄 코드에서는 proc_reg_open() 함수를 호출합니다. 이 이유는 무엇일까요?

가상 파일시스템에서 파일 위치에 따라 파일시스템 종류를 식별해서 파일시스템 별 함수 테이블을 로딩하기 때문입니다. proc 파일 시스템의 경우 파일을 열 때 proc_reg_open() 함수를 실행해서 파일 오픈을 실행합니다.

이번에는 /proc/kmsg 파일을 열고 읽을 때 동작을 확인하겠습니다. 
 
[그림 13.5] proc 파일시스템 파일 읽기와 쓰기 함수 오퍼레이션 흐름도

이렇게 /proc/kmsg 파일은 proc 파일시스템에서 관리하는 특수 파일입니다. 가상 파일시스템에서 /proc/kmsg 파일이 proc 파일시스템에서 관리한다는 사실을 파악한 후 proc 파일시스템에서 등록한 파일 오퍼레이션 함수 테이블에 따라 함수를 분기합니다.

sysfs 파일시스템 함수 오퍼레이션 동작 파악하기
이어서 리눅스 시스템에 탑재된 하드웨어 장치 정보를 출력해주는 sysfs 파일시스템 함수 오퍼레이션 동작을 알아봅시다.

다음과 같이 리눅스 커널에서 sysfs 파일시스템에서 관리하는 파일을 하나 열어보겠습니다.
root@raspberrypi:/sys/devices/system/cpu/cpu0/cpufreq# cat cpuinfo_cur_freq 
1200000

위 파일은 CPU 주파수 정보를 출력합니다.


sysfs는 리눅스 커널이 지원하는 장치 드라이버에 대한 정보를 출력하는 가상 파일시스템 중 하나입니다. 디바이스와 하드웨어 장치를 디렉토리 계층 구조로 알려줍니다.


위 파일을 읽을 때 가상 파일시스템 관점으로 어떻게 동작할까요?
 
[그림 13.6] sysfs 파일 시스템 함수 오픈 오퍼레이션 흐름도 

sysfs 파일시스템에서 관리하는 파일을 열 때는 kernfs_fop_open() 함수를 호출해서 파일 오픈을 수행합니다.  

다음 그림은 sysfs 파일시스템에서 파일을 읽고 쓸 때 처리 과정입니다.
 
  [그림 13.7] sysfs 파일시스템 read/write 함수 오퍼레이션 흐름도

파일을 읽을 때는 kernfs_fop_read() 함수, 파일을 쓸 때는 kernfs_fop_write() 함수를 호출합니다.

여기까지 각 파일시스템별로 파일을 오픈하고 읽고 쓸 때 흐름을 살펴봤습니다. 

파일시스템별 파일 오픈 함수 오퍼레이션 실행 흐름 파악하기
이제 가상 파일시스템 관점으로 이제까지 다룬 내용을 정리합시다. 파일을 오픈해서 열고 쓰고 닫을 때 가상 파일시스템 계층에서 각 파일 시스템 별 함수 테이블로 분기를 시킵니다. 이런 동작이 가능한 이유는 가상 파일시스템에서 파일 객체란 struct file 자료 구조가 파일 시스템 별 파일 오픈 및 쓰고 읽기 동작에 대한 관리를 해주기 때문입니다.

다음 그림에서 파일시스템 별로 파일을 오픈할 때 함수 흐름을 볼 수 있습니다.
 
[그림 13.8] 각 파일시스템별 함수 오픈 오퍼레이션 동작 흐름도

어떤 파일을 읽을 때 가상 파일시스템 계층에서는 다음과 같은 동작을 수행합니다.
1. 덴트리 객체로 현재 실행 중인 디렉토리를 관리하는 파일 시스템 점검
2. 파일 종류별 파일 오퍼레이션 로딩
3. 파일을 읽고 쓰는 동작을 수행할 때 파일 시스템 함수 테이블로 분기

소프트웨어 계층 구조 관점으로 가상 파일시스템은 파일시스템 상위에서 파일시스템을 분기하고 인터페이싱 하는 역할을 수행합니다. 이 구조로 소프트웨어 구조를 설계하면 다양한 파일 시스템을 공존해서 실행시킬 수 있습니다.

라즈베리파이에서는 위에서 언급한 ext4, proc, sysfs 파일 시스템 이외에 다른 파일 시스템도 지원합니다. 이 파일시스템에 접근하기 위해서 가상 파일시스템 계층을 거쳐야 하는 것입니다.


라즈베리파이에서 지원하는 파일시스템 종류는 어떻게 파악할 수 있을까요? 다음 경로에 있는 파일을 열면 확인할 수 있습니다.
root@raspberrypi:/proc # cat filesystems 
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
nodev cgroup
nodev cgroup2
nodev tmpfs
nodev devtmpfs
nodev configfs
nodev debugfs
nodev tracefs
nodev sockfs
nodev pipefs
nodev rpc_pipefs
nodev devpts
ext3
ext2
ext4
vfat
msdos
nodev nfs

nodev nfs4
nodev autofs
f2fs
nodev mqueue
fuseblk
nodev fuse
nodev fusectl


가상 파일시스템은 이렇게 파일시스템별 함수 테이블을 로딩해서 동적으로 파일시스템이 관리하는 함수를 호출하는 역할을 수행합니다. 그래서 가상 파일시스템에서는 함수 포인터로 각 파일시스템별로 등록된 함수를 호출하는 패턴이 많습니다. 위에서 알아봤던 open(), write() 그리고 read() 함수는 함수 포인터로 각 파일 열고 닫기 동작을 수행합니다. 

다음 소절에서는 파일 객체를 실행할 때 호출하는 open(), read()와 write() 함수에 대해서 알아보겠습니다.


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

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


Reference(가상 파일시스템)

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



핑백

덧글

댓글 입력 영역