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