《2022年操作系统原理实验复习考试 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统原理实验复习考试 .pdf(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、操作系统原理实验笔试复习重点与考试要求成绩计算 :平时 40 分 考勤问答( 5 分) + 平时作业( 15 分) + 大作业( 20 分) + 期末 60 分 笔试( 30 分) + 操作( 30 分) = 100 分考试形式: 开卷笔试(可以带电脑)考试时间: 20XX 年 6 月 10 日(周日)下午2:304:30 考试地点 :东新区教学楼B203(信安 /网工)和B204(计科)题型: 填空( 15 题,每题 2 分,共 30 分) 、问答( 6 题,每题 5 分,共 30 分) 、编程( 4题,每题 10 分,共 40 分)1 实验环境与引导参见“ 01 操作系统的实验环境与引导.
2、doc”和“ 03FAT 文件系统与文件装载.doc”中的3.1 和 2.3。1.1 环境1.1.1 基本环境硬件平台: PC 机( IA-32 )操作系统: Windows XP/7 、虚拟机中的Linux ( Ubuntu)虚拟机:Virtual PC (已淘汰)VMware (Ubuntu、编程)Bochs(测试)在 VMware 中创建 Ubuntu 虚拟机,并安装 Ubuntu Linux(包括另外安装GCC、 NASM和 Samba) ,供以后C 与汇编混合编程时使用1.1.2 编译环境与工具汇编语言操作系统: Windows XP/7 编译器: NASM C 语言与汇编混合编程精
3、选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 47 页操作系统:虚拟机中的Linux (Ubuntu)编译器: GCC 与 NASM 链接器: LD 1.1.3 其他开发工具Windows 平台NotePad+源代码编辑,编写汇编和C 语言源程序、配置文件等文本文件WinHex 二进制编辑,文件、软盘映像、磁盘FloppyWriter 将引导扇区等写入软盘映像WinImage 用于将文件复制进FAT12 软盘映像Debug调试汇编程序Linux 平台Samba Linux 与 Windows 进行网络共享的工具(已淘汰)gedit图形界
4、面的文本编辑器,用于编写汇编和C 语言源程序1.1.4 测试环境虚拟机: Bochs 操作系统: DOS(MS-DOS 6.22 或 FreeDOS 1.1)系统软盘映像外存: (带 FAT12 的) 1.44MB 软盘映像、 U 盘文件格式: COM 、BIN 、 ELF 1.2 引导1.2.1 引导过程计算机加电或重启CPU 复位内存清零内存奇偶校验跳转到地址为FFFF0h 处的系统BIOS 入口指令,执行主板ROM 中的例程检查各个端口, 识别并初始化设备,然后将这些设备连接到计算机上,并提供在设备上的I/O 服务创建两个数据区中断向量表和BIOS 数据区读启动盘的第一个物理扇区,如果其
5、最后两个字节为55h 和 AAh ,则装入该扇区到内存地址7C00h 处,并跳转到7C00h 处执行(引导扇区里面的指令,一般是装入操作系统的引导程序)精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 47 页1.2.2 引导扇区引导扇区( Boot Sector)是磁盘的第一个物理扇区(512B) ,构成:主引导记录( MBR = Master Boot Record ,446B)磁盘分区表( DPT = Disk Partition Table , 4*16=64B )引导记录标识符(BRID = Boot Record IDenti
6、fier,2B,55h AAh )1.3 引导实验1.3.1 编写引导汇编代码用 NotePad+编写汇编源代码(参见“01 操作系统的实验环境与引导.doc”的 3.3)用 org 操作符设置程序的入口地址为7C00h 设置 DS 和 ES=CS 调用后面定义的显示字符串函数进入无限循环定义显示字符串函数用10h 号中断的13h 功能实现(红色)字符串显示定义字符串常量“Hello, OS world!”用 times 伪指令将剩余空间填充为0 将引导扇区的最后2 个字节设置为55h 和 AAh 将写好的汇编程序用文件名boot.asm 保存到 NASM 程序所在的目录中用 NASM 将程序
7、编译成二进制文件boot.bin:nasm boot.asm -o boot.bin 1.3.2 创建软盘映像参见“ 03FAT 文件系统与文件装载.doc”的 3.1 运行 Bochs 程序组中的“Disk Image Creation Tool ”程序( bximage.exe)在“ Please type ha or fd. hd ”后键入fd(指软盘,默认为硬盘hd)后回车在下面的选项中用回车选择默认的1.44MB 软盘在下面的选项中键入软盘映像文件的名称“bt.img ” (默认为“ a.img” )后回车再按任意键完成创建新建的软盘映像文件会被存放在Bochs 程序的主目录中将软盘
8、映像文件移动到Bochs 程序的“ dlxlinux ”子目录1.3.3 将 boot.bin写入软盘映像运行 FloppyWriter.exe 程序单击“ Write File to Image ” (写文件到映像)按钮在弹出的 “打开文件” 对话框中, 选中 NASM 程序目录中的boot.bin 文件后按 “打开”按钮精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 47 页在新弹出的 “打开文件” 对话框中, 选中 Bochs 程序的“dlxlinux ” 子目录中的bt.img文件后按“打开”按钮弹出含字符串“成功! ”的表示写
9、入成功的消息框1.3.4 用软盘映像启动虚拟机参见“ 03FAT 文件系统与文件装载.doc”的 2.3。修改 Bochs 虚拟机的配置文件用记事本或NotePad+打开 Bochs 程序的“ dlxlinux ”子目录中的虚拟机配置文件 bochsrc.bxrc 将其中的“ floppya: 1_44=floppya.img, status=inserted”行中的“ floppya.img ”改为我们自己的软盘映像文件“bt.img”将“ boot: c”行中的硬盘“c”改为“ floppy ” (软盘)保存 bochsrc.bxrc 文件重新启动Linux Demo in Bochs 2
10、.5.1虚拟机1.3.5 用 WinHex 编辑启动 U 盘注意!下面的操作可能会破坏U 盘的分区结构。插入(空白或闲散的)U 盘运行 WinHex 打开 boot.bin 文件选中“工具 /打开磁盘” 菜单项, 在弹出的 “编辑磁盘”对话框中, 选择下部的 “物理驱动器”中U 盘对应项,按“确定”钮打开U 盘选中 boot.bin 文件前面的非0 内容,按 Ctrl+C 复制到剪接板定位到 U 盘的开始处, 按 Ctrl+B(并在弹出的确认菜单中按“确定”钮) , 将 boot.bin中的代码复制到U 盘的启动扇区确保 U 盘的第一个物理扇区(即引导扇区)的最后两个字节为55h AAh 重启
11、计算机,选择用U 盘启动2 汇编程序与代码块装载2.1 CPU Intel 8086(16 位,实模式)、80286(16 位,保护模式) 、80386(32 位,保护模式+分页机制)IA-32(Intel Architecture-32 ,因特尔 32 位体系结构) = x86-32,包括 80386 和 80486 IA-64 = 指 Intel 公司的 64 位 CPU 安腾( Itanium)架构(与IA-32 不兼容)x64 = Intel 64 / IA-32e = AMD64 / x86-64 =( AMD 发明,与 IA-32 兼容) ,包括奔腾(Pentium) 、酷睿( C
12、ore) 、赛扬( Celeron) 、凌动( Atom )精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 47 页2.2 寄存器2.1.1 8086 寄存器Intel 8086 有 14 个 16 位寄存器。8 个通用寄存器4 个数据寄存器:AX (累加)、BX(基址)、CX(计数)、DX (数据)4 个指针变址寄存器:SP (堆栈指针) 、BP(基址指针) 、SI(源变址)、DI(目的变址)4 个段寄存器:CS(代码段)、DS(数据段)、SS(堆栈段)、ES(附加段)2 个专用寄存器:IP(指令指针)、FLAGS (标志)2.1.2
13、 标志寄存器8086 的 16 位标志寄存器FLAGS 中一共定义了9 个标志位,其中的6 个状态标志位可用于条件代码,3 个控制标志位可影响指令的执行结果。6 个状态标志位:零标志 ZF(第 6 位)指明算术或比较运算的结果,可被JZ/JNZ 指令利用符号标志SF(第 7位)运算结果的符号,可被JS/JNS指令利用进位标志 CF(第 0 位)包含算术运算操作后最高位的进位或移位/循环操作后最后位的内容,可被JC/JNC 指令利用溢出标志 OF(第 11 位)指出算术运算后最高位溢出,可被JO/JNO 指令利用奇偶标志PF(第 2 位)指明在操作产生的结果中,低字节里为1 的位的数量的奇偶,可
14、被JPE/JNP 或 JPO 指令利用辅助进位标志AF(第 4 位)在字操作时发生低字节向高字节进位或借位时、在字节操作时发生低4 位向高 4 位进位或借位时, AF=1 , 否则为 0,无相关的 CPU指令3 个控制标志位:方向标志 DF(第 10 位)确定传送或比较字符串数据时的方向,默认DF=0 为左/上 /索引增加方向,可以用指令STD/CLD 来设置成递减/递增方向中断允许标志IF (第 9 位) 指明是否处理外部可屏蔽中断,可以用指令STI/CLI来设置要 /不处理中断2.1.3 80386 寄存器在 Intel 80386 CPU 中,8 个通用寄存器和2 个专用寄存器都从16
15、位扩展到了32 位(命名前增加了一个字母E=Extended ,扩展 ) ,但 4 个段寄存器仍然保留为16 位的,另外还增加了 2 个新的 16 位附加段寄存器FS 和 GS,使程序可同时操作的段达到6 个。80386( 80286)新增加的寄存器还有:4 个系统地址寄存器全局描述符表寄存器GDTR (32 位) GDT 的线性基址,相关的装入/保精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 47 页存寄存器的特权指令为LGDT/SGDT 局部描述符表寄存器LDTR (16 位) LDT 的段选择符, 相关的装入 /保存寄存器的特权
16、指令为LLDT/SLDT 中断描述符表寄存器IDTR (32 位) IDT 的线性基址,相关的装入/保存寄存器的特权指令为LIDT/SIDT 任务寄存器TR (16 位) TSS 的段选择符,相关的装入/保存寄存器的特权指令为LTR/STR 4 个 32 位的控制寄存器CR0 80286 的 16 位 MSW(Machine Status Word,机器状态字) 的 32 位扩展, 其最低位为PE (Protection Enable, 启用保护 模式 ) , 最高位为PG (Paging,分页)用于启动分页机制CR1未使用CR2存放引起页故障的线性地址CR3 页目录基址寄存器8 个调试寄存器
17、DR0DR7 8 个测试寄存器TR0TR7 2.3 BIOS 中断2.3.1 调用格式BIOS 中断调用的一般格式为:mov ah,功能号精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 47 页; 设置各种入口参数int 中断号2.3.2 常用 BIOS 中断显示字符 int 10h 的 0Eh 功能显示字符串int 10h 的 13h 功能读按键 int 16h 的 00h 功能读扇区 int 13h 的 02h 功能2.3.3 MY-OS 例引导扇区程序(boot1.asm) :显示 3个字符串( MY-OS 1.0 、(C) 20
18、12 Li Caiwei 、Please Key in characters (Esc to quit):+ 响铃换行回车) 、接受用户键入字符并回显到屏幕上。汇编代码参见“02 汇编程序与代码块装载.doc ” 中的 2.2 的 3。2.4 装载代码块将 boot1.asm 的第一行代码改为:org 7E00h,另存为boot2.asm 用 NASM 将 boot2.asm 编译为 boot2.bin 利用 WinHex 将 boot2.bin 写入 bt.img 的第二个扇区在原来的boot.asm 的基础上,增加装载第二个扇区到7E00h 处的汇编代码,保存为 boot3.asm,参见“
19、 02 汇编程序与代码块装载.doc”中的 3 用 NASM 将 boot3.asm 编译成 boot3.bin 利用 WinHex 或 FloppyWriter 将 boot3.bin 写入 bt.img 的第一个扇区用 bt.img 启动 Bochs 虚拟机2.5 Debug 常用的 debug 命令:R(Register 寄存器)查看、修改CPU 寄存器D(Dump 转储)查看内存中的内容E(Enter 键入)改写内存中的内容A(Assemble 汇编)以汇编指令的格式,在内存中写入一条机器指令U(Unassemble 反汇编)将内存中的机器指令翻译成汇编指令P( Proceed 继续进
20、行)单步执行,类似于Step Over T(Trace 跟踪)执行一条机器指令,类似于Step Into N(Name 名称)指定文件名,供L 和 W 命令使用L(Load 装入)读磁盘文件中的指定扇区到内存W(Write 写入)写内存数据到磁盘文件的指定扇区Q(Quit)退出debug 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 47 页?(帮助)显示命令清单2.6 COM 文件2.6.1 可执行文件格式BAT(batch file ,批处理文件)DOS/Windows 的一种基于ASCII 文本的脚本型可执行文件(扩展名为.ba
21、t 或.cmd,后者为Windows NT 引进)COM (command file,命令文件)DOS 的二进制裸格式,不分段,会被装载到当前段的 100h 处(需使用org 100h 指令, SP=100h-4) ,文件大小必须64KB-256B EXE(executable file ,可执行文件)DOS/Windows的主要可执行文件类型,有三种格式:MZ(Mark Zbikowski ,MS-DOS 的开发者之一) 原始的DOS 可执行文件格式,以字母串“ MZ ” (5A 4D)开头NE (New Executable , 新可执行)老式 16 位 Windows 可执行文件格式 (
22、包括 .exe和.dll 扩展名),1985 年由 Windows 1.0 引进。 NE 是一种分段的可执行文件,为了向后兼容,保留了MZ 文件头PE (Portable Executable,可移植可执行) Windows NT 3.1 于 1993 年引进的32位可执行文件格式(包括.exe、.dll 、.cpl、.ocx、.sys、.scr、.drv 扩展名),现在支持 x86、x64 和 IA-64 指令集架构和 .NET 框架。 PE格式是 Unix 的老式可执行文件格式 COFF(Common Object File Format ,公共对象文件格式)的修改版ELF (Execut
23、able and Linkable Format ,可执行与可链接格式)类Unix 操作系统的标准二进制文件格式2.6.2 生成和运行 COM 文件将 org 7C00h 改为 org 100h (如果需要用到堆栈如有函数调用 ,还需设置SS=CS、SP=100h-4)例子: Hello (boot.asm-hello.asm) 、MY-OS (boot1.asm- my-os.asm)用 NASM 编译成 com 文件:nasm *.asm -o *.com 在 DOS 命令行 /Windows 的命令窗口(如NASM 运行界面、“开始 /运行”的cmd)中,使用hello 或 my-os
24、启动运行2.6.3 COM 文件例 hello 下面是可以生成COM 文件的例子使用BIOS 的 10h 号中断的13h 号功能,在文本屏幕的左上角,显示黑底红字的字符串“Hello, OS world! ” 。源代码( hello.asm)org 100h ; 告诉编译器程序加载到100H 处mov ax,cs ; 置 DS 和 ES = CS 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 47 页mov ds,ax mov es,ax call DispStr ; 调用显示字符串函数jmp $ ; 无限循环DispStr: ; 显
25、示字符串例程mov ax,BootMsg mov bp,ax ; ES:BP=串地址mov cx,16 ; CX= 串长mov ah,13h ; AH=BIOS 中断的功能号mov al,01h ; AL=1 表示光标放到串尾mov bh,0 ; BH= 页号mov bl,0ch ; BL= 颜色(黑底红字)mov dh,0 ; DH= 行号mov dl,0 ; DL= 列号int 10h ; 调用 10h 号中断ret ; 函数返回BootMsg: ; 显示用的字符串db Hello, OS world! 用 NASM 编译成 com 文件: nasm hello.asm -o 在 NASM
26、 的命令行,用hello运行3 FAT 文件系统与文件装载3.1 文件系统3.1.1 磁盘分区磁盘分区表( DPT = Disk Partition Table )位于引导扇区,含4 个分区表项,每一项占 16B 分区表项的结构分区类型( CHS/LBA )如0 x06/0 x0E = FAT16、0 x0B/0 x0C = FAT32、0 x07 = NTFS、0 x05/0 x0F = 扩展、 0 x83 = Linux CHS(Cylinder/Head/Sector ,柱面 /磁头 /扇区)磁盘的一种传统寻址方式。LBA (Logical Block Addressing ,逻辑块寻址
27、)磁盘的一种线性寻址方式,有22b(ATA,1986) 、28b(ATA-1 ,1994)和 48b(ATA-6,2003)三种版本。 1996年以后推出的硬盘一般都采用了LBA 3.1.2 FAT 分区FAT (File Allocation Table , 文件分配表) 是微软公司为其操作系统DOS 和老式 Windows所定义的一套文件系统,包括FAT12( 32MB ) 、FAT16( 32MB/2GB ) 、FAT32( 2TB)精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 47 页和 FAT64/exFAT( 64ZB)等
28、多种具体格式。1GB ( 230)= 1000MB 、1TB( 240)= 1000GB 、1PB (250)= 1000TB 、1EB(260)= 1000PB、1ZB(270)= 1000EB 、1YB(280)= 1000ZB 。3.2 FAT12 在我们的 OS 实验中,使用1.44MB 软盘映像作为测试介质,采用FAT12 文件系统。3.2.1 1.44MB 软盘格式1.44MB 软盘的格式:2 个磁头( head)/ 盘面( side) 、每磁头80 个柱面( cylinder )/磁道( track) 、每个柱面有18 个扇区( sector) 、每个扇区有512 个字节( by
29、te) ,所以软盘的容量为:2 磁头 *80 柱面 *18 扇区 *512B=2880 扇区 *512B=1474560B=1440KB=1.44MB 对 1.44MB 软盘,采用FAT12 分区,引导扇区中没有分区信息,但有根目录区(224 条目*32B = 7168B = 14扇区) 。FAT12 的每个 FAT 项占 12 位( 1.5B) ,每个簇只有一个扇区。整个软盘2880 个扇区,需要 2880*1.5B = 4320B = 8.44个扇区,所以每个FAT 表的大小设为9 个扇区。3.2.2 FAT12 分区结构下面是我们使用的1.44MB 软盘映像的FAT12 分区结构:FAT
30、12 分区结构区域起始地址起始扇区扇区数内容说明引导扇区0 0 1 分区引导扇区无额外保留扇区FAT 区200h 1 9 FAT#1 主 FAT 1400h 10 9 FAT#2 备份 FAT 根目录区2600h 19 14 根目录固定大小数据区4200h 33 2847 文件数据其余空间3.2.3 分区引导扇区分区引导扇区也叫VBR ( Volume Boot Record ,卷引导记录)区或PBR(Partition Boot Record,分区引导记录)区,是分区的第一个扇区(512B) 。FAT12 分区引导扇区的结构偏移长度内容00h 3B 跳转指令( jmp 地址nop = EB
31、? 90)03h 8B OEM 名串“ MY-OS1.0”0Bh 25B BPB 24h 26B 扩展 BPB 5Ah 448B 引导程序代码精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 47 页01FEh 2B 有效结束标志(55 AA )3.2.4 BPB 与 EPBP FAT12 的 BPB 结构( 25B)偏移长度内容1.44M 软盘值0 x0B 2B 每扇区字节数(一般为512)200h=512 0 x0D 1B 每簇扇区数1 0 x0E 2B 保留扇区数 含本扇区 ( 1)1 0 x10 1B FAT 数(一般为2)2
32、0 x11 2B 最大根目录项数E0h=224 0 x13 2B 总扇区数( 64K ,容量 32MB )B40h=2880 0 x15 1B 介质描述符F0h 0 x16 2B FAT 占扇区数9 0 x18 2B 每道扇区数12h=18 0 x1A 2B 磁头数2 0 x1C 4B 隐藏扇区数 (对无分区的介质必须为0)0 0 x20 4B 总扇区数( 64K,容量 32MB )0 FAT12 的 EBPB 结构( 26B)偏移长度内容1.44M 软盘值0 x24 1B 驱动器号(软0/硬 0 x80)0 0 x25 1B 保留(一般为0)0 0 x26 1B 扩展引导标签 (一般为 0
33、x29) 29h 0 x27 4B 卷 ID (序列号,随机数)12345678h 0 x2B 11B 卷标(不足补空格,无效)“MyOS System”0 x36 8B 文件系统类型 (不足补空格)“FAT12 ”3.2.5 文件条目格式FAT12 采用多级目录结构,子目录用文件表示。目录为文件条目的列表,每个条目占用32B(20h 字节),其格式如下:偏移长度内容00h 11B 文件名 8B(不足补空格)+ 扩展名 3B(不足补空格) ,尾部空格被忽略英文字母必须大写,非法标点字符有:” *+,./:;? 0Bh 1B 文件属性(普通/档案文件 =20h、子目录 =10h、卷标 =08h)
34、0Ch 10B 保留(全为0)16h 2B 最后写入时间(04 位:秒 /2029 、510 位:分 059、1115 位:时 023)18h 2B 最后写入日期(04 位: 日131 、 58 位: 月112 、 915 位: 年0=1980127=2107 )精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 47 页1Ah 2B 开始簇号,卷标、指向根目录的子目录“.” 、空文件条目的开始簇号必须为0 1Ch 4B 文件大小(字节数)文件条目第一个字节值的特殊含义值( h)00 05 2E E5 含义条目未用且可用值实际为E5H 点
35、条目( .或.)条目被删且不可用文件属性的标志位位序7 6 5 4 3 2 1 0 掩码 (h) 80 40 20 10 08 04 02 01 含义未用设备档案子目录卷标系统隐藏只读3.2.6 FAT 项FAT(File Allocation Table ,文件分配表) 是映射到分区中每个簇(cluster)的项(entry,条目)列表, FAT12 的每个项占12 位, FAT 项取值的含义见下表:FAT 项值( h)取值含义000 空闲簇001 保留簇002FEF 被占用簇,值为下一簇的序号FF0FF6 保留值FF7 坏簇FF8FFF 文件最后簇(一般取FFF)FAT 表的前两个项保存特
36、殊的值(FAT12 前三个字节h 值=F0 FF FF) :项 0 = 低 8 位(首字节)为介质描述符(软盘为F0h、硬盘和U 盘为 F8h) 、其余位全为 1(FAT12: Fh)项 1 = 结束簇标记( FAT12 通常取值为:FFFh)3.2.7 汇编源程序下面是生成FAT12 分区结构的汇编源程序代码,包括跳转指令、 OEM 串、BPB 与 EPBP,填充两个FAT 表开始处的两个FAT 项( F0 FF FF) ,并在根目录中增加一个卷标条目(因为EBPB 中的卷标不起作用) 。汇编源代码(似boot4.asm) :org 07c00h ; 加载到 0:7C00h 处jmp sho
37、rt LABEL_START ; Start to boot. nop ; 这个nop 不可少BS_OEMName DB MY-OS1.0 ; OEM String, 必须8 个字节(不足补空格); 下面是FAT12 的 BPB 与 EPBP 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 47 页BPB_BytsPerSec DW 512 ; 每扇区字节数BPB_SecPerClus DB 1 ; 每簇多少扇区BPB_RsvdSecCnt DW 1 ; Boot 记录占用多少扇区BPB_NumFATs DB 2 ; 共有多少FAT
38、表BPB_RootEntCnt DW 224 ; 根目录文件数最大值BPB_TotSec16 DW 2880 ; 逻辑扇区总数BPB_Media DB 0 xF0 ; 介质描述符BPB_FATSz16 DW 9 ; 每 FAT 扇区数BPB_SecPerTrk DW 18 ; 每磁道扇区数BPB_NumHeads DW 2 ; 磁头数 (面数 ) BPB_HiddSec DD 0 ; 隐藏扇区数BPB_TotSec32 DD 0 ; wTotalSectorCount 为 0 时这个值记录扇区数BS_DrvNum DB 0 ; 中断13 的驱动器号BS_Reserved1 DB 0 ; 未使用
39、BS_BootSig DB 29h ; 扩展引导标记(29h) BS_VolID DD 12345678h; 卷序列号BS_VolLab DB MyOS System ; 卷标 , 必须11 个字节(不足补空格)BS_FileSysType DB FAT12 ; 文件系统类型, 必须8 个字节(不足补空格)LABEL_START: ; BOOT 代码被略去; 填充 0 和引导扇区的有效结束标志times 510-($-$) db 0 ; 用 0 填充引导扇区剩下的空间db 55h,0aah ; 引导扇区结束标志; 填充两个FAT 表的头两个项(每个FAT 占 9 个扇区)db 0f0h, 0f
40、fh, 0ffh ; 介质描述符(F0h)和 Fh、结束簇标志项FFFh times 512*9-3 db 0 ; 用 0 填充 FAT#1 剩下的空间db 0f0h, 0ffh, 0ffh ; 介质描述符(F0h)和 Fh、结束簇标志项FFFh times 512*9-3 db 0 ; 用 0 填充 FAT#2 剩下的空间; 根目录中的卷标条目db MyOS System ; 卷标 , 必须11 个字节(不足补空格)db 8 ; 文件属性值(卷标条目的为08h)dw 0,0,0,0,0 ; 10 个保留字节dw 0,0 ; 创建时间,设为1980 年 0 月 0 日 0 时 0 分 0 秒d
41、w 0 ; 开始簇号(卷标条目的必需为0)dd 0 ; 文件大小(也设为0)3.3 文件加载由于引导扇区的空间有限,操作系统的加载,必须依靠另外的装载程序模块来完成。而该装载模块,一般以文件形式,存储在磁盘系统分区的根目录中。需要在引导扇区中增加汇编代码,来搜索FAT12 软盘根目录中的操作系统装载程序的二进制文件LOADER.BIN ,并将其加载到内存,最后将控制权交给此装载程序。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 47 页3.3.1 编写测试用的简单装载程序我们编写一个简单的汇编程序,用作装载测试。 该程序, 利用修改
42、显存中指定位置的字值,在文本窗口前4 行的中央显示4 个字符 L 、 O 、 A 、 D 。另外,为了测试引导程序的读入含多个扇区的装载文件的功能,我们故意安排每个显示字符的代码段,各占一个扇区,并将每个扇区的剩余部分填0。具体源代码参见“03 FAT 文件系统与文件装载.doc”中的 5.1 中的 loader.asm。3.3.2 加载 LOADER.BIN文件加载 LOADER.BIN文件到内存的主要步骤(参见“03 FAT 文件系统与文件装载.doc”中的 5.3 与 boot5.asm) :1.设当前扇区号为根目录的起始扇区号19 2.调用读扇区函数(先由扇区号算出柱面号、起始扇区、磁
43、头号,再调用BIOS 中断int 13h 的 02h 功能读磁盘)读根目录的当前扇区到内存中的加载地址3.依次比较当前扇区中各个文件条目(共16 个)中的文件名串与“LOADER.BIN ”4.若无相等的文件条目,前扇区号加1,转到 2 5.若找到相等的文件条目,从该条目获取起始簇号N 6.计算出簇号N 所对应的装载文件的扇区号(=N+31)7.调用读扇区函数将装载文件的当前扇区读到内存中加载地址的当前扇区8.由当前簇号值N 计算其对应FAT 项在 FAT 表中的偏移地址D(=N*1.5B ) ,由 D 值计算出 FAT 项所在扇区的序号K(=1+D/512 )和偏移值O(=D%512 )9.
44、调用读扇区函数将磁盘的(FAT 表中的) K 号和 K+1 号两个扇区(因为一个FAT项可能跨越两个扇区)读入内存缓冲区(8F000h)10.利用偏移值O 获取 FAT 项值 N(=文件下一个簇的序号)11.若 N=FF8h ,则文件已经读完,跳转到装载程序3.3.3 将文件添加到软盘映像中1WinImage 在 Windows 下,将文件添加到软盘映像中的最简单方法,是使用 WinImage 软件。 具体步骤为:运行 WinImage 程序,在弹出的信息框中按“确定”钮打开软盘映像文件:用“文件/打开”菜单项,或单击工具条上的“打开”按钮,或按“Ctrl+O ”组合键, 在弹出的 “打开”
45、对话框中, 选择 FAT12 软盘映像文件 (如a.img 或 MyOS.img ) ,按“打开”按钮将要添加的文件拖放(或复制粘贴)到WinImage 窗口的右部保存软盘映像文件:用“文件/保存”菜单项,或单击工具条上的“保存”按钮,或按“ Ctrl+S”组合键,在弹出的“加入”对话框中按“是”钮精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 47 页2Linux 已淘汰的方法:用Virtual PC 虚拟机中的Linux (Ubuntu)和桑巴舞软件,在Ubuntu 和Windows 之间共享文件夹。再在Ubuntu 中,将软盘映
46、像绑定到Linux 的某个子目录,最后把 loader.bin 文件复制到软盘映像中。如果需要在Linux 中进行汇编和C 的混合编程,则可以用VMware 虚拟机中的Linux(Ubuntu ) ,将文件添加到FAT12 软盘映像中。具体方法和步骤为:运行 VMware 虚拟机中的Ubuntu 打开 Linux 的主文件夹将 Windows 中的 FAT12 软盘映像文件 (如 a.img)和代码源程序 (或它们所在的子目录) ,拖放(或复制粘贴)到Linux 的主文件夹(并用“cd 子目录”命令进入该子目录)创建挂载软盘映像用的子目录(如/mnt/floppy ) :sudo mkdir
47、/mnt/floppy 挂载软盘映像:sudo mount o loop a.img /mnt/floppy 编译链接程序添加文件(如loader.bin) :sudo cp loader.bin /mnt/floppy -v 卸载软盘映像:sudo umount /mnt/floppy 将 Linux 的主文件夹中的FAT12 软盘映像文件(如a.img) ,拖放(或复制粘贴)到 Windows (如 Bochs 程序的“ dlxlinux ”子目录)中3WinHex 还可以参见“05 进程调度 .doc”末尾处的“实验参考步骤和操作”。在还没有使用WinImage 和支持文件拖放功能的VM
48、ware 虚拟机中的Ubuntu 之前,由于 Virtual PC 虚拟机中的Ubuntu 的共享文件夹的桑巴舞软件经常出问题,我们有时改用WinHex 来自己手工添加文件到FAT12 软盘映像。利用 WinHex 手工添加文件(如loader.bin)到 FAT12 软盘映像文件(如a.img) ,还可以帮助我们理解和掌握FAT12 文件系统的具体结构和参数。下面是具体的步骤和参数:启动 WinHex 、打开 loader.bin 和 a.img 文件创建文件条目: 在 a.img 中定位到根目录区(起始地址为2600h) ,找到一个空白的文件条目(每个条目20h/32B ,起始字节的值为0
49、 的为空白条目) ,在条目开始处写入 8+3 的文件名(全大写,不足的补空格符20h) “LOADER BIN ” 、接着是文件属性 1B=20h(普通档案文件) 、保留 10B(全设为0) 、时间 2B、日期 2B、首簇精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 47 页号 2B(?) 、文件大小534(216h)等设置 FAT 项:定位到 a.img 的 FAT#1 区 (起始地址为200h) , 找到 2个相连的空白FAT 项 (每项 12 位/1 个半字节,首个字节值为0 的为空白项) ,置文件第1 个 FAT 项的值=第
50、 2 个 FAT 项的序号,置文件第2 个 FAT 项的值 =FFFh(表示文件结束)FAT 项的序号的计算方法:项序号 =项首地址相对于FAT#1 区起始地址的偏移量/1.5。例如,若文件第1 个 FAT 项的地址为203h,则偏移量 =203h-200h=3 ,序号 =3/1.5=2。文件第2 个 FAT 项的序号自然=2+1=3(4.54 的高 4 位/1.5) 。再定位到a.img 的 FAT#2 区(起始地址为1400h) ,将对应的两个FAT 项填上同样的值填写文件条目的首簇号:再一次定位到a.img 的根目录区 (起始地址为2600h) ,在刚才创建的文件条目的偏移1Ah 处,填