os学习笔记二(x86的启动加载和分区)

原创 2004年06月29日 11:17:00

这也是一个翻译的文章,出处是http://www.nondot.org/sabre/os/files/Booting/x86Bootstrapping.html

值得注意的:
    下面说到的NetBSD的知识可能已经过时了,因为大概在NetBSD-1.3的时候就已经修改成为由一个block-list来装载次要的bootstrap(站了一晚说:http://www.douzhe.com/project/fbsd2/7.htm 这里解释到:启动一个计算机和加载操作系统的过程通常被叫做“bootstrap process”
或简单地叫“booting”。)和单独的库文件(libsa), 并且由另外的程序(installboot)来完成设置.

前言:
    这篇文章将尽力讲述分区,启动顺序和Intel 80x86平台上面的进行这些管理的程序.可能从一个简单的例子开始讲解是最简单的阐述分区和启动顺序的方法,并且适当地逐渐地加上一些复杂的东西.我们将会从一个单操作系统的配置开始,并且会逐渐引入复杂的例子.作者对由文章导致的损坏不负担任何责任,因为作者的目的只是为大家提供参考.
    我正在尝试写一个统一的系列文档,读起来就像是你自己的冒险书,因为你可以看到电脑是如何找到它的目标分区的.请告诉你对我这个主意的看法.我可能为了防止枯燥会在文章中不断地提供常见的例子.
    虽然我认为我也应该像正常人一样把这些写在前面,但是这里的确不是一个FAQ.同时这样也会导致非常糟糕的文章结构.

处理器的启动步骤:
    Intel x86系列的处理器是从硬件的reset开始的,初始化所有的cache,register和buffer把其中的值设置为所需要的值.很快转为实模式.EIP被设置为0000FFF0H,CS作为段选择器指向基址FFFF0000H.因为程序的执行由FFFFFFF0H开始(CS:EIP)----即距物理内存(EPROM)顶部60bytes处.这个EPROM通常被用到的是低端的地址,但是会被系统的一些芯片给重新映射到高端地址(比如Intel 430HX).值得注意的是,这里选择子/基址的对应关系同实模式下面编程时的对应关系是不一样的.通常,PC中的这个EPROM将会设置一个实模式下面的IDT并且跳到BIOS去执行.

单操作系统,单磁盘:
    最简单的配置是在单磁盘环境下面的单操作系统,比如,你可能在你唯一的SCSI磁盘上面只装了一个NetBSD(你用的难道不是SCSI?).
启动步骤:
1.BIOS装载器产生一个0x19的中断,这个中断通常是把软驱或者硬盘的第一个扇区(CHS<Cylinder Header Sector>的0:0:1地址)装载到0000:7C00.在这个例子里面,第一个扇区是首要的bootstrap loader.
   BIOS检查这个扇区的最后两个byte是否是AA55H(站了一晚说:见学习笔记一),如果不是的话,你可能会得到一个BIOS相关的信息(比如说非系统盘或者非启动盘)或者系统会被挂起.
2.首要的bootstrap loader主要任务之一是装载二级的bootstrap loader.首要bootstrap loader的代码是在/usr/mdec/??boot,在这里是在/usr/mdec/sdboot.这是由某个目录里面的代码产生的,在这里是/sys/arch/i386/boot/.
   首要bootstrap loader检查磁盘的第一个扇区并且查看称之为硬盘分区表(hard partition table)的东西.它会检查一个分区里面系统的硬盘分区表的system id是否为165
   它会读入这个NetBSD的硬盘分区的第一到第十四个扇区.在这里,它会读取0:0:1到0:0:14.它会把这些数据(包括它自己和二级bootstrap loader)一齐读进0000:1000H (FreeBSD和Mach会读到更高的地址段).选择这里是因为最底端的4k被用做BIOS的临时暂存区域(scratch area).
   如果没有次要bootstrap loader 你可能会看到NetBSD返回的下面的出错信息:"没有可启动的分区"或者"读取错误".
   假如一切都正常的话,执行会跳到刚才装载了代码的位置执行----即二级bootstrap loader.
3.NetBSD的二级bootstrap loader可以通过它本身提供的提示来辨识.它由/usr/mdec/??boot来实现,在这里是/usr/mdec/sdboot
   典型的提示如下:
