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