C는 시스템 호출을 위한 write(), read() 및 기타 라이브러리 함수를 제공합니다. Linux에서 라이브러리를 사용하지 않고 C에서 시스템 호출을 만드는 방법은 무엇입니까?
답변1
야망이나 순수성에 대한 지나치게 강한 열망은 인라인 조립으로 이어질 수 있습니다. 예를 들어 x86_64 시스템에서는 open(2)
다음 시스템 호출을 수행할 수 있습니다.
#include <sys/syscall.h>
int
linux_open(const char *pathname, unsigned long flags, unsigned long mode)
{
long ret;
asm volatile ("syscall" : "=a" (ret) : "a" (__NR_open),
"D" (pathname), "S" (flags), "d" (mode) :
"cc", "memory", "rcx",
"r8", "r9", "r10", "r11" );
if (ret < 0)
{
errno = -ret;
ret = -1;
}
return (int) ret;
}
더 이해하기 쉬운 libc의 소스 코드를 볼 수 있습니다(예:무실) 시스템 호출이 어떻게 구현되는지 이해합니다.
답변2
시스템 호출을 하려면 일반적으로 C 언어 사양에 포함되지 않은 일부 기능을 CPU에서 실행해야 합니다. 시스템 호출은 CPU의 어셈블리 언어로 작성 및 연결되거나 C 함수 내에서 일부 CPU 관련 인라인 어셈블리를 사용합니다.
모든 시스템 호출에는 매우 유사한 설정이 필요하기 때문에 이를 지원하기 위해 다양한 매크로가 Linux 커널에 정의되어 있습니다. 결과적으로 CPU 관련 어셈블러가 실제로 어디에서 왔는지 말하기 어려운 경우가 많지만, 충분히 깊이 파고들면 알아낼 수 있습니다.