
시스템 호출을 읽는 동안 LXR에서 헤더 파일을 찾기 위해 "syscalls.h"를 검색했습니다. 검색 결과는 나를 당황하게 만들었습니다. "arch/_arch_name_/include/asm" 아래의 디렉터리에서 오는 수십 개의 "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/
두 개의 특별한 syscall 파일이 있습니다:
syscalls/syscall_32.tbl
그리고 디토 "64"
커널이 ABI와 API를 함께 가져와야 하기 때문에 Syscall은 특별합니다.
일반적으로 포함 디렉터리와 기타 헤더 파일(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.
레이아웃은 나중에 할게요...