Linux 커널 헤더 파일 구성

Linux 커널 헤더 파일 구성

시스템 호출에 대한 내용을 읽었을 때 LXR에서 헤더 파일을 찾기 위해 "syscalls.h"를 검색했습니다. 검색 결과가 나를 혼란스럽게 만들었습니다. "arch/_arch_name_/include/asm" 아래의 디렉터리에는 12개 이상의 "syscalls.h" 파일이 있습니다. 괜찮습니다. 아키텍처별 정의 또는 기타 필요한 사항입니다. 문제는 /include/linux 및 /include/asm-generic 아래에 두 개의 서로 다른 "syscalls.h" 헤더 파일이 있는 이유는 무엇입니까?

또한 /include/linux 헤더가 어떤 용도로 사용되는지, /include/asm-generic 헤더가 어떤 용도로 사용되는지 알고 싶습니다. 그들은 어떻게 서로 구별됩니까? 두 개의 별도 헤더 폴더를 갖는 논리는 무엇입니까? 그들의 관계는 어떤가요?

감사해요

답변1

다음 제목은 asm/generic기본적으로 아키텍처별 버전이 작성될 때까지 C 언어의 이식 가능한 버전에 대한 임시방편으로 작성되었습니다. 또한 어떤 경우에는 /usr/include/foobar.h많은 "내부 구현" 헤더가 포함되어 있으며 그 끝은 커널의 부분(종종 동일한 부분이라고 함)에 의존한다는 것을 알 수 있습니다 . 예는 math.h및 (Linux에 따라 다름) 입니다 syscall.h.

답변2

소프트웨어는 이식성이 있어야 합니다. C/C++ 소스 코드를 컴파일하는 경우 i386/x86_64/arm/mips 등을 실행 중인지 알 필요가 없습니다. 헤더는 소프트웨어 컴파일 방식으로 연결됩니다.

다른 모든 헤더 파일은 다양한 표준을 구현하고 BSD의 포트 등이 있기 때문에 존재합니다. 그 중 다수는 역사적 기반을 갖고 있습니다. 모든 사람이 출신지, 존재 이유는 다양하며 그 대답은 분명 충격적일 것입니다.

그리고 asm-generic의 답변은 다음과 같습니다.스택 오버플로

답변3

arch/x86/entry/두 가지 특별한 시스템 호출 파일이 있습니다:

syscalls/syscall_32.tbl 그리고 디토 "64"

커널이 ABI와 API를 결합해야 하기 때문에 시스템 호출은 특별합니다.

일반적으로 포함 디렉터리 및 기타 헤더 파일(kernel/sched/sched.h와 같은 독립 실행형 파일)은 계층적 논리를 따릅니다. 나는 make와 gcc 둘 다 중요한 역할을 한다고 생각한다.

각 헤더 "단위"가 한 번만 읽히도록 이러한 기호를 체계적으로 사용하십시오. (십자형이 너무 많을 수 있으므로 "보호 포장지"). 여기에서 온다 include/linux/mm.h:

    #ifndef _LINUX_MM_H
    #define _LINUX_MM_H

    #include <linux/errno.h>

    #ifdef __KERNEL__

    ...  (#includes)
    ...  (ext. decl. etc., the whole mm.h)

    #endif /* __KERNEL__ */
    #endif /* _LINUX_MM_H */

tbl 파일은 다음과 같습니다.

# 32-bit system call numbers and entry vectors

목록은 다음으로 시작됩니다.

0    i386    restart_syscall    sys_restart_syscall       __ia32_sys_restart_syscall
1    i386    exit               sys_exit                  __ia32_sys_exit
2    i386    fork               sys_fork                  __ia32_sys_fork
3    i386    read               sys_read                  __ia32_sys_read




#
# 64-bit system call numbers and entry vectors
#
# The format is:
# <number> <abi> <name> <entry point>
#
# The __x64_sys_*() stubs are created on-the-fly for sys_*() system calls
#
# The abi is "common", "64" or "x32" for this file.

레이아웃은 나중에 할게요...

관련 정보