• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    해결됨

system call

23.03.03 17:43 작성 조회수 371

0

file lowlevel 부분에서 나온 함수들만 systemcall이고 file advanced 수업에서 소개되는 api들은 아닌거 맞나요?

답변 1

답변을 작성해보세요.

0

안녕하세요 lalala님

엄격한 기준으로 말씀드리자면 강좌에서 사용한 모든 함수는 system call(syscall)이 아닙니다. 일반적으로 syscall은 user level application에서 직접 호출하지 않습니다. 대신 user level application에서 syscall 호출이 필요한 경우 syscall을 호출하도록 구현된 wrapper function을 호출하게 되죠. 이 wrapper function들은 libc(linux에서는 보통 glibc)에 구현되어 있는 것을 사용하게 됩니다. 결국, glibc에 구현된 syscall wrapper function을 호출함으로써 syscall을 호출하는 것입니다. 완화된 기준으로 보자면 우리 코드에서 syscall을 간접적으로 사용했다고 할 수 있는 것이죠.

glibc에서 제공하는 함수들이 어떤 syscall을 사용했는지 유추는 가능하지만 정확하게 알기위해서는 glibc 소스 코드를 봐야하겠죠. 하지만 이것은 쉬운 일은 아닙니다. glibc 소스 코드가 보기 쉽게 작성된 코드가 아니어서요..; 그나마 쉽게 확인할 수 있는 방법은 man page에서 어떤 함수에 대해 찾을 때 그 함수가 어떤 섹션인지 확인하는 것입니다. 그 함수가 section 2에 있으면 syscall wrapper function이라고 판단할 수 있겠습니다. syscall에 대한 man page를 보시면 syscall wrapper function 목록이 나와있습니다.(https://man7.org/linux/man-pages/man2/syscalls.2.html)

그렇다고 section 2에 있지 않은 함수들은 syscall을 사용하지 않을까요? 그렇지 않을껍니다. 예를 들어 fopen의 경우 section 3에 포함되는 함수입니다. 아마도 내부적으로 open 등의 syscall을 사용하고 있겠죠.

section 2든 3이든 우리는 glibc에 구현된 함수를 호출하는데요, glibc라는 라이브러리에서 제공하는 함수를 호출한다고 볼 수 있죠. 이렇게 외부에서 호출할 수 있는 함수를 우리는 API라고 부르죠. 우리가 호출하는 glibc 함수들은 모두 API 함수라고 볼 수 있습니다.

답변이 길어졌네요. 설명이 좀 장황한 것 같긴한데요.. 잘 이해하셨길 바라겠습니다. :)