linux内核的内核执行流程教程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux内核的内核执行流程教程

简析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位保护模式下载主机中的运算能力。 进程0:Linux引导中创建的第一个进程,完成加载系统后,演变为 HYPERLINK /search?word=%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6fr=qb_search_expie=utf8 \t _blank 进程调度、交换及存储管理进程 进程1:init 进程,由0进程创建,完成系统的初始化. 是系统中所有其它用户进程的祖先进程 流程是: 复制根设备和硬盘参数表 (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

文档评论(0)

shuwkb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档