일부 파일이 더미 파일인 경우 open() 함수가 여전히 해당 파일에 액세스할 수 있는 이유는 무엇입니까?

일부 파일이 더미 파일인 경우 open() 함수가 여전히 해당 파일에 액세스할 수 있는 이유는 무엇입니까?

우리는 많은 파일이 가짜, 즉 실제 파일이 아니라는 것을 알고 있습니다.

전임자:

/sys/xxx
/proc/xxx
/dev/xxxx

제가 이해한 바에 따르면 open()x86 ASM 코드가 호출되고 ASM 코드는 디스크에 액세스하기 위해 하드웨어 인터럽트를 수행합니다.

문제는 open()결국 디스크에 액세스할 수 있는지 여부입니다. 어떻게 더미 파일에 계속 액세스할 수 있습니까 open()?

답변1

open()설명대로 시스템 호출이 작동하지 않습니다. 대신 커널에 파일을 열도록 요청합니다. 커널은 파일이 어떤 파일 시스템에 있고 어떤 장치와 연결되어 있는지 알고 있습니다. 이는 물리적 하드 드라이브, 메모리 블록 등이 될 수 있습니다. 연관된 장치가 단순한 메모리 블록인 경우 디스크 액세스가 수행되지 않습니다.

답변2

~처럼여우그들의답변, 커널은 open()시스템 호출을 처리하는 반면 파일 시스템은 자체 방식으로 파일 작업을 구현합니다. 반면에 파일 시스템은 해당 버전의 시스템 호출을 구현하며 이것이 바로 커널이 사용해야 하는 것입니다.

예를 들어,디렉토리를 열기 위한 ext4 호출또는procfs의 파일 작업(특히 어디에도 언급되지 않음 .open) 관로명명된 파이프와 명명되지 않은 파이프를 처리합니다. 그러나 일반적인 아이디어는 open()시스템 호출이 반드시 어셈블러일 필요도 없고 특정 아키텍처에 특정하다는 것도 보장되지 않는다는 것입니다.

그리고 인용하다답변사용자별워렌 영이 질문이 나오기 전에 누가 이 사실을 알아차렸을까요?

단일 파일에 대한 mkdir()이 존재하지 않습니다. Linux는 각각 자체적으로 "mkdir" 작업을 구현하는 다양한 파일 시스템을 지원합니다. 커널이 단일 시스템 호출 뒤에 모든 것을 숨길 수 있게 해주는 추상화 계층을 VFS라고 합니다. 따라서 vfs_mkdir()을 사용하여 fs/namei.c에 대한 조사를 시작할 수 있습니다. 하위 수준 파일 시스템 수정 코드의 실제 구현은 다른 곳에 있습니다. 예를 들어, ext4 구현은 ext4_mkdir()이라고 하며 fs/ext4/namei.c에 정의되어 있습니다.

open()왜 그런가 하면 , 이것도 그렇기 때문이다.유닉스 디자인 철학: 모든 것은 파일이다. API를 사용하는 경우 모든 파일 시스템에 대해 바퀴를 다시 발명하기보다는 일관된 인터페이스를 다루고 싶을 것입니다(커널 개발자가 아니라면 감사와 존경을 표합니다).

관련 정보