admin 管理员组文章数量: 1087135
2024年6月9日发(作者:java 生成pom)
Linux Kernel学习笔记——启动
启动
当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0
处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初
始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x7C00,并开
始执行此处的代码.这就是对内核初始化过程的一个最简单的描述。
最初,Linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将
自己装入到绝对地址0x90000,再将其后的2k字节装入到地址0x90200处,最后将核心
的其余部分装入到0x10000。
当系统装入时,会显示信息。装入完成后,控制转向另一个实模式下的
汇编语言代码boot/Setup.S。Setup部分首先设置一些系统的硬件设备,然后将核心从
0x10000处移至0x1000处。这时系统转入保护模式,开始执行位于0x1000处的代码。
接下来是内核的解压缩。0x1000处的代码来自于文件Boot/head.S,它用来初始化
寄存器和调用decompress_kernel()程序。decompress_kernel( )程序由
Boot/inflate.c, Boot/unzip.c和Boot/misc.c组成。解压缩后的数据被装入到了
0x100000处,这也是Linux不能在内存小于2M的环境下运行的主要原因。
解压后的代码在0x1010000处开始执行,紧接着所有的32位的设置都将完成: IDT、
GDT和LDT将被装入,处理器初始化完毕,设置好内存页面,最终调用start_kernel过
程。这大概是整个内核中最为复杂的部分。
[系统开始运行]
Linux kernel最早的C代码从汇编标记startup_32开始执行
|startup_32:
|start_kernel
|lock_kernel
|trap_init
|init_IRQ
|sched_init
|softirq_init
|time_init
|console_init
|#ifdef CONFIG_MODULES
|init_modules
|#endif
|kmem_cache_init
|sti
|calibrate_delay
|mem_init
|kmem_cache_sizes_init
|pgtable_cache_init
|fork_init
版权声明:本文标题:Linux Kernel学习笔记——启动 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1717899550a714583.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论