>

Linux에는 "실제 파일"이 있고 "가상 파일"이 있으며 실제 파일은 하드 디스크에있는 파일 인 반면, 가상 파일은 커널에서 파일로 표현한 데이터 일뿐입니다.

예를 들어, /proc 의 파일  디렉토리는 가상 파일입니다.

read() 와 같은 함수가 어떻게 작동하는지 이해하고 싶습니다  실제 파일을 읽는 방법과 가상 파일을 읽는 방법을 알고 있습니다. 이 주제에 대한 이해를 보여주기 위해 다음 다이어그램을 만들었습니다. 이해가 잘못된 경우 수정 해주세요.

  • 답변 # 1

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

    각 열린 file  기능 f_op 테이블이 있습니다  일반적인 루틴 (일부는 일반 일 수 있음)과 각 inode 에 대한 구현을 제공합니다.   address_space 가 첨부되어 있습니다  C 함수 테이블이있는 객체 ( a_ops ) 필요한 구현이 포함되어 있습니다. 순서는 다음과 같습니다.

    <올>

    sys_read() : 애플리케이션이 시스템 호출을 사용하여 파일 읽기를 시작합니다

    통화는 VFS 스택 최상위 계층 ( vfs_read() )으로 전달됩니다. )

    전화는 file->f_op->read() 를 사용하여 파일 시스템 드라이버로 전달됩니다.  또는 do_sync_read()  또는 new_sync_read()

    직접 입력 출력 모드에서 파일을 열면 적절한 기능 ( a_ops->direct_IO() ext4_direct_IO()   ext4 를 위해 )가 호출되고 데이터가 반환됩니다

    페이지가 페이지 캐시에 있으면 데이터가 file_get_page() 로 리턴됩니다.

    페이지 캐시에서 페이지를 찾을 수 없으면 a_ops->readpage() 를 사용하여 파일 시스템에서 읽습니다. ext4_readpage() 에 의해 구현됩니다.   ext4 에서  운전사

    VFS 스택은 submit_bio() 를 사용하여 블록 입출력 요청을 만듭니다.

    http://myaut.github.io/dtrace-stap-book/kernel/fs.html에서 VFS 스택이 작성된 후 약간 리팩토링 되었기 때문에 약간 구식입니다

  • 답변 # 2

    어떤 식 으로든 이에 대해 철저한 대답을하지 않겠습니다 ...

    하나의 중요한 분리를 제외하고는 본질적으로 정확합니다 :read ()커널에 파일 설명자에 포함 된커널을 묻습니다. 나머지를 처리합니다. 실제 파일 시스템이든 네트워크 파일 시스템이든 가상 파일 시스템 (/ proc,/sys, ...)은read ()와 관련이 없습니다. 커널에는 요청을 처리하기위한 기본 코드가 있습니다 (또는 아닙니다). 이것은 드라이버라고합니다.

  • 이전 shell script - awk - 여러 dat 파일의 두 번째 줄을 하나의 파일로 출력
  • 다음 text processing - 열이 여러 줄로 분할 된 이전 줄에 줄 추가