나는 시스템 호출이 어떻게 작동하는지와 시스템 호출에 대한 일반적인 요구 사항을 잘 이해하고 있습니다. 그런데 왜 create() 파일, read() 파일, close() 같은 특정 시스템 호출이 커널 모드에서만 실행될 수 있는지 이해가 되지 않습니다.
예를 들어 create() 및 read() 파일에서 사용자 공간이나 사용자 모드에서는 왜 이런 일이 발생할 수 없습니까? 사용자가 파일을 생성하고 읽어 시스템을 손상시킬 수 있는 방법은 무엇입니까? close() 시스템 호출에 대해 동일한 질문이 있습니다.
답변1
create() 파일, read() 파일, close() 같은 시스템 호출이 왜 커널 모드에서만 실행될 수 있는지 이해가 안 됩니다.
정의에 따르면 시스템 호출은 커널 모드에서 실행됩니다. 사용자 공간에서는 일반적으로 동일한 이름을 가진 라이브러리 래퍼 함수를 통해 사용할 수 있습니다. 에서 man 2 intro
:
시스템 호출은 Linux 커널의 진입점입니다. 일반적으로 시스템 호출은 직접 호출되지 않습니다. 대신 대부분의 시스템 호출에는 시스템 호출을 호출하는 데 필요한 단계(예: 커널 모드로 트랩핑)를 수행하는 해당 C 라이브러리 래퍼 함수가 있습니다. 따라서 시스템 호출을 하는 것은 일반 라이브러리 함수를 호출하는 것과 동일해 보입니다.
(당신도 확인할 수 있습니다 man 2 syscall
)
@dirkt와 @StephenKitt가 의견에서 말했듯이 언급한 시스템 호출은 파일 설명자 테이블에 쓰고, 파일 I/O 드라이버에 액세스하고, 액세스를 확인해야 하기 때문에 커널 공간에서 실행되어야 합니다.
답변2
예를 들어 파일 내부에서는
create()
왜read()
사용자 공간에서는 이런 일이 일어날 수 없나요?
Linux 기반 플랫폼을 포함한 일부 플랫폼에서는 사용자 공간에서 파일 시스템 IO를 실행할 수 있습니다. FUSE라고 하며 읽을 수 있습니다.사용자 공간의 파일 시스템주제에 대한 소개입니다.
다음을 포함하여 다양한 FUSE 기반 파일 시스템을 사용할 수 있습니다.SSHFS(파일 시스템 ssh
) 및S3QL(클라우드 스토리지의 파일 시스템).
커널은 사용자 공간 클라이언트(애플리케이션)와 FUSE 구현 사이의 계층을 중재하여 파일 시스템 의미가 검증되고 일관되지만 , , , 등 creat()
의 실제 IO 코드 는 모두 사용자 공간 서비스에 의해 실행됩니다.open()
read()
write()
fcntl()
close()