- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux的启动过程.ppt
linux的启动过程 从BIOS启动到操作系统的怠速状态 从开机加电到main函数之前的过程 从开机到main函数的执行分三步完成,其目的是实现从启动盘加载操作系统程序,完成main函数所需的准备工作。 第一步,启动bios,准备实模式下的中断向量表和中断服务程序;第二部,从启动盘加载操作系统到内存,加载操作系统的工作就是利用第一步中准备的中断服务程序实现的;第三部,为执行32位的main函数做准备工作。 bios的启动原理简单叙述 硬件逻辑设计者将CPU逻辑硬件设计为加电瞬间强行将CS的值置为0XFFFF,IP的值置为0X0000,这样CS:IP就指向0XFFFF0这个位置,而BIOS的程序入口地址恰恰为0XFFFF0,BIOS程序的第一条指令就设计在这个位置上。 加载第一部分代码--引导程序(bootsect) 经过执行一系列的自检后,开始加载引导程序。 计算机硬件体系结构的设计与bios联手,会让CPU接收到一个int 19h中断,cpu接收倒这个中断,会立即找到int 19号中断向量,接下来中断向量把CPU指向0X0E6F2,这个是int 19号中断对应的中断向量服务程序。 加载第二部分代码--SETUP 操作系统的设计者要全面,整体地考虑内存的规划 1: bootsect对内存的规划,规划的代码如下: SETUPLEN = 4 BOOTSEG = 0X07C0 INITSEG = 0X9000 SETUPSEG = 0X9020 SYSSEG = 0X10000 ENDSEG = SYSSEN + SYSSIZE 将Setup程序加载到内存中 加载setup这个程序要借助BIOS的int 0x13号中断所指向的程序 这个程序与0x19号对应的程序不同,int 0x19号启动的程序是有BIOS执行的,而int 0x13是由linux操作系统自身的代码启动的。 这个程序将setup加载到0X90200处,是紧挨着bootsect的。 加载system模块 任然使用int 0x13中断,将其加载到0X10000处往后的120kb空间中。 system对于系统有着战略意义!! 开始向32位模式转变,为main函数的调用做准备 1关中断并将syste移动到内存的起始为止0X00000,代码如下: do_move: mov es, ax ;(0x00000) add ax, #0x10000 cmp ax, #0x90000 jz end_move mov ds, ax sub di,di sub si, si mov cx, #0x80000 设置中断描述符表和全局描述符表 从main到怠速 系统达到怠速状态前所作的一切准备工作的核心目的就是让用户程序能够以“进程”的方式运行,能够实现这一目标的标准包括三个方面:用户程序能够在主机上进行运行,能够与外设进行交互,以及能够让用户以它为媒介进行人机交互。 物理内存的规划 进程0在主机的运算主要是通过CPU和内存相互配合工作实现的,因此系统要对主机物理内存的使用进行规划,这样才能使进程0具备运算能力,除了内核区外,其余物理内存要完成的工作是不同的,“主机内存”主要是来承载进程的相关信息,如:task_struct ,缓冲区主要作为主机与外设进行数据交互的中转站; 系统主要根据内存条的大小对主内存“,”缓冲区“进行设置, 进程0创建前的准备工作 异常处理程序与中断描述符表挂接 初始化设备请求项 设置开机时间 * * 这个程序将引导程序加载到0X07C00处。 为什么是0X07C00处?? 2 复制bootsect 接下来,bootsect启动程序将它自身从内存的0x07c00复制到0X90000处。 mov ax, #BOOTSEG mov ds , ax mov es , ax mov cs, #256 sub si , si sub di, di rep movw jmpi go, INITSEG go:mov ax, cs mov ds, ax 这是一段很有趣的代码,大家看看,自己先分析分析!! 现在bootsect的任务已经完成 下面通过jmpi 0, SETUPSEG这条语句跳转至0X90200处(setup处),开始执行setup。 setup利用BIOS程序提取内存运行的所需系统数据这些数据将覆盖bootsec程序所在区域。共510个字节,这种方式对内存的使用率极为高效。 到目前为止操作系统内核的加载工作已经完成。接下来系统通过加载到内存中的代码,将实现从实模式到保护模式的转换。 rep movsw jmp do_move 理解这样做的意义吗??? 内核代码: lidt ldt_48 lgdt gdt_4
文档评论(0)