操作系统启动过程分析(一)

一, 系统启动之前

  我们知道, 计算机中有各种内存设备, 比如内存条RAM, 主板上的ROM, 显存等, 这些设备有的时候都是独立的, 但在CPU看来, 这些内存是连续的, 所有的内存设备都可以组成一个"大内存", 大概可以用下面的图来描述:

  

  其中RAM在最底层, 主板的ROM在最顶层, 而显存等其它外围设备的内存位于中间. 主板的ROM中装有BIOS(基本输入输出系统), 大小一般都是64KB. 当然, 不同的计算机, 内存大小不一样, 所以BIOS所在的区域是从哪个地方开始, 都是不确定的. 但是对于Bochs虚拟机, 默认状态下BIOS位于0xFFFF0000 到 0xFFFFFFFF 这段区域.

  对于16位的8086计算机而言, 当我们按下电源, 主板通电, CPU此时是处于实模式的, CS寄存器的值位0xFFFF, 其他所有寄存器的值都是0x0000. 所以CS:IP 的值为0xFFF0.

  可以在Bochs中调试BIOS程序来验证, 如图所示:

    

  进入汇编级调试:

    $ ./dbg-asm    # 进入汇编级调试

  调试方法: 输入s, 代表 step, 即单步执行

  我们可以通电之后CS:IP指向的却是是0xfffffff0地址, 而BIOS的第一条语句的是jmp far f0000:e95b 这个意思是跳转到0x000fe05b地址处, 所以接下来就执行0x000fe05b地址处的指令了.

  这里有个问题, 就是刚开始就直接跳转了? 猜想可能是0xfffffff0到0xfffffff之间只有16个字节, 太少了, 存储不了几条指令, 如果不跳转, 那执行了几条指令后就没有指令执行了, 所以就必须要跳转到内存地址较低的地方. 但是为何不直接就从内存位置较低的地方开始执行呢? 我也不懂为何现在的BIOS都是这样设计的.

  然后一直单步执行, 就可以看到BIOS的所有指令了.

  直接启动Bochs虚拟机, 可以看到如下信息:

  

  从这里可以看到BIOS程序在屏幕上显示了一些硬件信息, 最后看到BIOS尝试让计算机从软盘(Floppy)开始启动, 却发现could not read the boot disk (不能读取到启动磁片), 然后提示No bootable device (没有可启动的设备)

二, bootsect程序执行

  实际上, BIOS最后的功能是将启动设备的第一个扇区的程序载入到0x7c00处. 这里的启动设备可以是软盘, 可以是光盘, 也可以是硬盘.

  首先执行./dbg-asm, 开始汇编级调试, 然后跳转到0x7c00处, 然后单步执行:

    

  调试方法: 输入 b 0x7c00 就表示把0x7c00处设置为断点, 然后输入c, 表示 continue

  用vim打开linux/boot/bootsect.s, 发现这里面的汇编程序和调试中的代码是一样的. 所以可以判断, linux中的bootsect.s就是操作系统启动的第一个模块了. 当

三, 编译bootsect.s并执行

  

  as86是汇编器, ld86是链接器, -0表示生成16位的目标程序, -a表示生成与GNU as和ld部分兼容的代码, -s告诉链接器ld86去除最后生成的可执行文件中的符号信息.

  bootsect模块应该位于启动设备的第1个扇区, 而一个扇区的大小只有512个字节, 但是编译成功之后却发现bootsect有544个字节, 原因是ld86链接器产生了minix可执行文件格式, 这就类似于在windows系统中, 每个可执行文件的头部都会有可执行文件格式, 没有这些信息程序就不能成功执行!

  要去掉这个头部的32个字节. 只需要用linux下的dd命令, 很方便就可以完成:

  

  执行结果就是将bootsect中的前32个字节忽略, 并将创建的新文件命令为Image

  将Image文件复制到linux-0.11目录下, 然后在bochs中启动:

  

  启动之后的结果如图所示:

  

  从这里可以发现bootsect在屏幕上显示了一条信息: Loading system ...

时间: 2024-10-11 11:32:49

操作系统启动过程分析(一)的相关文章

操作系统启动过程分析(二)

