syscall()을 호출하지 않는 libc 함수가 있는지 알고 싶습니까? 예를 들어, libc 함수 "strcpy()"의 경우, 모든 시스템 콜을 수행합니다 (모든 가능한 리눅스 시스템을 고려해 봅시다).libc function "strcpy()"가 syscall을 호출합니까?
4
A
답변
4
syscalls는 사용자 랜드 (프로그램이 실행되는 곳)에서 커널 랜드까지의 인터페이스와 다소 비슷합니다. 하드웨어와의 통신 (예 : 네트워크 카드에서 바이트 읽기, 프로세스 시작, malloc (brk
사용) 등을 통한 메모리 할당 등)과 같이 커널 만 수행 할 수있는 작업을 수행 할 때 필요합니다.
반면에 사용자 영역 기능은 strcpy
과 같이 들여 쓰이지 않아 syscalls을 수행합니다. 그들은 자신이하는 일을하는 데 특별한 특권이 필요 없으며 단지 사용자 영역에서 프로세스의 메모리에서 작동합니다.
syscalls은 사용자가 커널 토지로 돌아갈 때 비용이 많이 들기 때문에 성능이 크게 저하되므로 strcpy
과 같이 자주 호출되는 기능을 가진 사용자는 설계의 관점에서 이해가되지 않을 가능성이 높습니다. 보이다.
4
시스템 호출은 컨텍스트 전환을 커널에 암시하기 때문에 성능면에서 매우 중요합니다. 따라서 strcpy
(그 기능은 실질적으로 while(*d++ = *s++)
과 동일하지만 잠재적으로 아키텍처에 최적화 됨)과 같은 간단한 라이브러리 함수의 경우 시스템 호출이 의미가 없습니다.
복사 중 페이지 오류로 인해 커널 컨텍스트 전환과 시스템 호출이 발생할 수 있지만 시스템 호출을 직접 호출 한 결과는 strcpy
이 아닙니다.
strcpy는 가상 메모리에 쓰기가 필요하므로 운영 체제 계층 구조에서 가상 메모리는 어디에 상주합니까? 커널 공간 또는 사용자 공간에서? – Richard
가상 메모리는 커널에 의해 관리됩니다. 사용자 프로그램은 가상 메모리 만 봅니다. – nneonneo