1.linux是如何从硬盘读出的
2.linux在启动的时候是如何拿到这些硬件参数的
3.linux在初始运行中都做了什么
trap.c trap_init()
mktime.c time_init()
sched.c sched_init()
BIOS/Bootloader
由pc机的BIOS(0xFFFF0是BIOS存储的总线地址)把bootsect从某个固定地址拿到内存中的某个固定地址(0x90000),并进行了一系列的硬件初始化和参数设置
bootsect.s
磁盘引导块程序,在磁盘的第一个山区中的程序(0磁道 0磁头 1扇区)
作用:首先将后续的setup.s代码从磁盘加载到紧接着bootsect.s的地方
在显示屏上显示loading system再将system(操作系统)加载到0x10000的地方
最后跳转到setup.s中去运行
setup.s
解析BIOS/BOOTLOADER传递来的参数
设置系统内核运行的LDT(局部描述符) IDT(终端描述符寄存器)全局描述符(设置全局描述符寄存器)
设置中断控制芯片,进入保护模式运行(svc32保 护模式,设置寄存器中的值)
跳转到SYSTEM模块的最前面的代码运行(head.s)
head.s
加载内核运行时的各数据段寄存器,重新设置中断描述符表
开启没和正常运行时的协处理器等资源
设置内存管理的分页机制
跳转到main.c开始运行