본문 바로가기

나름컴공이라공/Linux Kernel

Linux Kernal Internal > Ch5 파일시스템과 가상 파일시스템(4)

☆★☆2016.01.15 작성☆★☆
☆★☆참고책 _리눅스 커널 내부구조(저자_백승재, 최종무)☆★☆

 

7. 가상 파일시스템(Virtual File System)

-> 만약 가상 파일시스템이 없으면, 여러 가지 파일시스템의 파일을 읽고 쓰기 위해 각 파일시스템이 제공하는 함수를 찾아서 호출해야함

 

<가상적인 계층 도입>

* 가상 파일시스템(VFS) 접근 방법

- 상위 계층에서 단일 함수를 통해 파일시스템이 접근하기 위해 인자에 담긴 파일이름과 파일시스템을 판단하여 고유의 함수를 호출

- 리눅스의 다양한 파일시스템 지원 가능

ex) Ext2 파일시스템이 /dev/hda2 파티션을 관리, b.txt 파일이 존재한다고 가정.

사용자가 b.txt 파일을 인자로 open() 시스템 콜을 호출했을 때, VFS는 이 파일이 어떤 파일시스템에 속해있는지 판단

파일의 정보를 담을 구조체를 생성 -> 이 구조체를 인자로 하여 Ext2 파일시스템의 내부 고유 open 함수를 호출

 

-> 사용자 태스크는 자신이 접근하는 파일이 어느 파일시스템인지 알 필요 없이 표준 인터페이스만을 사용

 

* 가상 파일시스템의 디렉터리 엔트리 구조체

① Super block object

- 현재 사용중인 파일시스템 당 하나씩 존재

- 자신이 관리하는 파티션에 파일시스템마다 고유 정보를 슈퍼 블록에 저장 -> 관리하기 위해 슈퍼 블록(구조체) 객체 정의

 

② Inode object

- 파일 정보를 담기 위한 구조체

- 특정 파일 정보 요청시, 파일시스템 자신이 관리하는 영역의 파일 메타데이터를 읽어서 아이노드 객체에 넣어줌

-> 해당 파일의 디렉터리 엔트리를 읽어서 아이노드 객체에 채우는 개념

 

③ file object

- 태스크가 연 파일과 연관된 정보를 관리

- 태스크가 아이노드 객체에 접근하는 동안에만 메모리상에 유지되는 구조체

 

④ dentry object

- 태스크가 파일에 접근할 떄 해당 파일의 아이노드 객체를 자신의 태스크와 연관된 파일 객체에 연결해야하는데,

이 연결을 빠르게 하기 위한 캐시 역할

 

8. 태스크 구조와 VFS 객체

 

 

① 태스크가 Ext2 파일시스템 사용시, 요청을 받은 가상 파일시스템은 Ext2의 마운트 함수를 호출할 때, 인자로 빈 슈퍼 블록 객체를 넘김

② Ext2는 내부 함수를 이용해서 슈퍼 블록 객체의 내용을 채워서 리턴

③ 가상 파일시스템은 이 아이노드 객체를 디엔트리 객체에 연결시켜서 사용자의 태스크 구조와 연결

 

- task_struct의 files 변수 : file_struct 자료구조를 가리킴

- file_struct의 fd 변수 : file descriptor로 file자료구조에 대한 포인터를 갖는 배열

각 fd는 file object를 가리키고, 이 자료구조는 file table

- file object - f_dentry 변수 : dentry object를 가리김(dentry object는 캐시 역할을 하면서 Inode object를 가리킴)

- f_pos 변수 : 현재 파일에서 읽거나 쓸 위치

- f_op 변수 : file operation 자료구조를 가리키는 포인터(파일 연산이 요청될 때, 커널이 파일유형을 보고 고유 함수 사용)

- Inode object : 파일 당 하나씩 존재

해당 파일에 관련된 정보(디스크파티션, 디바이스 드라이버 주번호, inode 고유번호 접근 제어 정보, 파일 크기...)

- i_op 변수 : inode operation 자료구조를 가리키는 포인터

(파일시스템의 메타데이터 연산 요청시, 어떤 파일시스템에서 발생했는지 파악할 때 사용)

 

9. 파일시스템 제어 흐름 분석

 

 

① 파일 이름을 인자로 sys_open()호출시, 요청된 파일의 inode를 찾음 (sys_open()은 open.c에 구현)

② 태스크 구조와 가상 파일시스템 객체를 연결

③ 커널 내부 함수 filp_open() 호출 - 파일 이름과 디렉터리 구조를 이용하여 이에 대응하는 inode object를 찾아 리턴

④ 파일 구조 f_op 변수 초기화(각 파일 유형에 따른 적합한 파일 연산으로 등록)

-> f_op는 struct file_operation이라는 자료구조, 파일 관련 함수를 나타내는 변수들로 구성

⑤ file -> f_op -> open() 함수 호출 - 특정 파일의 고유한 open()함수를 호출

⑥ file_open()함수 리턴

 

 

 

 

① 파일 이름을 인자로 sys_read()호출 (sys_read()는 read_write.c에 구현)

② 인자로 전달된 fd를 이용해 파일 객체를 찾아 이 구조의 f_op에 등록된 특정 파일 유형의 고유한 read 함수 호출

③ 파일 읽는 경우, generic_file_read_iter()함수 호출

④ 요청 데이터 페이지 캐시에 있는지 찾아 파일시스템에 맞는 디스크 연산 함수를 호출하도록 struct inode_opertations 자료구조 사용

- struct inode_operations : inode object의 i_op 변수가 가리키고 있고, inode와 관련된 고유한 연산을 나타내는 변수로 구성

 

-> f_op와 i_op는 각 특징 파일시스템의 고유한 연산으로 제어를 전달하는 진입점 역할

 

 

 

 



 

<가상 파일시스템 내부구조>