Transcript Document

ULKML 가상 파일 시스템(VFS) - 1
장보길
한국 외국어대학교 디지털정보공학과
System Software LAB
[email protected]
VFS 층이란?
• 사용자로부터 어떤 이벤트가 들어오면 여러 종류의
파일시스템에 대해 공통 인터페이스를 제공하는 층
2
VFS층의 데이터 구조(1/2)
• inode 구조체
– 디스크 상의 파일 관리 정보라는 의미에서 유래
– 각 파일시스템에서 공통적으로 관리해야 할 정보를 다룸
• address_space 구조체
– 파일과 가상 메모리 관리와의 교환을 제어(페이지 캐시)
– inode와 address_space는 1:1로 대응
• dentry 구조체
– 디렉토리 엔트리를 모델화한 것
• d_parent : 디렉토리 엔트리의 소유자
• d_name : 파일명
• d_inode : 파일명에 대응하는 inode
• file 구조체
– 오픈한 파일을 관리(오픈 콘텍스트 ex] current offset)
3
VFS층의 데이터 구조(2/2)
• super_block 구조체
– 파일시스템 표시, 파일시스템과 super_block은 1:1 대응
– 디스크 상의 파일시스템 관리 정보에서 유래함
– 각 파일 시스템에 공통된 관리 정보를 다룸
• vfsmount 구조체
– 마운트된 파일시스템의 위치 관계를 관리
– 파일시스템의 이름 공간을 구성하기 위한 구조체
4
오픈 파일 관리
task_struct
file_struct
file
포인터 배열
fdtable
0
fd
1
2
file 구조체
file 구조체
file 구조체
..
..
..
file 구조체
N
5
오픈 파일 관리
• 1개의 파일이 2회 오픈 되었을 때
task_struct
task_struct
file_struct
file
file 구조체
file 구조체
fdtable
fd
file_struct
fdtable
dentry 구조체
file
fd
d_inode
inode 구조체
6
리눅스 저수준 파일 입출력 시스템 호출 함수
• open() – 파일이나 장치를 열거나 생성한다.
• 함수의 원형
• 파일 생성 및 열기가 성공 하면, 해당 파일을 지시하는 int 형의 파일
지시자를 반환한다.
• Flag는 파일을 어떤 모드로 열 것인가를 결정 한다. (O_RDONLY,
O_WRONLY, O_RDWR)
• 에러가 발생 하면 -1을 반환 한다.
7
함수 위치?
• file open 시스템 콜 호출시 커널에서
이뤄지는 동작을 소스 레벨로 확인 해
보려했으나 sys_open() 함수를 찾지
못했음.
(요청한 파일에 대한 inode로 어떻게 접근 하는가?)
• 2.6버전대 커널에서는 fs/open.c 에 존재
했음
– asmlinkage long sys_open(const char __user * filename, int flags, int mode)
8
fs/open.c – 소스 분석
• do_sys_open()
– 2.6 버전 asmlinkage long sys_open() 함수와
가장 유사.
9
fs/open.c – 소스 분석
• open_flags 구조체
– build_open_flags() mode,
flags를 바탕으로 내용을
채움
• get_unused_fd_flags();
– task_struct -> files_struct
안에 있는 멤버 fdtable의 fd
포인터 배열인덱스를 받음
– alloc_fd :
• do_filp_open()
10