3.1.1
在计算机启动时,处理器进入的是”实模式“(与之相对的是保护模式等),此时物理地址需通过CS寄存器和IP寄存器转换才能得到,公式为:物理地址=CS<<4+IP;即CS寄存器向左位移4个单位后与IP寄存器相加得到,CS存储的是当前代码段的基址,而IP寄存器所储存的被称为偏移地址。
在引导模式下,我们只能在一个扇区(软盘)中写入引导程序,及引导程序的大小只能在510B以内。
3.1.2
为什么将代码的起始地址放在0x7c00?
在计算机启动时,低地址内存被BIOS用于多种用途,如中断向量表(0x0000到0x03FF),BIOS数据存储地址等。
中断向量表是一种数据结构,共占用1KB空间,每个中断向量占用4个字节,共可以容纳256个中断类型。
中断向量结构:由偏移地址和段地址组成,每个地址都占用两个字节,用于计算中断程序存在的物理地址。
同时早期由于资源限制,将程序起始地址放在0x7c00,所以为了良好的兼容性,该起始地址沿用至今。
代码3-2:为什么将dx设为0184fh
其中0是前导零,不会被编译,只为了美化格式。18h=24,4fh=79,即25行80列,这是基于文本模式下的屏幕的常规尺寸。
为什么把INT 10h叫做中断程序服务:
在汇编程序执行到INT 10h命令时,会发生以下几个过程
1.中断触发:INT是中断指令,在此处执行的是其编号为10h的功能,该中断专门用于视频服务
2.跳转到中断处理程序:CPU接受到INT 10h指令后,会根据中断向量表中的信息跳转到程序位置
3.执行中断服务程序:中断程序会根据寄存器中的值来执行视频服务的具体功能
4.中断返回:中断服务程序执行完毕后会使用IRET返回到INT 10h后代码的地址继续进行程序
[疑问]虽然中断向量表在0x7c00之前,但中断向量表所指向的中断服务程序不是在0~10FFEFh(段地址+偏移地址可以寻址的最大空间)之间吗?
(chatgpt)
你提出了一个很好的观点。中断向量表(IVT)本身位于内存的最低1KB区域(即0000:0000h
到0000:03FFh
),而它所指向的中断服务程序确实可以位于实模式下可寻址的整个1MB内存空间内,即从0000:0000h
到FFFFFh
。
在实模式下,中断服务程序可以位于内存的任何位置,只要它们的地址能够被正确地设置在中断向量表中。因此,理论上这些中断服务程序有可能与用户程序或其他数据重叠。
然而,在实际使用中,操作系统和BIOS的设计者会采取措施避免这种情况发生:
- BIOS保留区域:BIOS自己的中断服务程序通常位于BIOS固件中,这是一个ROM区域,用户程序无法覆盖。此外,BIOS在加载引导扇区之前,已经初始化了中断向量表,将向量指向BIOS自身的服务程序。
- 操作系统管理:一旦操作系统接管控制权,它将设置自己的中断向量或在保护模式下使用中断描述符表(IDT),来管理中断服务程序。操作系统负责保证这些程序不会与用户空间的程序冲突。
- 内存布局设计:操作系统设计会考虑到内存布局,确保系统关键部分(如内核代码、驱动程序、系统服务)与用户程序和数据分开存放,避免相互覆盖。
总的来说,虽然中断向量表所指向的中断服务程序理论上可以位于任何地方,但通过仔细的系统设计和内存管理,可以确保它们不会与引导程序或其他用户程序发生冲突。这是操作系统设计中内存管理和保护的一个重要方面。
在介绍上卷指定范围窗口时出现了这样的解释:
BH=颜色属性。
bit 0~2:字体颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
bit 3:字体亮度(0:字体正常,1:字体高亮度)。
bit 4~6:背景颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。
便于理解,我将它改成:
- BH=颜色属性。
- bit 0~2:字体颜色(000:黑,001:蓝,010:绿,011:青,100:红,101:紫,110:综,111:白)。
- bit 3:字体亮度(0:字体正常,1:字体高亮度)。
- bit 4~6:背景颜色(000:黑,001:蓝,010:绿,011:青,100:红,101:紫,110:综,111:白)。
- bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。
代码清单3-3
首先使用异或将ah和dl寄存器清零,接着使用int 13h的功能执行磁盘复位。
使用异或清零的好处:
1.xor指令通常比mov更快,执行时更加高效
2.xor语句的编码长度通常比mov短,这样可以使程序更加紧凑
3.执行xor时会将ZF设置为1,即上一个运算结果为0
jmp $ 中 $代表当前命令行所在的地址,这条语句的功能是死循环,用于防止CPU执行到未被定义的部分
代码清单3-4
StartBootMessage后面的冒号用于说明这是一个标识符(变量或标签)
db
是汇编语言中的一个指令,用于定义字节(Define Byte)的数据。它告诉汇编器在当前位置分配一定数量的字节,并用提供的值或值列表初始化这些字节
接下来的部分比较简单,之间根据作者的思路操作即可,笔者此处也是成功的运行了boot程序
3.1.5加载Loader到内存
BPB_TotSec16:这个字段是一个16位的值,因此它最大只能表示65535(即2^16 – 1)个扇区。在早期的小容量存储设备上,这个范围是足够的。但随着存储技术的发展,存储设备的容量迅速增加,很快就超过了这个限制。
BPB_TotSec32:为了支持更大的存储设备,引入了这个32位的值,它可以表示的最大扇区数为4294967295(即2^32 – 1)个扇区。这大大扩展了文件系统可以支持的存储容量。
两个区域之间的关系是,它们都表示文件系统的总扇区数,但适用于不同大小的存储设备。通常,如果存储设备的容量小于或等于65535个扇区,就使用BPB_TotSec16字段;如果容量大于65535个扇区,则使用BPB_TotSec32字段,并将BPB_TotSec16字段设置为0,表示使用BPB_TotSec32字段。