man 2 시스템 호출은 어떻게 호출되나요?

man 2 시스템 호출은 어떻게 호출되나요?

man 2 brk시스템 호출이란 인터럽트 가 아닌 와 같은 기능을 의미합니다 0x80.

내가 이해한다면이 스레드컴파일된 C 프로그램은 결코곧장시스템 호출을 호출합니다. 에서 발생할 수 있는 라이브러리 호출만 호출할 수 있습니다 glibc.

그러나 man 3 brk보상이 있습니다 No manual entry for brk in section 3. 따라서 brk올바르게 실행하려면 다음 중 하나가 발생해야 합니다.

  1. 위의 내 이해가 잘못되었습니다. 프로그램은 지원 없이 시스템 호출을 호출할 수 있습니다 glibc. 하지만 brk프로그램에 어떻게 연결하나요 ?
  2. glibc실제로 시스템 호출에 대한 래퍼 가 있습니다 brk. 그렇다면 brk내 시간에는 무엇이 포함되나요 #include <unistd.h>? 하나입니까 glibc아니면 시스템 호출입니까? 그렇다면 glibc왜 문서화되지 않았습니까 man 3? 이용 가능한 도서관 통화의 전체 목록은 어디에서 찾을 수 있나요?

답변1

섹션 2의 매뉴얼 페이지에 있는 대부분의 시스템 호출에 대해 매뉴얼 페이지는 실제로 C 라이브러리 래퍼를 설명합니다. 예외는 일반적으로 명시적으로 언급됩니다.gettid@Sergei Kurenkov는 답변에서 다음과 같이 언급했습니다.

노트Glibc는 이 시스템 호출에 대한 래퍼를 제공하지 않습니다. 이를 호출하려면 syscall(2)을 사용하십시오.

pivot_root(일반 응용 프로그램에서는 많이 사용되지 않음), tgkill(저수준 기능 수행 pthread_kill)과 유사합니다. 그리고 거기에는readdir, 실제 시스템 호출은 라이브러리 함수와 다소 다릅니다.

설명하다이것은 당신이 관심을 갖고 있는 기능이 아닙니다. POSIX 호환 C 라이브러리 인터페이스에 대해서는 readdir(3)을 참조하십시오. 이 페이지는 getdents(2)로 대체된 베어 커널 시스템 호출 인터페이스를 문서화합니다.

일종의 래퍼가 있어야 합니다. 함수 호출은 커널 인터페이스의 호출 규칙과 다른 C 호출 규칙을 사용하여 이루어집니다. 일반 함수 호출은 어셈블리 명령어(또는 유사한 명령어)를 사용하여 이루어지며, 커널 호출은 또는를 call사용하여 이루어집니다 ( 또는 내용은 포함되지 않음 ). 컴파일러는 어떤 함수 호출이 실제 커널 호출에 매핑되는지 알 필요가 없습니다.syscallint 0x80gettimeofdaygetpidvdso

"일반적인" 시스템 호출을 사용하더라도 C 라이브러리 래퍼는 기본 시스템 호출과 약간 다르게 동작합니다. 시스템 호출은 오류 코드를 다른 음수 값으로 반환합니다(Linux 커널 코드를 보면 많은 오류가 반환되는 것을 볼 수 있습니다). ) 같은 것 return -EPERM;. C 라이브러리 래퍼는 이러한 모든 반환 값을 -1로 변환하고 실제 오류 코드를 errno.

답변2

컴파일된 C 프로그램은 직접 시스템 호출을 수행하지 않습니다.

이것은 사실이 아닙니다. gettid예를 들어보자 :http://man7.org/linux/man-pages/man2/gettid.2.html. 래퍼가 없으므로 프로그램에서 다음과 같은 내용을 작성해야 합니다(man: Glibc does not provide a wrapper for this system call; call it using syscall(2).).

#ifndef WIN32

#include <linux/unistd.h>
#include <sys/syscall.h>
#include <unistd.h>
int thread_gettid(void) {
    return static_cast<int>(syscall(SYS_gettid));
}
#else
int thread_gettid(void) {
    return GetCurrentThreadId();
}
#endif

위의 내 이해가 잘못되었습니다. 프로그램은 glibc 지원 없이 시스템 호출을 호출할 수 있습니다.

실제로 그럴 수 있습니다. 그것은 다음을 사용합니다 syscall:http://man7.org/linux/man-pages/man2/syscall.2.html.

그렇다면 brk는 프로그램과 어떻게 연결되어 있나요?

brkman에 다음 줄이 있기 때문에 glibc에는 래퍼가 있는 것 같습니다 .

The return value described above for brk() is the behavior provided 
by the glibc wrapper function for the Linux brk() system call.

glibc라면 왜 man 3에는 기록이 없나요?

malloc메모리 할당을 사용해야 하기 때문이라고 생각합니다 .

brk() 및 sbrk() 사용을 피하세요. malloc(3) 메모리 할당 패키지는 이식 가능하고 편안한 메모리 할당 방법입니다.

관련 정보