나는 이 질문에 대한 답을 겪었 지만 시스템 호출과 라이브러리 함수의 차이점을 이해하지 못합니다. 개념적으로이 둘의 차이점은 무엇입니까?
나는 이 질문에 대한 답을 겪었 지만 시스템 호출과 라이브러리 함수의 차이점을 이해하지 못합니다. 개념적으로이 둘의 차이점은 무엇입니까?
답변:
개념적으로 라이브러리 함수는 프로세스의 일부입니다.
런타임에 실행 코드와이 라이브러리가 의존하는 라이브러리 (예 : libc.so)의 코드는 단일 프로세스에 연결됩니다. 따라서 이러한 라이브러리에서 함수를 호출하면 프로세스의 일부로 동일한 리소스 및 권한으로 실행됩니다. 직접 작성한 함수를 호출하는 것과 같은 아이디어입니다 (PLT 및 / 또는 트램펄린 함수와 같은 예외는 관심이있는 경우 찾아 볼 수 있음).
개념적으로, 시스템 호출은 코드 (일반적으로 권한이없는)에서 커널 (필요에 따라 권한을 에스컬레이션 할 수있는 권한)로 호출하는 데 사용되는 특수 인터페이스입니다.
예를 들어, Linux man brk를 참조하십시오 . C 프로그램이 malloc
메모리 할당을 호출하면 glibc에서 라이브러리 함수를 호출합니다.
프로세스 내에 할당 할 공간이 이미 충분한 경우 필요한 힙 관리를 수행하고 메모리를 호출자에게 리턴 할 수 있습니다.
그렇지 않은 경우, glibc는 커널에서 더 많은 메모리를 요청해야합니다. brk
glibc 함수를 호출하고 brk
syscall 을 호출합니다 . 한 번만 제어가 syscall을 통해 커널로 전달 된 경우에만 더 많은 메모리를 예약하고 프로세스의 주소 공간에 맵핑하도록 글로벌 가상 메모리 상태를 수정할 수 있습니다.
쓸모없는 답변에 추가 :
라이브러리 함수는 시스템 호출보다 빠르며 일반적으로 권한과 보안 고려 사항은 프로세스의 권한과 메모리로 실행되므로 권한 / 보안 고려 사항이 없습니다.
반면 Syscall은 커널에서 실행되기 때문에 시스템의 모든 것에 액세스 할 수 있으므로 호출 할 때 호출 프로세스가 수행 할 수있는 작업을 제어해야합니다 (파일을 열 수있는 권한이 있는지 확인). 예) 또한 syscall이 커널에 있기 때문에이를 호출하려면 CPU에서 컨텍스트 전환이 필요합니다. 이는 라이브러리 호출을 호출하는 것보다 매우 무거운 프로세스입니다.
Syscall은 일반적으로 모니터링 프로그램에서 시스템 CPU 사용량으로 반영됩니다.