Linux011引导启动与初始化_第1页
Linux011引导启动与初始化_第2页
Linux011引导启动与初始化_第3页
Linux011引导启动与初始化_第4页
Linux011引导启动与初始化_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

引导启动和系统初始化李韩超—2015/06/02引导启动程序(boot)

bootsect.s(磁盘引导块程序)

head.s(与内核其他程序一起链接成system模块)

汇编程序

setup.s(操作系统加载程序)

初始化程序(init)

main.cC程序引导启动Bootsect.s将由BIOS读入到内存绝对地址0x7C00(31KB)处,当它被执行时就会把自己移动到绝对地址0x90000(576KB)处,并把启动设备后2KB字节代码(setup.s)读入到内存0x90200(576.5KB)处,而内核的其他部分(system模块:head.s和main.c)则被读入到从内存地址0x10000(64KB)开始处。虚线表示setup.s程序把system模块移动到物理内存其实位置处(这样system模块中代码的地址也即等于实际的物理地址,便于对内核代码和数据操作)代码注释//bootsect.s被bios启动子程序加载至0x7c00处,并将自己移到了0x90000处,并跳转到那里。//然后它使用BIOS中断将setup直接加载到自己的后面0x90200处,并将system加载到0x10000处!设备号0x306指定根文件系统设备是第二个硬盘的第一个分区几个程序的开始地址ds寄存器:bootsect程序的原始地址es寄存器:bootsect被移到的地址Sub

ai,b

:ai=ai-b减法Si寄存器清零47-56行的作用是将自身(bootsect)从目前段位置0x07c0移动到0x9000处,共256字,然后跳转到移动后代码的go标位处由int指令引发的中断,读磁盘扇区到内存intnn为中断类型码,它的功能是引发中断过程Jnc标志位JumpnotCarry:没进位时跳转68-77行的作用是利用BIOS中断INT0x13将setup模块从磁盘第二个扇区开始读到0x90200开始处,共读4个扇区。如果读出错,则复位驱动器,并重试判断是否成功,成功则继续初始化程序(init)

12

3

4

5

利用之前去的的系统参数设置系统的根文件设备号以及一些内存全局变量(主内存的开始地址,系统所拥有的内存容量,作为高速缓冲区内存的末端地址)

239

内核进行所有方面的硬件初始化工作(陷阱门,块设备,字符设备和tty),还有人工设置第一个任务(task0)。

待所有初始化工作完成后程序就设置中断允许标志以开启中断,并切换到任务0中运行

-----------以上是内核的初始化--------------------

内核将执行权切换到用户模式(任务0),也即CPU从0特权级切换到第三特权级。

此时main.c的主程序就工作在任务0中,然后系统调用fork()创建出一个用于运行init()的子进程,并在其中调用init()函数。

进程1执行时原进程0则会在系统空闲时被调度执行,因此进程0也被称为idle进程。

此时进程0仅执行pause()系统调用,并又会调用调度函数。

在该函数中程序将继续进行应用环境的初始化并执行shell登录程序。

init()函数的功能:1.安装根文件目录;2.显示系统信息

3.运行系统初始资源配置文件rc中的命令

4.执行用户登录shell程序

首先代码调用系统调用setup(),用来收集硬盘设备分区表信息并安装根文件系统

根文件系统:

内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。

然后init()打开一个终端设备tty0,并复制其文件描述符以产生标准输入stdin,标准输出stdout和错误输出stderr设备。

内核随后利用这些描述符在终端上显示一些系统信息。init()又创建一个进程2,并在其中为建立用户交互使用环境而执行一些初始配置操作。

*用户交互使用环境即shell程序:一种具备特殊功能的程序,它是介于使用者和UNIX/linux操作系统之核心程序(kernel)间的一个接口

具体操作:内核调用/bin/sh程序,首先通过关闭文件描述符0,并立即打开配置文件etc/rc,从而把标准输入stdin定向到etc/rc文件上。然后再执行shell处理rc。

最后,在新建进程中为用户建立一个新的会话,并运行用户登录shell程序代码注释Inline内嵌语句,这里使用内嵌语句主要是防止弄乱堆栈。具体可以去看书!内嵌语句,几个系统调用中断一些系统文件Extern:extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。系统各部分初始化//这段宏读取CMOS实时时钟信息。outb_p和inb_p是include/asm/io.h中定义的端口输入输出宏//定义宏,将BCD码转化为二进制数值(因为CMOS中存的都是BCD码)设置系统时间//内核初始化主程序。初始化结束后将以任务0的身份运行//内核进行所有方面的初始化工作//空闲时无限循环pause()--------------以上是main()即内核初始化-----------------------//产生格式化信息并输出到标准输出设备stdout(1),即屏幕//fork()创建子进程(进程2),子进程返回0,父进程返回pid//exit()退出时的出错码1---操作未许可;2—文件或目录不存在子进程//关闭句柄0:stdin//以只读方式打开/etc/rc//句柄:标识应用程序中的不同对象和同类对象中的不同的实例//execve:execve(执行文件)在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序(shell程序)(接上)186-188:父进程等待子进程的结束。&i是存放返回状态信息的位置。如果wait()返回值不等于子进程号,则继续等待。//创建子进程失败//关闭stdin,stdout,stderr

//再次执行系统解释程序/bin/sh//复制一个现有的句柄,产生一个与“源句柄特性”完全一样的新句柄

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论