![시스템 호출과 라이브러리 함수의 차이점](https://linux55.com/image/27410/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%98%B8%EC%B6%9C%EA%B3%BC%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%20%ED%95%A8%EC%88%98%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90.png)
이미 나는이 질문에 대한 답변으로하지만 시스템 호출과 라이브러리 기능의 차이점을 잘 이해하지 못합니다. 개념적으로 둘의 차이점은 무엇입니까?
답변1
개념적으로 라이브러리 함수는 프로세스의 일부입니다.
런타임 시 실행 코드와 해당 코드가 의존하는 라이브러리(예: libc.so)의 코드는 단일 프로세스로 연결됩니다. 따라서 이러한 라이브러리에서 함수를 호출하면 해당 함수는 프로세스의 일부로 실행되며 동일한 리소스와 권한을 갖습니다. 이는 자신이 작성한 함수를 호출하는 것과 같은 아이디어입니다(PLT 및/또는 트램펄린 함수와 같은 예외는 있지만 관심 있는 경우 찾아볼 수 있음).
개념적으로 시스템 호출은 코드(일반적으로 권한이 없음)에서 커널(필요에 따라 권한을 확대할 수 있는 권한이 있음)을 호출하는 데 사용되는 특수 인터페이스입니다.
예를 들어 Linux를 참조하세요.매뉴얼. C 프로그램이 malloc
메모리 할당을 호출하면 glibc의 라이브러리 함수가 호출됩니다.
이미 할당 가능한 공간이 충분한 경우프로세스 내부, 필요한 힙 관리를 수행하고 호출자에게 메모리를 반환합니다.
그렇지 않은 경우 glibc는 커널에서 더 많은 메모리를 요청해야 합니다. brk
glibc 함수 는 (아마도) brk
시스템 호출을 호출합니다. 시스템 호출을 통해 제어가 커널에 전달된 후에만 전역 가상 메모리 상태를 수정하여 더 많은 메모리를 예약하고 이를 프로세스의 주소 공간에 매핑할 수 있습니다.
답변2
쓸모없는 답변 추가:
라이브러리 함수는 시스템 호출보다 빠르며 일반적으로 프로세스의 권한과 메모리로 실행되므로 권한/보안 고려 사항을 포함하지 않습니다.
반면에 시스템 호출은 커널에서 실행되므로 시스템의 모든 것에 액세스할 수 있으므로 호출 시 호출 프로세스가 수행할 수 있는 작업을 제어해야 합니다(예: 파일을 열 수 있는 권한이 있는지 확인). 또한 시스템 호출은 커널에 위치하므로 이를 호출하려면 CPU에서 컨텍스트 전환이 필요하며 이는 단순히 라이브러리 호출을 호출하는 것에 비해 매우 무거운 프로세스입니다.
시스템 호출은 일반적으로 모니터 프로그램의 시스템 CPU 사용량으로 반영됩니다.
답변3
라이브러리 호출 - (라이브러리를 포함하거나 추가하여) 애플리케이션에 연결된 서브루틴에 대한 호출입니다.
시스템 호출 - 운영 체제로 제어권을 전달하고(사용자 -> 시스템 프로세스 -> 운영 체제) 프로세서를 권한 모드로 전환합니다.
답변4
- lib fun은 컴파일러에서 지원되는 반면 syscall은 운영 체제에서 지원됩니다.
- Libcall은 구체적이고 syscall은 getc와 같이 일반적입니다. lib fun은 문자열이나 축어가 아닌 한 번에 하나의 문자에만 액세스할 수 있지만 공개 syscall은 텍스트 파일, 바이너리 파일 및 더 많은 유형의 문서를 여는 데 사용할 수 있습니다.