`
insertyou
  • 浏览: 864513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

【我所認知的BIOS】—>實模式&保護模式

阅读更多

【我所認知的BIOS—>實模式&保護模式

LightSeed

2009-6-17

回顧一下blog里的第一篇文章【我所認知的BIOS—>ADU.EXE

http://blog.csdn.net/lightseed/archive/2009/05/26/4216113.aspx

在這篇文章我有提到關於Memory的訪問,在ADU中有關於“real mode”和“Flat mode”兩種形式去訪問內存。那麼這張起我就來談談我對實模式(real mode)和保護模式(protect mode)的理解。(筆者:主要把訪問內存的方式作為切入點。)不過爲什麽要說說這兩個模式,我在這裡就先提一下。BIOS code大部分都是在real mode下寫的,但當有需求存取1MB以上的memory(其實經常會遇到)big real mode(下一節介紹)是個不錯的選擇雖然我們熟悉的protected mode也可以達成存取4GB內存的目的,但如果程式本身執行的環境是DOSBIOS的話,打開protected mode反而會造成麻煩例如無法呼叫原來real mode呼叫的一些routines,或是必須頻頻在兩個mode下切換! 要談清楚地把Big Real Mode說明的話,我想protect mode是必修課。(筆者:如果不深究爲什麽會出來Big Real Mode,不瞭解protect mode也是可以做到的。)

1物理地址

CPU要訪問內存必須要通過時,要給出內存單元的地址。所有的內存單元組成在一起是一個呈線性的空間。每個空間裏面存儲著我們的數據,而且這每一個空間都有一個唯一的地址,我們將這個唯一的地址就稱為物理地址。(筆者:這段話主要是參考《匯編語言》王爽老師著)

2、實模式(real mode)下訪問內存

2.1 訪問實例

在實模式下,我們訪問內存是通過segmentoffset找到內存的。舉個例子:如果我們訪問的內存是 D000H0FC0H處的內存,那麼我們實際訪問到的物理地址是(D000H*16+0FC0H)處內存。為了說明清楚問題,見圖1

1 實模式下訪問內存截圖

正如圖1所示,紅線為segmentoffset,黃線為內存中的值。我們來總結一下再real mode下。

segment*16+offset = 物理地址

2.2需要說明的一個問題:段的概念

在我們說的過程中,有提到一個“段”的概念,也許大家會這麼認為,在內存中是存在一個接一個的“段”而構成整個內存空間的。我當初也范了這樣的主觀上的錯誤,在這裡也強調一下。這種想法是錯誤的。“段”的形式不是因為內存本來有“段”,只是CPU為了方便自己管理內存,從而存在的一種管理方式而已。一個很明瞭的例子見圖2舉給大家。(筆者:“段”有大有小,不過最大不能超過一個界限。如果有興趣的朋友,你可以推算一下。不過我在下一篇里會詳細演算一遍。)

2 分段

我们可以看到在real mode下,CPU能够访问到的内存空间范围是00000H~FFFFFH一共是1M的大小。

3.保護模式(protect mode

保護模式下的存儲管理機制比較複雜,我也不可能說的很詳細哈。只是從大方向闡述一下我個人的理解。如果有人有興趣詳細鑽研,我想《80X86匯編語言程序設計教程》楊季文著,這本書是不錯的選擇。至於其他的詳細資料,如果有人需要的話,我可以通過mail發給你。在下麵的文章中,我會引用一些剛剛提到的這本書里的內容。(筆者:專家寫的總是比我要寫的好,不過由於話比較多,我就儘量揀重點說。引號內均為原話)

3.1地址空間和地址轉換

保護模式其實應該是從80386時代開始的,“80386分两步实现虚拟地址空间到物理地址空间到物理地址空间的映射,也就是分两步实现虚拟地址到物理地址的转换,但第二步是可选的。”图3是地址映射转换的示意图。

3 地址映射转换示意

“通过描述符表和描述符,分段管理机制实现虚拟地址空间到线性地址空间的映射,实现把二维的虚拟地址转换为一维的线性地址。这一步总是存在的。

分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称为页。通过在线性地址空间的页与物理地址空间的页建立之间建立的映射表,分页管理机制实现线性地址空间到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就等同于物理地址空间,线性地址就等于物理地址。

分段管理机制所使用的可变大小的块,使分段管理机制比较适宜处理复杂系统的逻辑分段。存储块的大小可以根据适当的逻辑含义进行定义,而不用考虑固定大小的页所强加的人为限制。每个段可作为独立的单位处理,以简化段的保护及共享。分页机制使用的固定大小的块最适合于管理物理存储器,无论是管理内存还是外存都同样有效。分页管理机制能够有效地支持实现虚拟存储器。”

不過上面兩種機制中,我著重談談分段管理機制。(筆者:起碼我到現在為止,全部用的是這個東東。并且通过Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1 3.1第一段最末就明確說明了,分段管理機制是必定存在的,而分页管理机制是可選的。)

3.2 虛擬地址到線性地址轉換

我們要明確,“段”是實現虛擬地址到線性地址轉換的基礎。在保護模式下,段有三個參數定義:段基地址(Base Address)、段界限(Limit)、段屬性(Attributes)。

Base address,在這裡比real mode下的segment靈活很多,可以從線性地址空間的任何一個字節開始。不再需要必須被16整除。由上面三個參數我們可以確定,一個段的基地址(起始地址),以及這個段的映射範圍(段界限決定)。而在圖3出現的偏移量,其實我們要訪問的內存相對于基地址而言的長度。段內偏移為X的虛擬地址,對應的線性地址就為

Base + X = 線性地址


然而我的偏移量是>0<段界限(Limit)的。我們來看看圖4的示意圖。

4 虛擬地址到線性地址轉換示意圖

3.3段基地址(Base Address)、段界限(Limit)、段屬性(Attributes

正如小标题,这三个参数是用来定义“段”的。我们把他们统称为描述符。在保护模式下,每一個段都有一個對應的描述符來描述。按照描述的對象來劃分,描述符又被分為:存儲段描述符、系統段描述符、控制描述符。不過我著重講一下我經常用到的存儲段描述符。

3.3.1 存儲段描述符(相當重要!)

假如描述符8個字節的最低字節地址為X。存儲段描述符的格式見圖5

圖5 存儲的描述符格式

對於格式中的東西,我只解釋幾個重要點的。

(1)P位称为存在(Present)位。P=1表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中;P=0表示描述符对地址转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。

(2)DPL表示描述符特权级(Descriptor Privilege level),共2位。它规定了所描述段的特权级,用于特权检查,以决定对该段能否访问。

(3)DT位说明描述符的类型。对于存储段描述符而言,DT=1,以区别与系统段描述符和门描述符(DT=0)

(4)TYPE说明存储段描述符所描述的存储段的具体属性。 (我就不列了,到處都有資料)

(5)G为就是段界限粒度(Granularity)位。G=0表示界限粒度为字节;G=1表示界限粒度为4K 字节。注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位。

由於在後面的過程中我會陸續用到這個描述符,就我個人喜好,我喜歡把這個描述符做成一個結構體的形式,這樣每次調用的時候我只要填相應的值到結構體中即可。見下:

;存储段描述符结构类型的定义

DESCRIPTOR struc

Limitl DW 0 ;段界限(0~15)

Basel DW 0 ;段基地址(0~15)

Basem DB 0 ;段基地址(16~23)

Attributes DW 0 ;段属性

Baseh DB 0 ;段基地址(24~31)

DESCRIPTOR ENDS

比如說我調用結構體,Code DESCRIPTOR <0FFFFH,0,10H,0F2H,0> Code描述一个可读写的有效(存在的)数据段,基地址是100000H,以字节为单位的界限是0FFFFH,描述符特权级DPL=3

在我們實際的code中,必定會有一個全域描述符表(GDT)的存在。他們就是由這些結構體一個一個挨在一起的一段數據(只是我們自己把它們看成一個表而已)。

3.3.2 段選擇子(也很重要!)

我們來回顧一下,在real mode中,CPU訪問內存空間是通過

segment*16+offset = 物理地址

來做到的可以寫作。

Segmentoffset = 物理地址

而在保護模式中CPU訪問內存空間可以寫作

Selectoroffset = 物理地址

這個時候我們可以和保護模式的訪問方式做對比,看成是segment確定了基地址(base address),offset是偏移量。這麼一看原來實模式和保護模式基本上是一樣的。(筆者:只是從這個方式上去理解。)只是CPU在保護模式下,確定這個基地址(base addres)不是直接把地址寫成[base addres]limit的形式的,而是寫成 [段選擇子]offset 的形式。如果我們固執地認為這個【段選擇子】就是一個segment,那麼我想給你說,yesyou are right!只是真正CPU在處理的過程中會做一些動作,把段選擇子換成是保護模式中的基地址。

我們不追究段選擇子的每個bit代表什麽的話,那麼你可以這樣認為。段選擇子是描述符索引。具體是什麽意思呢?其實就是3.3.1最後提到的那個全域描述符表中的序號。

選擇子確定描述符-->描述符確定段基地址-->段基地址+偏移=線性地址-->線性地址與物理地址映射。從而CPU計算得到了內存的物理地址。

也許我這樣說,你可能還是感覺有點抽象。見下表

Index

全域描述符表(GDTlabel

0

Null DESCRIPTOR <>

1

Code DESCRIPTOR <0FFFFH,0,10H,0F2H,0>

2

Datasi DESCRIPTOR <0FFFFH,0,22H,0F2H,0>

3

Datadi DESCRIPTOR <0FFFFH,0,22H,0F2H,0>

……

從表中,CPU一看就知道(筆者:我們人看了可不知道哈,呵呵。。^.^)在保護模式下,如果遇到這樣的code

Mov ax,1

Mov cs,ax

Mov cs:[893h],dx ;在這裡,CPU就會解析到cs中的值是“1,那麼

;就是說在GDTindex為“1的那個描述符中

;base address就是我CPU大哥要用的base

;address了。於是就可以得到,此時的base

;address就為100000H

不知道大家在對於這個段選擇子的認識搞清楚了沒有?

By the wayCPU在解析這個段基地址的時候不是我說的這麼簡單,中間還做了很多加快速度呀,這樣那樣的操作,讓整個計算機的性能更好。但是原理是一樣的。我個人認為段選擇子的引入是保護模式輝煌的一筆,弄清楚它的含義那麼后兩篇文章我要講的內容就輕而易舉了。

後面我會舉一個實例來一步一步分析怎麼進入保護模式的。再後面和大家探討關於 big real mode的相關知識。

總的來說,這一章如果不是很懂也應該沒有關係,不會影響我們的debug過程,但是我個人認為把這個弄懂了的話,心裡會踏實很多。僅僅是個人拙見而已。

虛擬地址 線性地址 物理地址

分享到:
评论

相关推荐

    【我所认知的 BIOS 】实模式&保护模式切换实例

    实模式&保护模式切换实例,对于想写实模式和保护模式切换时很有帮助的哦。。。

    x86汇编语言从实模式到保护模式(完整版)更新过

    &lt;br/&gt;&lt;br/&gt;《x86汇编语言:从实模式到保护模式》采用开源的NASM汇编语言编译器和VirtualBox虚拟机软件,以个人计算机广泛采用的Intel处理器为基础,详细讲解了Intel处理器的指令系统和工作模式,以大量的代码演示了16...

    x86汇编语言 从实模式到保护模式(17章)

    《x86汇编语言:从实模式到保护模式》采用开源的NASM汇编语言编译器和VirtualBox虚拟机软件,以个人计算机广泛采用的Intel处理器为基础,详细讲解了Intel处理器的指令系统和工作模式,以大量的代码演示了16/32/64位...

    x86:从实模式到保护模式【文字版PDF+随书源代码】

    以个人计算机广泛采用的Intel处理器为基础,详细讲解了Intel处理器的指令系统和工作模式,以大量的代码演示了16/32/64位软件的开发方法,介绍了处理器的16位实模式和32位保护模式,以及基本的指令系统。这是一本有趣...

    大学生创新创业训练计划经验分享.zip

    大学生创新创业训练计划(以下简称为“大创计划”)是一项旨在提升大学生创新能力和创业精神的实践活动。通过这项计划,学生可以在导师的指导下,自主开展研究性学习和创业实践。下面我将分享一些关于大创计划的经验和建议。

    node-v12.22.3-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    毕业设计-The coding solutions of Leetcode and 剑指Offer using .zip

    这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有很大的帮助。到时候你会回来感谢我的。 本资源是经过本地编译测试、可打开、可运行的项目、文件或源码,可以用于毕业设计、课程设计的应用、参考和学习需求,请放心下载。 祝愿你在这个毕业设计项目中取得巨大进步,顺利毕业! 但还需强调一下,这些项目源码仅供学习和研究之用。在使用这些资源时,请务必遵守学术诚信原则和相关法律法规,不得将其用于任何商业目的或侵犯他人权益的行为。对于任何因使用本资源而导致的问题,包括但不限于数据丢失、系统崩溃或安全漏洞,风险自担哦!

    【微信小程序毕业设计】宠物店商城系统开发项目(源码+演示视频+说明).rar

    【微信小程序毕业设计】宠物店商城系统开发项目(源码+演示视频+说明).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频-编号:282】 https://pan.quark.cn/s/cb634e7c02b5 【实现功能】 本系统实现的是和宠物相关的信息管理和发布,加入了商品销售的功能。操作角色为管理员和用户、商家,管理员的功能为用户管理、商家管理、宠物分类管理、宠物信息管理、商品分类管理、宠物用品管理、项目类型管理、服务项目管理、宠物日志管理、订单管理等;用户的功能为购买宠物、商品、预约服务发表日志管理订单等。商家功能为提供宠物、宠物用品、宠物服务,管理订单和服务预约等。

    雷迪森的工具包(95分以上课程大作业).zip

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以简化开发过程、提高代码的可维护性和可测试性。 2. Spring MVC框架:Spring MVC是基于Spring框架的Web框架,用于开发Web应用程序。它采用MVC(Model-View-Controller,模型-视图-控制器)的架构模式,将应用程序分为模型层、视图层和控制器层,提供了处理请求、渲染视图和管理流程的功能。 3. MyBatis框架:MyBatis是一个持久层框架,用于与数据库进行交互。它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    node-v9.10.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于B2C的网上拍卖系统_秒杀与竞价.zip

    基于B2C的网上拍卖系统主要用于帮助人们应用互联网方便快捷买到自己所中意的商品,并参与到秒杀与竞拍当中。 主要功能包括: 1.前台模块 (1)普通用户登录/注册。 (2)分类查看商品(普通商品与促销商品) (3)查看商品详细信息 (4)查看秒杀商品 (5)查看竞拍商品 (6)将商品加入购物车 (7)购买,结算功能 (8)留言 2.后台模块 (1)修改密码 (2)商品管理: -- 编辑/删除 -- 设置/取消促销 (3)秒杀商品:设置/取消秒杀 (4)竞拍商品:设置/取消竞拍 (5)订单管理:查看订单 (5)留言管理:查看/删除留言 项目访问路径: 前台:http://localhost:8080/sale 后台:http://localhost:8080/sale/user/adminlogin

    【前端素材】大数据-政务大数据共享交换平台.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    【前端素材】大数据-气象预报大数据平台.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    数学模型算法多目标决策分析方法.pptx

    数学模型算法

    ############ 光电传感器的描述

    光电传感器

    node-v12.17.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Web开发工具和方法课程的学术项目Java、Spring、Hibernate、Angular

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以简化开发过程、提高代码的可维护性和可测试性。 2. Spring MVC框架:Spring MVC是基于Spring框架的Web框架,用于开发Web应用程序。它采用MVC(Model-View-Controller,模型-视图-控制器)的架构模式,将应用程序分为模型层、视图层和控制器层,提供了处理请求、渲染视图和管理流程的功能。 3. MyBatis框架:MyBatis是一个持久层框架,用于与数据库进行交互。它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    云计算基础课件—云安全dr.pptx

    云计算基础课件—云安全dr.pptx

    jizu3.cod

    jizu3.cod

    线性规划模型及应用中的整数规划讲义.pptx

    数学模型算法

Global site tag (gtag.js) - Google Analytics