分享
 
 
 

FreeBSD操作系统的boot2阶段

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

也许你想知道,为什么boot2是在boot0之后,而不是在boot1之后。事实上,也有一个512字节的文件boot1存放在目录/boot里,那是用来从一张软盘引导系统的。从软盘引导时,boot1起着boot0对硬盘引导相同的作用:它找到boot2并运行之。

你可能已经看到有一文件/boot/mbr。这是boot0的简化版本。mbr中的代码不会显示菜单让用户选择,而只是简单的引导被标志的分区。

实现boot2的代码存放在目录sys/boot/i386/boot2/里,对应的可执行文件在/boot里。在/boot里的文件boot0和boot2不会在引导过程中使用,只有boot0cfg这样的工具才会使用它们。boot0的内容应在MBR中才能生效。boot2位于可引导的FreeBSD分区的开始。这些位置不受文件系统控制,所以它们不可用ls之类的命令查看。

boot2的主要任务是装载文件/boot/loader,那是引导过程的第三阶段。在boot2中的代码不能使用诸如open()和read()之类的例程函数,因为内核还没有被加载。而应当扫描硬盘,读取文件系统结构,找到文件/boot/loader,用BIOS的功能将它读入内存,然后从其入口点开始执行之。

除此之外,boot2还可提示用户进行选择,loader可以从其它磁盘、系统单元、分区装载。

boot2 的二进制代码用特殊的方式产生:

sys/boot/i386/boot2/Makefile

boot2: boot2.ldr boot2.bin ${BTX}/btx/btx

btxld -v -E ${ORG2} -f bin -b ${BTX}/btx/btx -l boot2.ldr

-o boot2.ld -P 1 boot2.bin

这个Makefile片断表明btxld(8)被用来链接二进制代码。BTX表示引导扩展器(BooT eXtender)是给程序(称为客户(client))提供保护模式环境、并与客户程序相链接的一段代码。所以boot2是一个BTX客户,使用BTX提供的服务。

工具btxld是链接器,它将两个二进制代码链接在一起。btxld(8)和ld(1)的区别是ld通常将两个目标文件链接成一个动态链接库或可执行文件,而btxld则将一个目标文件与BTX链接起来,产生适合于放在分区首部的二进制代码,以实现系统引导。

boot0执行跳转至BTX的入口点。然后,BTX将处理器切换至保护模式,并准备一个简单的环境,然后调用客户。这个环境包括:

虚拟8086模式。这意味着BTX是虚拟8086的监视程序。实模式指令,如pushf, popf, cli, sti, if,均可被客户调用。

建立中断描述符表(Interrupt Descriptor Table, IDT),使得所有的硬件中断可被缺省的BIOS程序处理。建立中断0x30,这是系统调用关口。

两个系统调用exec和 exit的定义如下:

sys/boot/i386/btx/lib/btxsys.s:

.set INT_SYS,0x30

# 中断号

#

# System call: exit

#

__exit:

xorl %eax,%eax

# BTX系统调用0x0

int $INT_SYS

#

#

# System call: exec

#

__exec:

movl $0x1,%eax

# BTX系统调用0x1

int $INT_SYS

#

BTX建立全局描述符表(Global Descriptor Table, GDT):

sys/boot/i386/btx/btx/btx.s:

gdt:

.word 0x0,0x0,0x0,0x0

# 以空为入口

.word 0xffff,0x0,0x9a00,0xcf

# SEL_SCODE

.word 0xffff,0x0,0x9200,0xcf

# SEL_SDATA

.word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE

.word 0xffff,0x0,0x9200,0x0 # SEL_RDATA

.word 0xffff,MEM_USR,0xfa00,0xcf# SEL_UCODE

.word 0xffff,MEM_USR,0xf200,0xcf# SEL_UDATA

.word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS

客户的代码和数据始于地址MEM_USR(0xa000),选择符(selector) SEL_UCODE指向客户的数据段。选择符 SEL_UCODE 拥有第3级描述符权限(Descriptor Privilege Level, DPL),这是最低级权限。但是INT 0x30 指令的处理程序存储于另一个段里,这个段的选择符SEL_SCODE (supervisor code)由有着管理级权限。正如代码建立IDT(中断描述符表)时进行的操作那样:

mov $SEL_SCODE,%dh

# 段选择符

init.2:

shr %bx

# 是否处理这个中断?

jnc init.3

# 否

mov %ax,(%di)

# 设置处理程序偏移量

mov %dh,0x2(%di)

# 设置处理程序选择符

mov %dl,0x5(%di)

# 设置 P:DPL:type

add $0x4,%ax

# 下一个中断处理程序

所以,当客户调用 __exec()时,代码将被以最高权限执行。这使得内核可以修改保护模式数据结构,如分页表(page tables)、全局描述符表(GDT)、中断描述符表(IDT)等。

boot2 定义了一个重要的数据结构:struct bootinfo。这个结构由 boot2 初始化,然后被转送到loader,之后又被转入内核。这个结构的部分项目由boot2设定,其余的由loader设定。这个结构中的信息包括内核文件名、BIOS提供的硬盘柱面/磁头/扇区数目信息、BIOS提供的引导设备的驱动器编号,可用的物理内存大小,envp指针(环境指针)等。定义如下:

/usr/include/machine/bootinfo.h

struct bootinfo {

u_int32_t

bi_version;

u_int32_t

bi_kernelname;

/* 用一个字节表示 * */

u_int32_t

bi_nfs_diskless;

/* struct nfs_diskless * */

/* 以上为常备项 */

#define bi_endcommon

bi_n_bios_used

u_int32_t

bi_n_bios_used;

u_int32_t

bi_bios_geom[N_BIOS_GEOM];

u_int32_t

bi_size;

u_int8_t

bi_memsizes_valid;

u_int8_t

bi_bios_dev;

/* 引导设备的BIOS单元编号 */

u_int8_t

bi_pad[2];

u_int32_t

bi_basemem;

u_int32_t

bi_extmem;

u_int32_t

bi_symtab;

/* struct symtab * */

u_int32_t

bi_esymtab;

/* struct symtab * */

/* 以下项目仅高级bootloader提供 */

u_int32_t

bi_kernend;

/* 内核空间末端 */

u_int32_t

bi_envp;

/* 环境 */

u_int32_t

bi_modulep;

/* 预装载的模块 */

};

boot2 进入一个循环等待用户输入,然后调用load()。如果用户不做任何输入,循环将在一段时间后结束,load() 将会装载缺省文件(/boot/loader)。函数 ino_t lookup(char *filename)和int xfsread(ino_t inode, void *buf, size_t nbyte) 用来将文件内容读入内存。/boot/loader是一个ELF格式二进制文件,不过它的头部被换成了a.out格式中的struct exec结构。load()扫描loader的ELF头部,装载/boot/loader至内存,然后跳转至入口执行之:

sys/boot/i386/boot2/boot2.c:

__exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),

MAKEBOOTDEV(dev_maj[dsk.type], 0, dsk.slice, dsk.unit, dsk.part),

0, 0, 0, VTOP(&bootinfo));

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有