- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
简析linux内核的执行流程
从bootsect.s到main.c(内核版本0.11)
Linux启动的第一阶段(从开机到main.c)3个任务:
A、启动BIOS,准备实模式下的中断向量表和中断服务程序。
B、从启动盘加载操作系统程序到内存。
C、为执行32的main函数做过渡准备。
内存变化如下:
、0xFE000到0xFFFFF是BIOS启动块,其中上电后第一条指令在0xFFFF0。
、而后0x00000到0x003FF总共1KB存放中断向量表,而接下去的地址到0x004FF共256B存放BIOS数据,从0x0E05B开始的约8KB的内存中存放中断服务程序。
、利用BIOS中断0x19h把硬盘的第一扇区bootsect.s的代码加载到内存中,即0x07c00处,后转到该处执行。
、将bootsect.s的代码复制到0x90000处。
、利用中断0x13h将setup.s程序加载到内存0x90200处。
、再将剩余的约240个扇区的内容加载到0x10000~0x2EFFF处。
、开始转到setup.s处执行,第一件事就利用BIOS提供的中断服务程序从设备上获取内核运行的所需系统数据并存在0x90000的地址处,这时将原来bootsect.s的代码覆盖得只剩2Byte的空间。
、关中断并将系统代码复制到0x00000处,将原来放在这里的中断向量表与BIOS数据区覆盖掉,地址范围是0x00000~0x1EFFF。同时制作两表与两寄存器。
开地址线A20,寻址空间达到4GB,后对8259重新编程,改变中断号。
、转到head.s(大小是25K+184B)执行,执行该程序完后是这样的:
0x00000~0x04FFF:页目录与4个页表,每一项是4KB,共20KB;
0x05000~0x05400:共1KB的空间是软盘缓冲区;
0x05401~0x054b8:共184B没用;
0x054b9~0x05cb8:共2KB的空间存中断描述符表;
0x05cb9~0x064b8:共2KB的空间存全局描述符表;
之后就是main函数的代码了!
第二阶段、从main.c函数到系统准备完毕阶段。
第一步:创建进程0,并让进程0具备在32位保护模式下载主机中的运算能力。流程是:
复制根设备和硬盘参数表 (main.c中的102、110、111行)
物理内存规划格局(main.c的112行~126行,其中有
rd_init函数定义在kernel/ramdisk.c中,此函数用于 虚拟盘初始化;而mem_init函数是用于内存管理结构 初始化,定义在mem/memory.c中,该函数页面使用
虚拟盘设置与初始化 次数均设置成100,然后再依据主内存的 起始位置和终止位置将处于主内存的所有页面的使 用次数全部清零,系统以后把使用次数为0的页面 视为空闲页面。)
内存管理结构mem_map初始化
异常处理类中断服务程序挂接(在main.c的127行,trap()函数定义
kernel/trap.c,目的是将各种中断与中断描述符表挂 接。)
初始化块设备与字符设备请求项结构(在main.c的128、129行, blk_dev_init() 定义在 kernel/blk_dev/ll_rw_blk.c,
chr_dev_init()定义在kernel/chr_dev/tty_io.c)
将串口与显示器外设的中断服务程序挂接(在main.c的130行,
tty_init()定义在kernel/chr_dev/tty_io.c)
开启时间设置(在main.c的131行,time_init()定义于main.c函数
76行startup_time)
系统开始激活进程0(在main.c的131行,sched_init()定义在kernel/
sched.c函数中,该函数实现进程相关事务设置
依据时钟中断设置,系统调用服务程序挂接。系统调用函数是对用户程序的最基本支持,利用的是
进程相关事务初始化设置 系统调用软中断,详细见下面讲
的。)
时钟中断设置
系统调用服务程序挂接
初始化缓冲区管理结构(在main.c中133行, buffer_init(buffer_memory_end)定义 fs/buffer.c)
初始化硬、软盘(main.c中134、135行,hd_init与floppy_init定义 于kernel/blk_drv/hd.c和ker
文档评论(0)