【HUST】论于渊《Orange‘s:一个操作系统的实现》第三章中PagingDemoProc的必要性,是否可以直接调用LinearAddrDemo?
相关代码如下(第三章pmtest9a.asm改写):
LinearAddrDemo equ 00401000h
ProcHust equ 00401000h
ProcIS19 equ 00501000h
ProcPagingDemo equ 00301000h
; 启动分页机制 --------------------------------------------------------------
PagingStart:
mov ax, cs
mov ds, ax
mov ax, SelectorFlatRW
mov es, ax
push LenHust
push OffsetHust
push ProcHust
call MemCpy
add esp, 12
push LenIS19
push OffsetIS19
push ProcIS19
call MemCpy
add esp, 12
push LenPagingDemoAll
push OffsetPagingDemoProc
push ProcPagingDemo
call MemCpy
add esp, 12
mov ax, SelectorData
mov ds, ax ; 数据段选择子
mov es, ax
call SetupPaging ; 启动分页
call SelectorFlatC:ProcPagingDemo ; 调用函数
call PSwitch ; 切页(切换LinearAddrDemo对应的函数过程)
call SelectorFlatC:ProcPagingDemo ; 调用函数
retf
; ---------------------------------------------------------------------------
PagingDemoProc:
OffsetPagingDemoProc equ PagingDemoProc - $$
mov eax, LinearAddrDemo
call eax
retf
LenPagingDemoAll equ $ - PagingDemoProc
hust:
OffsetHust equ hust - $$
mov ah, 0Ch ; 0000: 黑底 1100: 红字
mov al, 'H'
mov [gs:((80 * 17 + 0) * 2)], ax ; 屏幕第 17 行, 第 0 列。
mov al, 'U'
mov [gs:((80 * 17 + 1) * 2)], ax ; 屏幕第 17 行, 第 1 列。
mov al, 'S'
mov [gs:((80 * 17 + 2) * 2)], ax ; 屏幕第 17 行, 第 2 列。
mov al, 'T'
mov [gs:((80 * 17 + 3) * 2)], ax ; 屏幕第 17 行, 第 3 列。
ret
LenHust equ $ - hust
is19:
OffsetIS19 equ is19 - $$
mov ah, 0Ch ; 0000: 黑底 1100: 红字
mov al, 'I'
mov [gs:((80 * 17 + 0) * 2)], ax ; 屏幕第 17 行, 第 0 列。
mov al, 'S'
mov [gs:((80 * 17 + 1) * 2)], ax ; 屏幕第 17 行, 第 1 列。
mov al, '1'
mov [gs:((80 * 17 + 2) * 2)], ax ; 屏幕第 17 行, 第 2 列。
mov al, '9'
mov [gs:((80 * 17 + 3) * 2)], ax ; 屏幕第 17 行, 第 3 列。
ret
LenIS19 equ $ - is19
在代码中,调用LinearAddrDemo
地址对应的函数时,往往通过调用call SelectorFlatC:ProcPagingDemo
来调用。
目的是确保物理地址=LinearAddrDemo
。
在保护模式中,线性地址=段基址+段偏移地址,其中段基址从GDT(或别的什么段)的代码段描述符中找出。
在没有开启分页机制时,线性地址就是物理地址。开启后,经过页部件转换,才能得到物理地址。
其中,页部件转换由硬件自动完成,不需要特殊考虑。
因此,只要确保线性地址=LinearAddrDemo
,即可保证物理地址=LinearAddrDemo
。
直接call LinearAddrDemo
时,相当于call SelectorCode32:LinearAddrDemo
。
此时线性地址=SelectorCode32选择子对应的描述符中代码段的段基址
+ LinearAddrDemo
。
由于SelectorCode32选择子对应的描述符中代码段的段基址
是在实模式跳转保护模式的过程中计算出来的,不为0。所以线性地址≠LinearAddrDemo
,得到的线性地址是一个illegal access。
使用SelectorFlatC
,它的段基址是0,计算就没有问题。
因此,使用call SelectorFlatC:ProcPagingDemo
的方式,去调用LinearAddrDemo
对应的函数,是正确的、没有问题的。
但是,从上述代码里,我们显然可以发现,ProcPagingDemo
和LinearAddrDemo
的定义方式完全一致,LinearAddrDemo
也是一个常量。
那么,为什么不直接call SelectorFlatC:LinearAddrDemo
?
试试就试试。
第一步:
直接把第一个call SelectorFlatC:ProcPagingDemo
改成call SelectorFlatC:LinearAddrDemo
。
运行结果如下图所示。
如上图所示,call调用是成功的,但是返回时出现异常中断,bochs显示错误write_virtual_checks(): write beyond limit, r/w
。
因此可能是返回异常。hust
和is19
两个函数过程的返回使用的是ret
,实际上,当远跳转时,压栈cs,ip,如果使用ret返回,只pop了ip,会导致出现异常的返回值。
第二步:
将hust
和is19
两个函数过程的返回方式改成retf
。
运行结果如下图所示。
上图bochs显示错误fetch_raw_descriptor: GDT: index (20f) 41 > limit (77)
。这是由于代码中既有call SelectorFlatC:ProcPagingDemo
,又有call SelectorFlatC:LinearAddrDemo
。
ProcPagingDemo
,它调用LinearAddrDemo
时采取的是近跳转,应该与ret
配套使用。但此时我们已经将hust
和is19
两个函数过程的返回方式改成retf
。
此时会出现怎样的情况呢?栈如下图所示:
第三步:
不要混用。
只要将所有的call SelectorFlatC:ProcPagingDemo
改成call SelectorFlatC:LinearAddrDemo
,就不会再报错。
总结:
论于渊《Orange‘s:一个操作系统的实现》第三章中PagingDemoProc的必要性,是否可以直接调用LinearAddrDemo?
答:可以直接调用LinearAddrDemo,只要将函数过程的返回均写成retf即可,PagingDemoProc不是必要的。
本次探索过程让我充分理解了近跳转和远跳转、近返回和远返回的概念以及作用,不再乱用ret
和retf
。同时对实模式和保护模式的段、地址有了更清晰的了解。
【HUST】论于渊《Orange‘s:一个操作系统的实现》第三章中PagingDemoProc的必要性,是否可以直接调用LinearAddrDemo?的更多相关文章
- 《Orange'S:一个操作系统的实现》笔记(一)
感觉自己对于操作系统始终没有一个清楚的概念,尤其最近困扰于实模式.保护模式以及寻址方式等一些概念.转而一想,所有的程序,最终都是操作的计算机资源,需要和操作系统打交道,所以操作系统有必要深入了解一下. ...
- oslab oranges 一个操作系统的实现 实验三 认识保护模式(二):分页
实验目的: 掌握内存分页机制 对应章节:3.3 实验内容: 1.认真阅读章节资料,掌握什么是分页机制 2. 调试代码,掌握分页机制基本方法与思路 – 代码3.22中,212行---237行,设置断点调 ...
- JAVA_新建一个方法并且求三个数中的最大值
package wac.wev.as;//新建一个方法在求最大值import java.util.Scanner; public class MaxLian {public static void m ...
- 配置《Orange's一个操作系统的实现》环境心得
<Orange>这本书开篇第一章就做了一个实例,编写了一段引导扇区的代码,但是引导介质仍然采用了已被淘汰多年的软盘.在经历了两天的痛苦查找后终于找到了最方便的解决办法,在此做一下记录,希望 ...
- 《Orange’s 一个操作系统的实现》1.搭建操作系统开发环境
书中给出了两种环境:windows和linux,平台选择根据自己喜好.本人这里选择ubuntu10.04+virtualbox作为开发平台. 1.下载.安装VirtualBox http:// ...
- x86汇编分页模式实验 --《ORANGE'S一个操作系统的实现》中 pmtest8.asm解析
序言(废话) : 在看书的过程中发现一开始不是很能理解pmtest8的目的,以及书上说得很抽象..于是在自己阅读过源代码后,将一些自己的心得写在这里. 正文 : 讲解顺序依然按照书上贴代码的顺序来.但 ...
- 《一个操作系统的实现》 ubuntu系统环境配置
<一个操作系统的实现> ubuntu系统环境配置 电脑之前已经安装了gcc. 一.nasm安装:sudo apt-get install nasm或官网下载http://sourcefor ...
- oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式
实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在 ...
- oslab oranges 一个操作系统的实现 实验四 认识保护模式(三):中断异常
实验目的: 理解中断与异常机制的实现机理 对应章节:第三章3.4节,3.5节 实验内容: 1. 理解中断与异常的机制 2. 调试8259A的编程基本例程 3. 调试时钟中断例程 4. 建立IDT,实现 ...
- oslab oranges 一个操作系统的实现 实验二 认识保护模式
https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...
随机推荐
- 用 C# 插值字符串处理器写一个 sscanf
插值字符串处理器 C# 有一个特性叫做插值字符串,使用插值字符串,你可以自然地往字符串里面插入变量的值,比如:$"abc{x}def",这一改以往通过 string.Format ...
- MacOS15+Xcode版本16+对ReactNative项目进行编译和上传到APPStore的踩坑记录
作者:Kovli 重要通知:红宝书第5版2024年12月1日出炉了,感兴趣的可以去看看,https://u.jd.com/saQw1vP 红宝书第五版中文版 红宝书第五版英文原版pdf下载(访问密码: ...
- 洛谷B4038 [GESP202409 三级] 平衡序列 题解
原题传送门 前言 当我以一种十分激动的心情参加了GESP的2024-9的三级考试时. 打开了此题,然后--自以为是的拿着暴力一顿乱写!然后TLE. 直到结束我还是没有想出来! (太菜了!!!) 以一种 ...
- MONGODB数据备份与导入
主要记录下在mongo 3.0的操作 备份示例 ./mongodump -h localhost -d liongo -o ./ 还原示例 错误方式: ./mongorestore -h 127.0. ...
- SparkRDD算子初识
Spark 的核心是建立在统一的抽象弹性分布式数据集(Resiliennt Distributed Datasets,RDD)之上的,这使得 Spark 的各个组件可以无缝地进行集成,能够在同一个应用 ...
- 寻找旋转排序数组中的最小值 II
地址:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/ <?php /** 154. 寻找旋转排 ...
- linux查看redis版本
1. redis-server --version 和 redis-server -v 2.redis-cli --version 和 redis-cli -v 如果报redis-server或red ...
- Nginx 之fastcgi常用配置项说明
在LNMP环境中,我们都知道nginx如果要解析php脚本语言,就必须通过配置fastcgi模块来提供对php支持,那么在配置fastcgi的时候,关于fastcgi配置项的值应该怎么设置才能让其发挥 ...
- Git提交历史优化指南:两步合并本地Commit,代码审查更高效!
在开发过程中,频繁的本地Commit可能导致提交历史冗杂,增加代码审查和维护的复杂度.通过合并连续的Commit,不仅能简化历史记录,还能提升代码可读性和团队协作效率,以下是合并两次本地Commit的 ...
- FireDAC开发DataSnap应用系统【3】-使用TFDJSONDatasets的CRUD功能
类别 说明 TFDJSONDeltas 包含异动的delta的类别.客户端存放deltade对象 TFDJSONDeltasWriter 把deltas写入TFDJSONDeltas TFDJSOND ...