☆★☆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는 각 특징 파일시스템의 고유한 연산으로 제어를 전달하는 진입점 역할
<가상 파일시스템 내부구조>
'나름컴공이라공 > Linux Kernel' 카테고리의 다른 글
Linux Kernal Internal > Ch5 파일시스템과 가상 파일시스템(3) (0) | 2019.07.19 |
---|---|
Linux Kernal Internal > Ch5 파일시스템과 가상 파일시스템(2) (0) | 2019.07.19 |
Linux Kernal Internal > Ch5 파일시스템과 가상 파일시스템(1) (0) | 2019.07.19 |
Linux Kernal Internal > Ch3 태스크 관리(3) (0) | 2019.07.19 |
Linux Kernal Internal > Ch3 태스크 관리(2) (0) | 2019.07.19 |