답변1
VFS 계층에서 모든 파일은 가상입니다(실제로 SunOS 엔지니어가 UFS(디스크 기반) 및 NFS(네트워크 기반) 파일 시스템을 결합하기 위해 발명했습니다).
각각의 오픈에는 공통 루틴(일부는 일반일 수 있음)의 구현을 제공하는 file
함수 테이블이 있으며 , 각각에는 필요한 구현이 포함된 C 함수 테이블( )이 있는 연결된 객체가 있습니다 . 순서는 다음과 같습니다.f_op
inode
address_space
a_ops
sys_read()
: 애플리케이션은 시스템 호출을 사용하여 파일 읽기를 시작합니다.- 호출은 VFS 스택의 맨 위로 전달됩니다(
vfs_read()
). file->f_op->read()
또는do_sync_read()
또는를 사용하여 호출을 파일 시스템 드라이버에 전달합니다.new_sync_read()
- 파일을 직접 입력 및 출력 모드로 열면 해당 함수(
a_ops->direct_IO()
,ext4_direct_IO()
forext4
)가 호출되고 데이터가 반환됩니다. - 페이지 캐시에서 페이지를 찾으면 데이터를 반환합니다.
file_get_page()
- 페이지 캐시에서 페이지를 찾을 수 없으면 from 드라이버에 의해 구현되는
a_ops->readpage()
파일 시스템에서 페이지를 읽습니다.ext4_readpage()
ext4
- VFS 스택은 다음 명령을 사용하여 블록 입력 및 출력 요청을 생성합니다.
submit_bio()
~에서http://myaut.github.io/dtrace-stap-book/kernel/fs.html, 이 기사를 쓴 후 VFS 스택이 약간 리팩토링되었기 때문에 약간 오래되었습니다.
답변2
나는 이것에 대해 어떤 식으로든 완전한 답변을 제공하지 않을 것입니다 ...
한 가지 중요한 분리를 제외하고는 기본적으로 당신 말이 맞습니다.읽다()물었다핵심파일 설명자에는 무엇이 포함되어 있나요?핵심나머지는 잘 처리하세요. 물리적 파일 시스템인지, 네트워크 파일 시스템인지, 가상 파일 시스템(/proc, /sys,...)인지 여부읽다(). 커널에는 요청을 서비스하거나 제공하지 않는 기본 코드가 있으며, 이를 드라이버라고 부릅니다.