| 贵 州 学 习 网 |
|
5.实例分析:grub ? grub是: ? grand unified bootloader的缩写 是一个灵活而强大的boot loader? ? 其能够理解多种不同的文件系统和可执行文件格式,从而能够引导多种os 通过将boot? loader所需要的功能封装成一套脚本语言,从而能够按照特定的方式引导os ? grub的i/o 支持chs和lba两种磁盘访问模式? ? (device[,part-num][,bsd-subpart-letter])的方式访问设备:(hd0), (hd1, 0), (hd0, a), (hd0, 1, a) 文件访问? ? 通过路径形式访问:/boot/grub/menu.lst ? 通过扇区形式访问:0+1,200+1,300+300 ? grub的脚本: root指定一个启动的设备? ? kernel指定操作系统的内核 boot正式启动一个os? makeactive激活一个分区? ? chainloader调用启动设备上的boot loader ? 启动linux root (hd0,0)? kernel? /vmlinuz root=/dev/hda1 boot? ? 启动windows root (hd0,0)? ? chainloader +1 makeactive? boot? ? grub的组成 stage1? ? grub的第一部分,安装在mbr或者boot sector中 ? 用于引导stage2或者stage1.5 stage2? ? grub的核心影像,用于提供grub的主要功能 stage1.5? ? stage1与stage2之间的桥梁,安装在0磁道上第一个扇区之后 ? stage1不理解文件系统,但是stage1.5可以 ? stage1.5最终调用stage2 nbgrub/pxegrub? ? grub的网络启动模块 ? stage1的结构 ? 为了保持和fat/hpfs bios的兼容性,所以保存bpb 在bpb之后的stage1配置数据区,在安装的时候被填写? ? 在数据区之后,才是代码段 最后是0xaa55启动扇区标志? ? ? stage1的流程 ? 在stage1的配置数据区中存放了stage2所在的磁盘号、lba地址以及stage2的载入地址 ? stage1不需要理解任何的文件系统,只需要根据给出的扇区号,读入stage2的第一个扇区即可 stage1相当于前面分析的mbr中的boot? loader ? stage2的第一部分start.s start.s存放在stage2文件的第一个扇区里面? ? stage2剩余部分的lba地址和内存的载入地址是放在start.s的firstlist和lastlist之间的,这个数据段位于start.s代码的尾部,在安装的时候被写入,称为block list block list以全0项结尾? ? stage2的第一部分start.s ? 在start.s的代码开始执行的时候,ds:si所指向的内存地址的内容是stage1中准备好的,用于为int 13h调用准备参数 ? start.s的功能就是根据block list,将stage2剩余的部分读入内存,然后跳转到0x8200h处执行stage2的功能代码 ? stage2的第二部分asm.s 在asm.s中定义了一系列的函数的实现,包括grub得主入口函数main? ? 在main函数中,完成了如下的工作: ? ds = es = ss = 0 ? 建立实模式/bios栈,esp = 0x2000 - 0x10,向低地址方向增长 ? 转入保护模式 ? 建立并清空保护模式栈 ? 调用cmain,进入grub的c代码中(stage2.c) ? 在cmain中,完成了如下的工作: ? 设法打开/boot/grub/menu.lst这个配置文件 根据配置文件,构建用户菜单? 如果菜单构建成功,则调用run_menu? ? 如果菜单构建失败,则调用enter_cmdline ? 问题:文件系统 在这个时候,grub已经开始访问文件系统? ? grub如何对付不同的文件系统? ? grub中的文件系统层:disk_io.c grub中为每一个文件系统提供了一个抽象层? ? 文件系统用fsys_entry描述(filesys.h) struct fsys_entry { char *name; int (*mount_func) (void); int (*read_func) (char *buf, int len); int (*dir_func) (char *dirname); void (*close_func) (void); int (*embed_func) (int *start_sector, int needed_sectors); }; ? 全局变量fsys_table包含了grub支持所有文件系统,通过fsys_table和fsys_type,从而可以以统一的方式访问不同的文件系统 ? grub中的命令处理:buildin grub支持的每个命令,均有一个buildin和其对应? ? 这些buildin被定义在buildins.c中 分析以下3个命令:? chainloader? kernel? ? boot ? chainloader
内存管理之段页机制 by lxwpp
内存地址空间概念 ->逻辑地址:是指由程序产生的由段选择符和段内偏移地址两个部分组成的地址。
分段机制 段的描述符:描述段的属性的一个8字节存储单元)x\yTUz88:[ 此文转贴于我的学习网电脑课堂LINUX教程 http://www.Gzu521.com])x\yTUz88: 段描述符的一般格式 |
责任编辑:gzu521