我想阅读一些源代码来尝试了解它们是如何组合在一起的,但不知道从哪里开始。Linux源代码中的哪个文件是编译内核的主要文件?
我半期待找到一个kernel/main.c,但是下面有很多文件kernel/,我看不到哪个是主要的?是kernel/sys.c吗?
从引导加载程序到内核的切换必然涉及一些特定于体系结构的考虑因素,例如内存地址和寄存器使用。因此,要查找的位置在特定于体系结构的目录 ( arch/*) 中。此外,从引导加载程序的切换涉及可能在汇编程序中实现的精确寄存器使用协议。对于某些架构上的不同引导加载程序,内核甚至具有不同的入口点。
例如,在 x86 上,入口点在arch/x86/boot/header.S(我不知道其他入口点,但我不确定没有)。真正的入口点是二进制文件中偏移量 512处的_start标签。之前的 512 字节可用于为 IBM PC 兼容 BIOS制作主引导记录(在过去,内核可以通过这种方式引导,但现在这部分只显示错误消息)。该_start标签开始一些相当长的处理,在实模式,先在装配和随后的main.c。在某些时候,初始化代码会切换到保护模式。如果内核被压缩,我认为这是解压缩发生的点; 然后控制到达startup_32或startup_64进入arch/x86/kernel/head_*.S取决于这是一个 32 位还是 64 位内核。在更多的汇编之后,i386_start_kernelinhead32.c或x86_64_start_kernelinhead64.c被调用。最后,调用与体系结构无关的start_kernel函数 ininit/main.c。
start_kernel是内核开始为现实世界做准备的地方。当它启动时,只有一个 CPU 和一些内存(使用虚拟内存,此时 MMU 已经打开)。那里的代码设置内存映射、初始化所有子系统、设置中断处理程序、启动调度程序以便可以创建线程、开始与外围设备交互等。
除了引导加载程序,内核还有其他入口点:启用多核 CPU 上的内核时的入口点、中断处理程序、系统调用处理程序、故障处理程序……