커널 시스템 호출의 연결 메커니즘이 왜 그렇게 빠른가요? [폐쇄]

커널 시스템 호출의 연결 메커니즘이 왜 그렇게 빠른가요? [폐쇄]

Linux 커널에서 파일을 열면 거의 모든 파일에 외부 함수와 #indef매크로가 많이 있는데 #ifndef, 파일에 헤더 파일이 70개 이상 포함되어 있으면 컴파일 타임에 어떻게 모든 함수와 매크로를 정확하게 매핑합니까 .c/.h?

이 작업을 얼마나 정확하고 신속하게 수행합니까? GCC는 이러한 작업만 담당합니까, 아니면 이러한 모든 작업을 수행할 수 있는 다른 프로그램이 있습니까?

답변1

좋습니다. 귀하의 질문에 완전히 답하려면 C 프로그래밍 입문에 관한 책을 읽어야 합니다.타넨바움그리고용의 책. C부터 배워보세요.

시작하기 위한 몇 가지 기본 사항: C 프로그램을 컴파일할 때 전통적으로 몇 가지 다른 단계가 있습니다. (최신 컴파일러는 단계 간 최적화를 수행할 수 있습니다.) 단계는 다음과 같습니다.

  1. 개척자. 여기에는 포함 파일, #ifdef, #define 및 매크로 확장이 포함됩니다.
  2. 번역기. 이는 C 코드를 보다 기계 수준의 중간 표현(때로는 어셈블러)으로 변환합니다.
  3. 어셈블러. 이는 중간 표현을 실제 기계어 코드로 변환합니다.
  4. 링커. 이렇게 하면 모든 조각이 합쳐지고 메모리 문제가 처리됩니다. 여러 링크가 전달될 수 있습니다.

gcc는 위의 모든 작업을 수행할 수 있지만 커널이 복잡하기 때문에 다른 도구가 사용되며 대부분은 커널에 따라 다릅니다.

이제 커널은 어떤 면에서는 또 다른 프로그램일 뿐이지만 하드웨어에 따라 시스템 호출을 포함하여 많은 차이점이 있습니다.

일반적인 Linux 프로그램에서 커널에 파일 열기와 같은 작업을 요청하면

  1. 프로그램이 라이브러리 함수를 호출합니다.
  2. 라이브러리 함수는 시스템 호출을 수행합니다.
  3. 커널은 디스패치 테이블에서 시스템 호출을 찾습니다.
  4. 커널은 인증 확인을 수행합니다.
  5. 커널은 자신의 일을 합니다.
  6. 커널은 결과를 라이브러리 함수로 반환합니다.
  7. 라이브러리 함수는 결과를 프로그램에 반환합니다.

이는 초당 수백 번 발생할 수 있습니다.

관련 정보