学习网考试学习资料

Gzu521.com

Linux学习笔记(2)

LINUX教程   点击:次   发布时间:2006-12-19   【字体: 】   来源:blog
贵 州 学 习 网

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
 检查--force标记?
 调用grub_open打开文件,这里的文件用block? list表示(+1)
 调用grub_read读入一个扇区到0000:7c00的位置?
 检查启动扇区标志0xaa55?
? kernel
 检查--type和--no_mem_option标志?
 调用load_image,读入指定的内核文件?
? load_image中处理了elf和a.out的各种变形
? load_image通过对于内核文件的分析,识别出被启动的os的种类(通过内核文件的magic number)
? load_image针对不同种类的os的内核提供了特定的载入代码(这里的代码异常复杂,牵涉到了不同的os的实现细节,未作分析)
? 最终填充mbi (multiboot information)结构
? boot
? 通过执行chainloader或者kernel以后,当前需要启动的内核的类型已经确定了
? 在执行boot的时候,根据确定的内核类型,每一种内核均有一种启动的方法
? 对于linux,最后调用了stop函数实现控制权的转移
? 对于chainloader,最后也是调用了stop函数实现控制权的转移
? boot
? 通过执行chainloader或者kernel以后,当前需要启动的内核的类型已经确定了
? 在执行boot的时候,根据确定的内核类型,每一种内核均有一种启动的方法
? 对于linux,最后调用了stop函数实现控制权的转移
? 对于chainloader,最后也是调用了stop函数实现控制权的转移

 

 

内存管理之段页机制 by lxwpp


内存管理(memory management)
?内存地址空间
?分段机制
?分页机制
?cpu多任务和保护模式

内存地址空间概念

->逻辑地址:是指由程序产生的由段选择符和段内偏移地址两个部分组成的地址。
->线形地址:是逻辑地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址。32位,4gb
->物理地址:是指出现在cpu 外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。32位无符号整数表示 n虚拟内存:是指计算机呈现出要比实际拥有的内存大得多的内存量。

 

分段机制
段是定义内存区域的另一种机制,与页类似。这两种机制可以重叠:地址一定在某一页面内,也可能处于段内。 n

段的描述符:描述段的属性的一个8字节存储单元)x\yTUz88:[ 此文转贴于我的学习网电脑课堂LINUX教程 http://www.Gzu521.com])x\yTUz88:

段描述符的一般格式
 
保存描述符项的描述符表
gdt:主要的基本描述符表,该表可被所有程序用于引用访问一个内存段。
idt:保存有定义中断或异常处理过程的段描述符
ldt:该表应用于多任务系统中,通常每个任务使用一个ldt 表

上一页 下一页
本文共10页: 第 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]

责任编辑:gzu521

电脑课堂分类
Windows 2000教程
Windows XP教程
Windows 2003教程
Windows Vista教程
LINUX教程
软件教学
办公软件
硬件DIY
分类推荐信息
更多...
大类最新文章
更多...