保护模式下BIOS实现策略
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全局描述符表在系统中只能有一个 ,且可以被每一个任 务所共享 。任何描述符都可以放在 GDT中 ,但中断门和陷 阱门放在 GDT中是不会起作用的. 能被多个任务共享的内 存区就是通过 GDT完成的 。 3. 1. 2 局部描述符表 LDT
局部描述符表在系统中可以有多个 ,通常情况下是与任 务的数量保持对等 ,但任务可以没有局部描述符表 。任务间 不相干的部分也是通过 LDT实现的 。这里涉及到地址映射 的问题和 GDT一样 ,中断门和陷阱门放在 LDT中是不会起 作用的 。 3. 1. 3 中断描述符表 IDT
B IOS 寄存器 操作系统 汇编语言
Abstract This text p roposes here a new B IOS imp lementation scheme by changing the working mode of CPU. This kind of changing enables B IOS codes to run in a linear memory space so that many shortcom ings of tra2 ditional B IOS are overcome. An examp le imp lementation under IA32 architecture is also p resented.
3 泰山学院信息科学技术系 山东泰安 271021
CPU 的工作模式切换跟 IA32架构的 CPU 是完全不同的 。 由于 op tion ROM 中的代码只能访问低端地址空间 ,所以
在实模式下的 op tion ROM 中的代码必须被映射到 1M 以下 的地 址 空 间 。在 PC - AT 架 构 下 , 地 址 空 间 0x00000 0x9FFFF为系统内存使用 ;地址空间 0xA0000 - 0xBFFFF为 VGA 内存使用 ;地址空间 0xF0000 - 0xFFFFF为 B IOS保留 。 随着时间的推移 ,系统 B IOS也变得越来越复杂 ,许多平台上 的 B IOS开始使用 0xE0000 - 0xEFFFF这段地址空间 。因此 , 留给 op tion ROM 的地址空间只有 0xC0000 - 0xDFFFF这段 128K大小的区域 ,这限定了在 B IOS启动阶段可以运行的 op tion ROM 的数量 。
开发与应用 信息技术与信息化
保护模式下 B IOS实现策略
The Imp lemenatation Tactics of B IO S under Protect Model
李 芳 3 L I Fang
摘 要 关键词
ຫໍສະໝຸດ Baidu
本文从改变 CPU 工作模式入手 ,探讨了一种新的 B IOS实现方案 ,可使 B IOS程序工作在线性地址空间 , 从而克服了传统 B IOS的多种不完善之处 ,并在 IA32架构下进行了实验 。
正因为保护模式较实模式而言具有更强大的系统资源 访问能力 ,所以在这种模式下进行 B IOS程序的实现就可以 很容易的克服传统 B IOS具有的缺陷 。所以 ,在系统启动后 , 系统 B IOS代码应尽快使 CPU 进入保护模式 。下面介绍一 种可行的实现方法 。 3. 2 B IOS启动代码实现
3 解决方案
鉴于传统 B IOS具有上述提及的种种不足 ,本文提出一 种可行的解决方案 ,使得在 B IOS启动期间运行的程序代码 具有如下性能 :
a、线性地址空间 ,可访问所有系统资源 。 b、可重定位 ,即可以被映射到地址空间的任一位置 。 c、可移植性 。使用 C语言而非汇编代码来实现各类驱 动程序 。 其中 ,第一点是整个方案的基础 ,后面两点均利用了第 一点的特性而实现 。当 CPU 的工作模式为保护模式时 ,其 拥有的地址空间为 0 ~4G,该空间通常被称为线性地址空 间。 3. 1 IA32中的保护模式 保护模式中 ,程序的运行得以保护 ,所以说保护模式较 实模式的增强的最主要体现还不是寻址能力而是对多任务 的支持 ,所提到的保护就是对不同任务间和同一任务内的程 序加以保护 ,使它们的运行不受对方“有意 ”或“无意 ”影响 , 但同时也要对两个任务都要用到的部分代码实现共享 。另 外一个重要的增强就是对虚拟存储器的支持 ,从一定意义上 说可以使程序设计人员不必考虑物理内存的大小 。[2 ]该模式
为了给自己生产的板卡添加一些特色功能 ,硬件厂商们 在传统 B IOS体系中添加了针对自己产品的 op tion ROM ,其 中存储的是能在 IA32架构的 CPU 中运行的 16位实模式二 进制码 。这就意味着这种型号的板卡不能在非 IA32的平台 上使用 。另外 ,由于实模式的限制 ,该板卡的驱动程序只能 访问系统低端的地址空间 ,这使得该驱动程序的编写极为受 限 。即使通过使驱动程序切换 CPU 的工作模式来访问 1M 以上的地址空间 ,也会带来大量的额外代码以及其他类型的 op tion ROM 的互操作问题 ,何况在其他类型的体系结构中 ,
2006 年第 5 期 1 23
开发与应用 信息技术与信息化
mov ax, SYS_DATA _SEL mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax ; ; 执行下面的跳转指令后 , CPU 进入了 32位保护模式 ,程序 从 InitL inearAddress开始执行 。 ; mov esi, offset InitL inearAddress jmp fword p tr cs: [ si] Flat32Start ENDP _TEXT_REALMODE ENDS ;下面给出了 GDT表的定义 。 align 10h PUBL IC BootGDTtable ; ; GDT[ 0 ]: 0x00: 是个空表项 。 ; NULL _SEL equ $ - GDT_BASE ; Selector [ 0 ] GDT_BASE: BootGDTtable DD 0 DD 0 ; ; 线性空间的数据段描述符 ; L INEAR _ SEL equ $ - GDT _BASE ; Selector [ 0x8 ] DW 0FFFFh ; lim it 0xFFFFF DW 0 ; base 0 DB 0 DB 092h ; p resent, ring 0, data, expand - up , w ritable DB 0CFh ; page - granular, 32 - bit DB 0 ; ; 线性空间的代码段描述符 ; L INEAR _CODE_SEL equ $ - GDT_BASE ; Selec2 tor [ 0x10 ] DW 0FFFFh ; lim it 0xFFFFF DW 0 ; base 0 DB 0 DB 09Bh ; p resent, ring 0, data, expand - up, not w ritab le
和 GDT一样 ,中断描述符表在系统最多只能有一个 ,中 断描述符表内可以存放 256 个描述符 ,分别对应 256 个中 断 。因为每个描述符占用 8 个字节 ,所以 IDT的长度可达 2K。中断描述符表中可以有任务门 、中断门 、陷阱门三个门 描述符 ,其它的描述符在中断描述符表中无意义 。段选择子 在保护模式下 ,段寄存器的内容已不是段值 ,而称其为选择 子 。该选择子指示描述符在上面这三个表中的位置 ,所以说 选择子即是索引值 。
. 686
. model tiny
_TEXT_REALMODE SEGM ENT PARA PUBL IC USE16 ’CODE’
ASSUM E CS: _TEXT_REALMODE, DS: _TEXT_REALMODE
org 0
; ; 在 IA32架构下 ,系统启动后程序指针指向 0xFFFFFFF0, 即 4G - 16 byte处 ,我们首先要 ; 对 CPU的缓存中的数据进行清空 ,以保证后续工作的正确 性 。W binvd指令可以完成这项 ;任务 。
;
wbinvd
; ; 下面是一条跳转指令 ,使程序走向我们预先设定好的入口
地址 ,这里直接使用了二进制码 。 ; db 0e9h dw - 3 _TEXT_REALMODE ENDS END 上面的跳转指令将使程序流程进入下面的代码段 ,使 CPU 进入保护模式 : . 686p . model small, c _TEXT _ REALMODE SEGM ENT PARA PUBL IC USE16 ’ COD E’ ASSUM E CS: _TEXT_REALMODE, DS: _TEXT_REALMODE align 4 Flat32Start PROC NEAR C PUBL IC ; ; 我们需要将 CPU的自检数据保存起来 ,启动后该数据存放 于 eax寄存器中 。 ; mov ebp, eax ; ;下面的代码切换 CPU 模式到保护模式 。在切换前需要设 置好 GDT。 GdtDesc的定义在代码的末尾 。 ; ; mov esi, OFFSET GdtDesc DB 66h lgdt fword p tr cs: [ si] ; ; 设置寄存器 CR0中的 Flag以及 CR4中的操作系统需要的 Flag。值得注意的是设置了寄存 ;器中的 Flag并不表示 CPU 的工作模式已经得以切换 。只 有 CPU 执行了一条跳转指令后 , ;才能真正进入保护模式 。 ; mov eax, cr0 or eax, 00000003h ; 设置 PE bit ( bit #0) & M P bit ( bit # 1) mov cr0, eax mov eax, cr4 or eax, 00000600h ;设置 OSFXSR bit ( bit #9) & OSXM 2 M EXCPT bit ( bit #10) mov cr4, eax ; ; 初始化保护模式中要使用的段选择符 。 SYS_DATA _SEL 定义于 GDT中 。 ;
2 传统 B IOS的缺陷
从最早的 PC诞生至今 ,硬件和操作系统都发生了翻天 覆地的变化 ,但是 B IOS却依然停留在枯燥无味的字符化界 面 ,并且在配置系统和诊断问题等关键功能上还不够令人满 意 。在 Intel的 IA32架构下的 CPU ,系统启动后进入实模式 。 在这种 模 式 下 , 系 统 的 地 址 空 间 只 有 约 1M 大 小 ( 0 0xFFFF: 0xFFFF) ,传统的各家厂商的 B IOS实现都只能使用 该空间 。这大大限制了 B IOS的易配置性及新特性的支持 , 随着计算机硬件及操作系统的日益复杂 ,在实模式下实现 B IOS的各种功能的弊端逐渐显露 。
1 22 2006 年第 5 期
信息技术与信息化 开发与应用
中有三个重要的系统表 GDT、LDT和 IDT 。 这三个表都是描述符表 。描述符表是由若干个描述符
组成 ,每个描述符占用 8 个字节的内存空间 ,每个描述符表 内最多可以有 8129 个描述符 。描述符是描述一个段的大 小 ,地址及各种状态的 。描述符表有三种 ,分别为全局描述 符表 GDT、局部描述符表 LDT和中断描述符表 IDT。 3. 1. 1 全局描述符表 GDT
Keywords B IOS Register Operation system A ssembler language
1 引言
B IOS (Basic Input/Output System ,基本输入 /输出系统 ) 承担着底层硬件的基本管理功能 ,为操作系统和硬件架起一 道衔接的桥梁 。早在 PC发展之初 , B IOS的架构就已确定 。 B IOS是负责操作系统执行前的初始化工作 ,包括检查系统 配备 ,以及连接计算机内各种不同的硬件与操作系统等 。它 是由低级语言写成的软件 ,储存于主机板上的只读存储器 ROM (Read Only M emory)内 , [1 ]这样可以保证其中的基本信 息不被程序所读写 。
局部描述符表在系统中可以有多个 ,通常情况下是与任 务的数量保持对等 ,但任务可以没有局部描述符表 。任务间 不相干的部分也是通过 LDT实现的 。这里涉及到地址映射 的问题和 GDT一样 ,中断门和陷阱门放在 LDT中是不会起 作用的 。 3. 1. 3 中断描述符表 IDT
B IOS 寄存器 操作系统 汇编语言
Abstract This text p roposes here a new B IOS imp lementation scheme by changing the working mode of CPU. This kind of changing enables B IOS codes to run in a linear memory space so that many shortcom ings of tra2 ditional B IOS are overcome. An examp le imp lementation under IA32 architecture is also p resented.
3 泰山学院信息科学技术系 山东泰安 271021
CPU 的工作模式切换跟 IA32架构的 CPU 是完全不同的 。 由于 op tion ROM 中的代码只能访问低端地址空间 ,所以
在实模式下的 op tion ROM 中的代码必须被映射到 1M 以下 的地 址 空 间 。在 PC - AT 架 构 下 , 地 址 空 间 0x00000 0x9FFFF为系统内存使用 ;地址空间 0xA0000 - 0xBFFFF为 VGA 内存使用 ;地址空间 0xF0000 - 0xFFFFF为 B IOS保留 。 随着时间的推移 ,系统 B IOS也变得越来越复杂 ,许多平台上 的 B IOS开始使用 0xE0000 - 0xEFFFF这段地址空间 。因此 , 留给 op tion ROM 的地址空间只有 0xC0000 - 0xDFFFF这段 128K大小的区域 ,这限定了在 B IOS启动阶段可以运行的 op tion ROM 的数量 。
开发与应用 信息技术与信息化
保护模式下 B IOS实现策略
The Imp lemenatation Tactics of B IO S under Protect Model
李 芳 3 L I Fang
摘 要 关键词
ຫໍສະໝຸດ Baidu
本文从改变 CPU 工作模式入手 ,探讨了一种新的 B IOS实现方案 ,可使 B IOS程序工作在线性地址空间 , 从而克服了传统 B IOS的多种不完善之处 ,并在 IA32架构下进行了实验 。
正因为保护模式较实模式而言具有更强大的系统资源 访问能力 ,所以在这种模式下进行 B IOS程序的实现就可以 很容易的克服传统 B IOS具有的缺陷 。所以 ,在系统启动后 , 系统 B IOS代码应尽快使 CPU 进入保护模式 。下面介绍一 种可行的实现方法 。 3. 2 B IOS启动代码实现
3 解决方案
鉴于传统 B IOS具有上述提及的种种不足 ,本文提出一 种可行的解决方案 ,使得在 B IOS启动期间运行的程序代码 具有如下性能 :
a、线性地址空间 ,可访问所有系统资源 。 b、可重定位 ,即可以被映射到地址空间的任一位置 。 c、可移植性 。使用 C语言而非汇编代码来实现各类驱 动程序 。 其中 ,第一点是整个方案的基础 ,后面两点均利用了第 一点的特性而实现 。当 CPU 的工作模式为保护模式时 ,其 拥有的地址空间为 0 ~4G,该空间通常被称为线性地址空 间。 3. 1 IA32中的保护模式 保护模式中 ,程序的运行得以保护 ,所以说保护模式较 实模式的增强的最主要体现还不是寻址能力而是对多任务 的支持 ,所提到的保护就是对不同任务间和同一任务内的程 序加以保护 ,使它们的运行不受对方“有意 ”或“无意 ”影响 , 但同时也要对两个任务都要用到的部分代码实现共享 。另 外一个重要的增强就是对虚拟存储器的支持 ,从一定意义上 说可以使程序设计人员不必考虑物理内存的大小 。[2 ]该模式
为了给自己生产的板卡添加一些特色功能 ,硬件厂商们 在传统 B IOS体系中添加了针对自己产品的 op tion ROM ,其 中存储的是能在 IA32架构的 CPU 中运行的 16位实模式二 进制码 。这就意味着这种型号的板卡不能在非 IA32的平台 上使用 。另外 ,由于实模式的限制 ,该板卡的驱动程序只能 访问系统低端的地址空间 ,这使得该驱动程序的编写极为受 限 。即使通过使驱动程序切换 CPU 的工作模式来访问 1M 以上的地址空间 ,也会带来大量的额外代码以及其他类型的 op tion ROM 的互操作问题 ,何况在其他类型的体系结构中 ,
2006 年第 5 期 1 23
开发与应用 信息技术与信息化
mov ax, SYS_DATA _SEL mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax ; ; 执行下面的跳转指令后 , CPU 进入了 32位保护模式 ,程序 从 InitL inearAddress开始执行 。 ; mov esi, offset InitL inearAddress jmp fword p tr cs: [ si] Flat32Start ENDP _TEXT_REALMODE ENDS ;下面给出了 GDT表的定义 。 align 10h PUBL IC BootGDTtable ; ; GDT[ 0 ]: 0x00: 是个空表项 。 ; NULL _SEL equ $ - GDT_BASE ; Selector [ 0 ] GDT_BASE: BootGDTtable DD 0 DD 0 ; ; 线性空间的数据段描述符 ; L INEAR _ SEL equ $ - GDT _BASE ; Selector [ 0x8 ] DW 0FFFFh ; lim it 0xFFFFF DW 0 ; base 0 DB 0 DB 092h ; p resent, ring 0, data, expand - up , w ritable DB 0CFh ; page - granular, 32 - bit DB 0 ; ; 线性空间的代码段描述符 ; L INEAR _CODE_SEL equ $ - GDT_BASE ; Selec2 tor [ 0x10 ] DW 0FFFFh ; lim it 0xFFFFF DW 0 ; base 0 DB 0 DB 09Bh ; p resent, ring 0, data, expand - up, not w ritab le
和 GDT一样 ,中断描述符表在系统最多只能有一个 ,中 断描述符表内可以存放 256 个描述符 ,分别对应 256 个中 断 。因为每个描述符占用 8 个字节 ,所以 IDT的长度可达 2K。中断描述符表中可以有任务门 、中断门 、陷阱门三个门 描述符 ,其它的描述符在中断描述符表中无意义 。段选择子 在保护模式下 ,段寄存器的内容已不是段值 ,而称其为选择 子 。该选择子指示描述符在上面这三个表中的位置 ,所以说 选择子即是索引值 。
. 686
. model tiny
_TEXT_REALMODE SEGM ENT PARA PUBL IC USE16 ’CODE’
ASSUM E CS: _TEXT_REALMODE, DS: _TEXT_REALMODE
org 0
; ; 在 IA32架构下 ,系统启动后程序指针指向 0xFFFFFFF0, 即 4G - 16 byte处 ,我们首先要 ; 对 CPU的缓存中的数据进行清空 ,以保证后续工作的正确 性 。W binvd指令可以完成这项 ;任务 。
;
wbinvd
; ; 下面是一条跳转指令 ,使程序走向我们预先设定好的入口
地址 ,这里直接使用了二进制码 。 ; db 0e9h dw - 3 _TEXT_REALMODE ENDS END 上面的跳转指令将使程序流程进入下面的代码段 ,使 CPU 进入保护模式 : . 686p . model small, c _TEXT _ REALMODE SEGM ENT PARA PUBL IC USE16 ’ COD E’ ASSUM E CS: _TEXT_REALMODE, DS: _TEXT_REALMODE align 4 Flat32Start PROC NEAR C PUBL IC ; ; 我们需要将 CPU的自检数据保存起来 ,启动后该数据存放 于 eax寄存器中 。 ; mov ebp, eax ; ;下面的代码切换 CPU 模式到保护模式 。在切换前需要设 置好 GDT。 GdtDesc的定义在代码的末尾 。 ; ; mov esi, OFFSET GdtDesc DB 66h lgdt fword p tr cs: [ si] ; ; 设置寄存器 CR0中的 Flag以及 CR4中的操作系统需要的 Flag。值得注意的是设置了寄存 ;器中的 Flag并不表示 CPU 的工作模式已经得以切换 。只 有 CPU 执行了一条跳转指令后 , ;才能真正进入保护模式 。 ; mov eax, cr0 or eax, 00000003h ; 设置 PE bit ( bit #0) & M P bit ( bit # 1) mov cr0, eax mov eax, cr4 or eax, 00000600h ;设置 OSFXSR bit ( bit #9) & OSXM 2 M EXCPT bit ( bit #10) mov cr4, eax ; ; 初始化保护模式中要使用的段选择符 。 SYS_DATA _SEL 定义于 GDT中 。 ;
2 传统 B IOS的缺陷
从最早的 PC诞生至今 ,硬件和操作系统都发生了翻天 覆地的变化 ,但是 B IOS却依然停留在枯燥无味的字符化界 面 ,并且在配置系统和诊断问题等关键功能上还不够令人满 意 。在 Intel的 IA32架构下的 CPU ,系统启动后进入实模式 。 在这种 模 式 下 , 系 统 的 地 址 空 间 只 有 约 1M 大 小 ( 0 0xFFFF: 0xFFFF) ,传统的各家厂商的 B IOS实现都只能使用 该空间 。这大大限制了 B IOS的易配置性及新特性的支持 , 随着计算机硬件及操作系统的日益复杂 ,在实模式下实现 B IOS的各种功能的弊端逐渐显露 。
1 22 2006 年第 5 期
信息技术与信息化 开发与应用
中有三个重要的系统表 GDT、LDT和 IDT 。 这三个表都是描述符表 。描述符表是由若干个描述符
组成 ,每个描述符占用 8 个字节的内存空间 ,每个描述符表 内最多可以有 8129 个描述符 。描述符是描述一个段的大 小 ,地址及各种状态的 。描述符表有三种 ,分别为全局描述 符表 GDT、局部描述符表 LDT和中断描述符表 IDT。 3. 1. 1 全局描述符表 GDT
Keywords B IOS Register Operation system A ssembler language
1 引言
B IOS (Basic Input/Output System ,基本输入 /输出系统 ) 承担着底层硬件的基本管理功能 ,为操作系统和硬件架起一 道衔接的桥梁 。早在 PC发展之初 , B IOS的架构就已确定 。 B IOS是负责操作系统执行前的初始化工作 ,包括检查系统 配备 ,以及连接计算机内各种不同的硬件与操作系统等 。它 是由低级语言写成的软件 ,储存于主机板上的只读存储器 ROM (Read Only M emory)内 , [1 ]这样可以保证其中的基本信 息不被程序所读写 。