Linux는 "실제 파일"과 "가상 파일"을 어떻게 읽습니까?

Linux는 "실제 파일"과 "가상 파일"을 어떻게 읽습니까?

Linux에는 "실제 파일"과 "가상 파일"이 있고, 실제 파일은 하드 디스크에 상주하는 파일이고, 가상 파일은 커널이 파일 형식으로 표현하는 데이터일 뿐이라는 것을 알게 되었습니다.

예를 들어 /proc디렉터리의 파일은 가상 파일입니다.

나는 이와 같은 함수가 read()실제 파일을 읽는 방법과 가상 파일을 읽는 방법을 어떻게 아는지 이해하고 싶습니다. 이 주제에 대한 이해를 보여주기 위해 다음 이미지를 만들었습니다. 이해가 잘못된 경우 정정해 주시기 바랍니다.

여기에 이미지 설명을 입력하세요.

답변1

VFS 계층에서 모든 파일은 가상입니다(실제로 SunOS 엔지니어가 UFS(디스크 기반) 및 NFS(네트워크 기반) 파일 시스템을 결합하기 위해 발명했습니다).

각각의 오픈에는 공통 루틴(일부는 일반일 수 있음)의 구현을 제공하는 file함수 테이블이 있으며 , 각각에는 필요한 구현이 포함된 C 함수 테이블( )이 있는 연결된 객체가 있습니다 . 순서는 다음과 같습니다.f_opinodeaddress_spacea_ops

  1. sys_read(): 애플리케이션은 시스템 호출을 사용하여 파일 읽기를 시작합니다.
  2. 호출은 VFS 스택의 맨 위로 전달됩니다( vfs_read()).
  3. file->f_op->read()또는 do_sync_read()또는를 사용하여 호출을 파일 시스템 드라이버에 전달합니다.new_sync_read()
  4. 파일을 직접 입력 및 출력 모드로 열면 해당 함수( a_ops->direct_IO(), ext4_direct_IO()for ext4)가 호출되고 데이터가 반환됩니다.
  5. 페이지 캐시에서 페이지를 찾으면 데이터를 반환합니다. file_get_page()
  6. 페이지 캐시에서 페이지를 찾을 수 없으면 from 드라이버에 의해 구현되는 a_ops->readpage()파일 시스템에서 페이지를 읽습니다.ext4_readpage()ext4
  7. VFS 스택은 다음 명령을 사용하여 블록 입력 및 출력 요청을 생성합니다.submit_bio()

~에서http://myaut.github.io/dtrace-stap-book/kernel/fs.html, 이 기사를 쓴 후 VFS 스택이 약간 리팩토링되었기 때문에 약간 오래되었습니다.

답변2

나는 이것에 대해 어떤 식으로든 완전한 답변을 제공하지 않을 것입니다 ...

한 가지 중요한 분리를 제외하고는 기본적으로 당신 말이 맞습니다.읽다()물었다핵심파일 설명자에는 무엇이 포함되어 있나요?핵심나머지는 잘 처리하세요. 물리적 파일 시스템인지, 네트워크 파일 시스템인지, 가상 파일 시스템(/proc, /sys,...)인지 여부읽다(). 커널에는 요청을 서비스하거나 제공하지 않는 기본 코드가 있으며, 이를 드라이버라고 부릅니다.

관련 정보