- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
简析 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 行,
您可能关注的文档
最近下载
- 付鹏在汇丰私人银行内部演讲记录.pdf
- 特许经营业务的会计处理IFRIC12 A部分(中文).pdf
- 2025全国交管12123学法减分考试题库(附答案).pptx
- 湖北省十堰市2023-2024学年高二上学期期末调研考试 英语 Word版含答案.docx
- 【最新推荐】pcb焊接作业指导书-实用word文档-(9页).pdf VIP
- 一年一度喜剧大赛三板大斧子小品《反诈银行》台词完整版.docx VIP
- JTGT+3610-2019公路路基施工技术规范.pdf
- 政府会计课后习题答案.pdf VIP
- 2024年上海市16区高考英语一模试卷听力部分汇编(附14区听力音频)含答案与文本.docx VIP
- 2023-2024学年广东省深圳市七年级上学期期末地理试卷及答案.pdf VIP
文档评论(0)