>> NetBSD BOOT: xxxx/yyyy k []
use hd(1,a)/netbsd to boot sd0 when wd0 is also installed
Boot: [[[sd(0,a)]/netbsd][-adrs] :-
   (土星语:这段不清楚,干脆不翻了,以后再说,谁知道的帮忙翻一下)The NetBSD secondary bootstrap is designed to load the kernel. It has no device drivers, so that means you'll have to boot off stuff your BIOS 
recognizes (i.e. the first two drives). The stuff about hd is only relevant if you have both SCSI and IDE controllers in your machine, and is a kluge to 
compensate for the way the BIOS works.
   Bootstrap寻找你选择的内核.然后内核就能把装进内存里面.因为内核可能大于512k或者640k,这样二级bootstrap必须在实模式(可以调用BIOS的功能)和保护模式(可以访问更多内存)之间切换.当你选择了一个驱动器的时候,或者某个驱动器本身就被设置为了默认启动以后,它就会从驱动器的标签中读取分区表.这样的描述实际上掩盖了许多小细节,后面我会详细的叙述的.假设已经设置为默认的了,让我们接着说启动sd(0,a)/netbsd文件.
   和首要bootstrap的机制一样,二级bootstrap会在sd0上面寻找一个具有NetBSD系统id的硬盘分区,然后寻找此硬盘分区的标签,这里保存了一个内嵌的Unix分区表.
   Unix分区表不过是一个"分区"的列表(在FreeBSD中称为slice,但实际上是同一个东西)和每个分区的地址范围.它会寻找Unix的a分区(就是sd(0,a)中的a)并且寻找这个分区的开始位置,然后在文件系统的根目录寻找netbsd文件(根据leading slash<这是什么?土星也不知道>

吴恩达机器学习笔记_第二周

多元线性回归的情况: 符号表示方法,上标表示第几个样本,下标表示第几个特征。   多元线性回归的梯度下降: 当代价函数有多个参数时(即多个特征时):   使用梯度下降实用技...
  • hunterlew
  • hunterlew
  • 2016年04月11日 21:31
  • 2908

spark机器学习笔记:(一)Spark Python初探

声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents         Apache Spark是一个分布...
  • u013719780
  • u013719780
  • 2016年06月27日 14:20
  • 15102

zynq-7000学习笔记(四)——Zedboard HDMI核的构建和输出显示测试(2017/6/9补充修改)

参考: 1、【ZYNQ-7000开发之三】ZYNQ平台的HDMI驱动测试 2、   ADV7511 Xilinx Evaluation Boards Reference Design    ...
  • luotong86
  • luotong86
  • 2016年08月12日 22:49
  • 7769

X86分区虚拟化 - 多核初始化启动和GUEST OS初始化启动

最近在研究硬件分区虚拟化的模型实现方法,总结了一下,共享出来。需要先了解芯片的启动流程,以便加入Thin Hypervisor代码。下面以志强芯片为例,描述X86初始化流程多核初始化协议定义了两类处理...
  • leoufung
  • leoufung
  • 2015年09月28日 09:57
  • 625

游戏开发学习笔记-4.加载X模型

  • 2015年06月11日 17:38
  • 641KB
  • 下载

程序的加载和执行(二)——《x86汇编语言:从实模式到保护模式》读书笔记22

本博文对应原书13.3-13.4节的内容。 内容提要: 1. 显示处理器的品牌信息 2. 用户程序的头部结构 3. 加载用户程序到内存 4. 根据头部信息为用户建立各种段描述符...
  • u013490896
  • u013490896
  • 2016年03月22日 22:42
  • 1096

80x86汇编语言学习笔记(二)二次修改版

本来想上午搞定,但今天在外面逛了一天买东西。。。#相对昨天做了一些补充————2010/2/15##修改了有符号数使用CMP指令后标志CF和OF的值和两个操作数的大小关系——2010/2/23#这次总...
  • carbonsunsu
  • carbonsunsu
  • 2011年02月23日 22:42
  • 584

程序的加载和执行(三)——《x86汇编语言:从实模式到保护模式》读书笔记23

程序的加载和执行(三)——读书笔记23 接着上次的内容说,关于过程load_relocate_program的讲解还没有完,还差创建栈段描述符和重定位符号表。 内容提要: 1. 创建用户栈段描述符 2...
  • u013490896
  • u013490896
  • 2016年03月26日 18:28
  • 1438

程序的加载和执行(一)——《x86汇编语言:从实模式到保护模式》读书笔记21

程序的加载和执行(一)本文及之后的几篇博文是原书第13章的学习笔记。 本章主要是学习一个例子,对应的代码分为3个文件: ;代码清单13-1 ;文件名:c13_mbr.asm ;文件说明:硬盘主引...
  • u013490896
  • u013490896
  • 2016年03月20日 19:35
  • 1519

80X86汇编语言程序设计学习笔记

  • 2010年02月24日 09:27
  • 480KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:os学习笔记二(x86的启动加载和分区)
举报原因:
原因补充:

(最多只允许输入30个字)