系统引导.pptVIP

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
七、Linux系统启动过程 针对linux系统的单x86 cpu的版本 说在前面的话… 引导涉及到系统各个部分的数据结构,因此,只有随着课程的深入,才会彻底弄清楚引导程序中的初始化工作 不同OS的引导程序可能会不同,但是仍有一些普遍的原理可以遵循 前面的部分侧重代码,目的是为了说清楚一些基本概念,启动核心部分侧重原理,增强大家的感性认识 系统初始化所包括的内容 基础知识 系统引导 通过lilo进行引导 实模式下的系统初始化 保护模式下的系统初始化 启动核心 Init进程 7.1 基础知识 Linux源代码中的C语言代码 Linux源代码中的汇编语言代码:两种 完全的汇编代码,以.s作为文件名后缀 嵌入在c程序中的汇编代码。 C语言代码 Linux主体是用GNU的c语言编写 从c++中吸收了“inline”和“const” 支持“属性描述符”(attribute) 增加了新的基本数据类型“long long int”用于支持64位cpu 汇编语言代码 与一般的386汇编语言采用intel定义不同,它采用的是ATT定义的格式。主要差别如下: Intel中多使用大写字母,而这里大多使用小写字母 寄存器名前面要加“%”作为前缀, 指令的源操作数与目标操作数的顺序与intel的正好相反。ATT格式中,源在前,目标在后 汇编语言代码 访问内存的指令的操作数大小(即宽度)由操作码名称的最后一个字母决定,用作操作码后缀的字母有b(8位),w(16位),l(32位),e.g movb 直接操作数要加“$”作为前缀,intel中不用 基本格式 asm(“汇编语句” :输出寄存器 :输入寄存器 :会被修改的寄存器); 输出和输入寄存器统一按顺序编号,起始是%0 基础知识 Linux的启动是指从系统加电到控制台显示登录提示为止的运行阶段: 主要相关的代码是在arch/i386/boot中: bootsect.S,这是linux引导扇区的源代码 setup.S这是辅助程序的一部分 video.S这是辅助程序的另外一部分,用于引导过程中的屏幕显示 基础知识 另外,子目录compressed中还有两个源代码文件head.S,misc.c。用于内核映象的解压缩。也属于辅助程序一部分。 经过编译,汇编和连接后就形成三个部分:引导扇区的映象bootsetc,辅助程序setup和内核映象本身。 大小不超过508KB的内核引导映象称为小映象zImage;否则称为大内核bzImage 7.2 系统引导 加电开机后,intel cpu在实模式下工作,只能使用低端的640kb(即0XA0000以下)的内存空间(why?) 由ROM BIOS或者lilo将启动盘的第一扇区(引导扇区)的内容装入起始地址为0x7c00的内存空间,然后跳转到0x7c00开始执行引导扇区的代码 该引导扇区内的代码就是bootset.S汇编后生成的二进制代码 系统引导 该段代码(bootset.S)将自身转移到0x90000处,然后跳转到那里继续执行,并通过bios提供的“int 0x13”调用从磁盘上读入setup和内核的映象,然后跳转到setup的代码中,为执行内核映象做准备 对部分代码的解释如下所示: 系统引导-bootsect.S中的部分代码 movw $BOOTSEG, %ax movw %ax, %ds # %ds = BOOTSEG,将ds段寄存器设为0x7c00 movw $INITSEG, %ax movw %ax, %es # %ax = %es = INITSEG,将es段寄存器设为0x9000 movw $256, %cx #移动计数值=256 subw %si, %si #源地址ds:si=0x07c0:0x0000 subw %di, %di #目标地es:di=0x9000:0x0000 cld #清方向标志位 rep #重复执行直到cx=0 movsw #移动1个字 ljmp $INITSEG, $go #间接跳转,INITSEG指出跳转到的段地址 … go: movw $0x4000-12, %di # 0x4000 is an arbitrary value = # length of bootsect + length of # setup + room for stack; # 12 is disk parm size. movw %ax, %ds # 将ds,ss都置成移动后代码所在的段处0x9000 movw %ax, %ss movw %di, %sp # 设置堆栈put

文档评论(0)

ajgoaw + 关注
文档贡献者

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

1亿VIP精品文档

相关文档