2009年3月3日星期二

Linux0.01分析笔记(2)

第四章
在过去写过了,所以就不在重复了!请看

第五章
格式化的作用是在磁盘上划分不同的区域来存储不同的数据。
磁盘经过格式化后主要包括的区域有:主引导记录区(只有硬盘有),引导记录区,文件分配表(FAT),目录区和数据区。
1988年,国际标准化组织(International Standards Organization,ISO)公布了CD-ROM文
件结构标准,这个标准被称之为ISO 9660。
CD-ROM盘上可以存放信息的区域称为卷空间(volume space).卷空间分成俩个区:从LSN0~LSN16称为系统区,它的具体内容没有规定;从LSN16开始到最后一个逻辑扇区称为数据区,它用来记录卷描述符(volume descriptors),文件目录,路径表,文件数据等内容。
可启动CD-ROM的工作原理:BIOS首先检查光盘的第17个扇区(sector 17),查找其中的代码,若发现其中的启动记录卷描述表(Boot Record Volume Descripter),就根据表中的地址继续查找启动目录(Booting Catalog),找到启动目录后,再根据其中描述的启动入口(Boot Entry)找到相应的启动磁盘镜像(Bootable Disk Image)或启动引导文件,找到启动磁盘镜像后,读取其中的数据,并执行相应的开机动作。相对于单重启动CD-ROM而言,多数启动CD-ROM的启动目录中包含多个启动入口,指向多个启动磁盘镜像。《Bootable CD-ROM Format Specification》
下面是在LA32架构的系统引导过程。
1.硬盘启动步骤
PC机启动过程是遵循一定顺序的,过程如下:
(1)机器加电
(2)BIOS加电自检(Power On Self Test - POST)。BIOS在内存中的起始地址为0FFFF:0000,
BIOS的加电自检就是从地址0FFFF:0000开始执行。BIOS加电自检的主要工作包括:CPU,内存及硬盘等关键设备的检测,即插即用设备的检测。完成这些检查后,将依据结果更新ESCD(Extended System Configuration Data,扩展系统配置数据).
(3)计算机将硬盘0柱面0磁头1扇区(主引导区MBR)中的512B读入内存0000:7C00处并跳到0000:7C00处执行;在读取过程中,计算机并不检查该扇区的内容是什么。
(4)检查(WORD)0000:7DEE是否等于0xAA55,若不等于则转去其他启动介质,如果没有其他启动介质则显示“No ROM BASIC“,然后死机。
(5)跳转到0000:7C00处执行MBR中的程序。
(6)MBR首先将自己复制到0000:0600处,然后继续执行。
(7)MBR在主分区表中搜索标志活动的分区,如果发现没有活动分区或有不止一个活动分区,则停止。
(8)将活动分区的第一个扇区读入内存地址0000:7C00处。
(9)检查(WORD)0000:7DFE是否等于0xAA55,若不等于则显示"Missing Operationing System"然后停止,或者尝试软盘启动。
(10)跳转到0000:7C00处继续执行特定系统的启动程序。
(11)启动系统。
而软盘启动而(1)(2)(3)(4)(5)同上(6)是启动系统。
硬盘主引导扇区基本结构
主引导扇区是硬盘的第一个扇区,它由主引导记录(MBR,Master Boot Record),硬盘分区表
(DPT,Disk Partiton Table)和引导扇区标识(Boot Record ID)三部分组成。
硬盘的一个扇区是512B。主引导记录占用主引导扇区的前446B(字节编号是0~0x1BD)存放系统主引导程序(它负责从活动分区中转载并运行操作系统引导程序)。
硬盘分区表占64B(字节编号0x1BE~0x1FD),记录了磁盘的基本分区信息。硬盘分区表分为4个分区项,每一项16B,分别记录了每个主分区的信息(一个硬盘因此最多可以有4个主分区)。
引导扇区标识占用俩个字节(字节序号是从0x1FE~0x1FF)。对于合法引导区,这个标识为0xAA55。这通常计算机判断引导扇区是否合法的标志。
主引导记录中包含了硬盘的一系列参数和一段引导程序。引导程序主要是用来在系统硬件自
检完后引导具有激活标志分区上的操作系统,它最后执行的指令是一条JMP指令,这条指令使计算机可以跳转执行操作系统本身的引导程序。
DOS命令fdisk /mbr可以修复这段程序。
在Linux系统中可以执行如下的命令来恢复MBR:
dd if=/dev/hda of=/boot/boot.NNNN bs=446 count=1 #备份MBR
dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1 #恢复MBR
硬盘主引导扇区的应用
1.清除硬盘引导功能
2.加密整个磁盘
3.加密单个硬盘分区
4.加入硬盘启动口令识别
5.先于DOS驻留内存程序
6.实现同一硬盘多个操作系统的选择启动
7.实现硬盘主引导扇区或DOS引导扇区的自我修复
Linux0.01的引导部分主要包括俩个源文件:boot.s和head.s。boot.s是计算机上电启动时,由BIOS执行的系统引导代码。head.s是Linux的32位引导代码,在其中将调用main(),最后完成操作系统的引导。
1.boot.s:BIOS引导代码
在计算机加电时,boot.s被BIOS的引导程序加载到地址0x7C00处,然后boot.s将自己移动>到地址0x90000处,然后跳转到地址0x90000处开始执行。然后,boot.s使用BIOS中断功能,加载系统核心到地址0x10000处。接下来,boot.s禁止所有中断,移动系统核心到地址0x0000处,切换处理器到保护模式,然后调用系统的开始程序。系统核心开始运行后,将重新设置保护模式,然后打开需要的中断。
2.head.s:Linux的32位引导代码
这段代码被加载到地址0x00000000处开始运行。地址0x00000000也是系统页表的地址,当系统完成引导后,这段地址将被系统页表重新覆盖使用。
gcc -c my_kernel.c
"-c"开关告诉GCC只是编译成为一个目标文件而不是链接。然后,可以使用如下的命令链接核心,并且设定核心转载的地址为0x100000:
ld my_kernel.o -o kernel.bin -oformat binary -Ttext 0x100000
用“-oformat binary"开关来运行ld告诉链接器输出文件是plain的,没有重定向,没有头信息,只是一个glat的二进制镜像。
“-Ttext 0x100000"告诉链接器用户想要的"text"(代码段)地址在0x100000的内存标记处。
引导代码必须遵循如下的规则:
(1)BIOS会把引导程序装载到固定地址07C00h。因此,引导程序的段地址和飘移地址是固定的。
(2)引导代码必须编译成为plain binary file类型。
(3)plain binary file的尺寸必须是512B(512B是一个扇区的大小)
(4)文件必须以0xAA55h标志结果。
"times 510-($-$$)db 0"代码是一句只有nasm能够理解的代码。
“二次转载”是指:由BIOS从磁盘上装入引导扇区(0头0磁道1扇区)到内存地址07C0:0000,>并跳转到该地址执行;再由从07C0:0000地址开始的引导代码把存放在其他扇区中的程序转
入内存,并跳转到该程序中执行。

