시스템 호출에 대한 내용을 읽었을 때 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.
레이아웃은 나중에 할게요...