Linux 커널에서 파일을 열면 거의 모든 파일에 외부 함수와 #indef
매크로가 많이 있는데 #ifndef
, 파일에 헤더 파일이 70개 이상 포함되어 있으면 컴파일 타임에 어떻게 모든 함수와 매크로를 정확하게 매핑합니까 .c/.h
?
이 작업을 얼마나 정확하고 신속하게 수행합니까? GCC는 이러한 작업만 담당합니까, 아니면 이러한 모든 작업을 수행할 수 있는 다른 프로그램이 있습니까?
답변1
좋습니다. 귀하의 질문에 완전히 답하려면 C 프로그래밍 입문에 관한 책을 읽어야 합니다.타넨바움그리고용의 책. C부터 배워보세요.
시작하기 위한 몇 가지 기본 사항: C 프로그램을 컴파일할 때 전통적으로 몇 가지 다른 단계가 있습니다. (최신 컴파일러는 단계 간 최적화를 수행할 수 있습니다.) 단계는 다음과 같습니다.
- 개척자. 여기에는 포함 파일, #ifdef, #define 및 매크로 확장이 포함됩니다.
- 번역기. 이는 C 코드를 보다 기계 수준의 중간 표현(때로는 어셈블러)으로 변환합니다.
- 어셈블러. 이는 중간 표현을 실제 기계어 코드로 변환합니다.
- 링커. 이렇게 하면 모든 조각이 합쳐지고 메모리 문제가 처리됩니다. 여러 링크가 전달될 수 있습니다.
gcc는 위의 모든 작업을 수행할 수 있지만 커널이 복잡하기 때문에 다른 도구가 사용되며 대부분은 커널에 따라 다릅니다.
이제 커널은 어떤 면에서는 또 다른 프로그램일 뿐이지만 하드웨어에 따라 시스템 호출을 포함하여 많은 차이점이 있습니다.
일반적인 Linux 프로그램에서 커널에 파일 열기와 같은 작업을 요청하면
- 프로그램이 라이브러리 함수를 호출합니다.
- 라이브러리 함수는 시스템 호출을 수행합니다.
- 커널은 디스패치 테이블에서 시스템 호출을 찾습니다.
- 커널은 인증 확인을 수행합니다.
- 커널은 자신의 일을 합니다.
- 커널은 결과를 라이브러리 함수로 반환합니다.
- 라이브러리 함수는 결과를 프로그램에 반환합니다.
이는 초당 수백 번 발생할 수 있습니다.