一, bootsect.s程序功能简要分析 下面这段代码就是bootsect的源程序, 这是Linus Torvalds在1991年写的 ! ! SYS_SIZE is the number of clicks (16 bytes) to be loaded. ! 0x3000 is 0x30000 bytes = 196kB, more than enough for current ! versions of linux ! SYSSIZE = 0x3000 ! ! bootsect.s (

[原创]Linux系统启动过程分析

经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一步探究.这当中就包括系统的启动流程.文件系统的组成结构.基于动态库和静态库的程序在执行时的异同.协议栈的架构和原理.驱动程序的机制等等. 本人在综合了现有网上大家智慧的基础上,结合对2.6.32的内核代码的研读,基于CentOS 6.0系统对Linux的启动流程做了些分析.由于才疏学浅,知识所限,有些地方分析不妥之处还请各位高手不吝赐教. OK,我们言归正传.对于一台安装了Linux系统的主机来说,当用户按下开机按钮时,一共要经

linux操作系统启动流程一

linux系统的启动流程: POST --> BootSequence(BIOS) --> bootloader --> kernel [-->ramfs] --> rootfs[ro]--> /sbin/init --> 设定默认运行级别 --> 进行系统初始化 --> 并行执行ctrl+alt+del热键功能定义,系统服务的开启和关闭,电源的管理,dbus管理 -->登录提示符 在我们linux系统的启动过程中存在着这样的启动流程,下面我们一

操作系统启动区的基本知识

操作系统启动过程在计算机开机时,boot被自动执行,指引CPU把操作系统从大容量存储器中传送到主存储器的易失区.一旦操作系统放到了主存储器中,boot要求CPU执行一条转移指令,转到这个存储区域,在这个时候,操作系统接管并且开始控制整个机器的活动. 计算机的存储器分为 大容量存储器(通常为硬盘)和 主存储器(即 内存),操作系统(如 windows.UNIX. Linux. Mac OS)安装在大容量存储器上,而主存储器又分为两部分:能够永久保存数据的ROM(Read Only Memory)和

Linux操作系统启动管理器-grub

一.GRUB简介 GRUB(GRand Unified Bootloader简称"GRUB")是一个来自GNU项目的多操作系统启动程序.GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统.GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数. =================================================================================

浅谈-LINUX 操作系统启动过程

LINUX 操作系统启动过程 通过一段时间的学习已经对linux有了一定的了解,接下来就开始研究一下linux 操作系统的启动过程吧.当然这是为了让大家比较容易发现linux启动过程中容易发生问题的地方以及解决办法. 目录 一.简述 二.详解 1.BIOS加电自检 2.读取MBR 三.加载内核 1.Grub引导分为三个阶段 2.Stage1.5阶段存在的原因 3.详解三阶段引导过程 四.调用init进程 1.init的功能作用 2.init初始化流程 3.init 执行 run-level 的各

Linux操作系统启动管理器GRUB

转载:http://58vpn.blog.sohu.com/309434214.html [GRUB是什么]GNU GRUB(简称"GRUB")是一个来自GNU项目的启动引导程序.GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统.GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数.GRUB是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任

linux 下 osw随操作系统启动而自动启动的标准脚本

linux 下 osw随操作系统启动而启动的标准脚本.osw是指--os watcher,这是一个监控os各项指标的shell脚本.osw的监控数据一般用于oracle技术人员评估os各项资源的使用情况,该使用情况会作为oracle 技术人员评估一些oracle 数据库行为(比如节点驱逐等)的参考依据. [[email protected] ~]$ cat /etc/rc.local #!/bin/sh # # This script will be executed *after* all t

linux操作系统启动流程和光盘镜像制作

1.简述linux操作系统启动流程 POST (加电自检):自检主要硬件设备如:CPU.内存.硬盘是否正常,以及输入输出设备是否存在问题等. BIOS(Boot Sequence):BIOS(基本的输入输出系统)装载在硬件芯片CMOS之上,自检时会启动这个程序,并根据CMOS上的配置信息去读取其他的硬件信息,检测正常之后进行硬件设备的初始化. 读取MBR:引导加载程序,在MBR(主引导记录)中,主要功能是识别,加载系统的核心文件,并提交到内存中运行来启动对应的系统. Kernel运行:Kerne