第六章
连续分配存储管理方式分为:单一连续分配,固定分区分配和动态分区分配。
虚存提供的功能:扩大地址空间,内存保护,内存映射,公平分配内存,虚存共享。
Inter-Process Communication,IPC 进程间的通信机制
虚拟存储器基本特征是:虚拟扩充,部分装入,离散分配,多次对换。
虚存中的置换算法:先进先出算法(FIFO),最佳置换算法(OPT),最近最少使用置换算法(LRU),最近未使用置换算法(NUR)。
非连续存储管理机制中主要包括:页式管理,段式管理和段页式管理。
任何一个物理地址都可以映射为:段地址+段内偏移。
操作系统必须知道系统物理内存的容量,才能够有效地使用和管理这些物理内存。在CPU处于实模式时,CPU可以访问的物理内存最大只能达到1MB+64KB(在A20 Gate被打开的情况下,否则最大只能访问1MB)。因此,在实模式下通常无法直接通过内存访问来获取内存容量。
可以通过BIOS的15h中断从计算机的CMOS中读取计算机的物理内存的大小,并把这个数据保留在操作系统核心中。BIOS INT15h中断提供了三个子中断来获得系统的物理内存大小,分别是88和E801h和E820h。
malloc()函数作用是从一大块内存中分配出所需要的空间。在分配时需要注意,要留出一部分malloc()不能分配的内核空间(为了便于存储保护,内核地址空间和用户地址空间是相互隔开的)以备内核使用。
内核malloc()函数已经具备了存储分配功能,但是还不具备虚拟存储功能,通过缺页处理来实现虚拟存储管理。
可执行文件的头信息格式有许多标准,例如:coff,elf和pe格式等。
在malloc()函数实现中使用了首次适配方法来进行存储分配。当使用free()函数释放内存时,会对相邻的存储空间进行合并。
page.s是一段汇编语言程序,提供了Linux0.01中缺页异常处理功能。page.s仅仅提供了和
硬件存储管理器的接口功能,大部分功能代码在memory.c文件中。

没有评论:

time