【Linux内核学习】开机引导

发布时间:2024年01月03日

基于内核0.11分析

CPU只能从内存执行程序,不能从硬盘运行。刚开机时,内存中是空的,电脑上电的瞬间,根据CPU硬件的设计:加电就进入16位实模式状态运行,同时CPU的CS、IP寄存器被设置为0xF000、0xFFF0,指令的内存地址设置为0xFFFF0(CS:代码段寄存器,IP:指令指针寄存器,这对寄存器用于确定CPU正在执行的指令的内存地址:CS * 16 + IP),0xFFFF0指向BIOS的入口地址,此时CPU从0xFFFF0执行代码。

在实模式下,CPU的寻址方式是通过物理地址进行的,即直接使用段寄存器和偏移地址来计算出物理地址。由于实模式没有分页机制和内存保护机制,所以程序可以直接访问整个物理内存空间,包括操作系统内核和应用程序之间的内存。

通过双向约定,BIOS的第一条代码也设置在0xFFFF0,CPU物理寻址开始运行BIOS,
其中的操作有机器自检、加载BIOS中断向量表、BIOS数据区、BIOS中断服务程序到内存中,最后发送BIOS中断0x19 ,中断向量表中0x19会把CPU指向0x0E6F2,即0x19中断对应的中断服务程序入口地址,功能就是将启动盘的引导分区加载到内存中(根据双向约定,引导分区应位于整个硬盘的0磁道0柱面1扇区)。

Linux0.11内核的引导程序就是bootsect,到这其实代码进入了内核的代码段了,紧接着由bootsect规划内存,然后通过调用BIOS之前加载在内存中的中断0x13(功能是把指定扇区加载到指定内存位置)把setup加载到内存(紧挨着bootsect地址之后),以及系统模块载入到内存,确定根设备号之后,开始运行setup。

setup第一件事利用BIOS的中断程序从设备提取内核所需的机器系统数据,包括光标位置、显示页面、硬盘参数表1、硬盘参数表2、根设备号等数据。这些数据被加载到0x90000-0x901fc,为之后的main行数执行发挥作用。

文章来源:https://blog.csdn.net/qq_38202733/article/details/135352761
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。