8086内存安排

8086实模式的寻址范围只有1MB。其中:

系统硬件使用的存储器地址被安排在高端,地址从0xA0000H(684KB)开始的384KB中,其中有用于显示的视频缓冲区;

内存低端安排了中断向量表和BIOS数据区;

剩下的从0x00500H开始的到0xA0000H总共不到640KB的内存是操作系统和应用程序所能够使用的,应用程序不能够使用这600KB以外的内存,这就是著名的“640KB限制”。

彩显缓冲区

从上图可以看出,0xB0000H开始到0xB8000H为单色字符模式视频缓冲区;0xB8000H到C0000为彩色字符模式视频缓冲区。

内存地址空间从B8000H~BFFFFH 共32KB空间([B800:0000]到[B800:8FFF]),称为80x25彩色字符模式显示缓冲区,向这个地址写入的数据会立即出现在显示器上。

窗口大小为160x25个字节(4000个字节),每两个字节为一个字符的参数:

偶数地址存放字符的ascii码,奇数地址存放字符属性。

一行可以存放80个字符一共25行,共可以存放80x25个字符2000个字符。每个字符可以有FF=2^8=256种属性。

第7位:代表闪烁效果
第6、5、4位:代表背景色的rgb=red green blue 红绿蓝
第3位:高亮
第2、1、0 位:字符颜色的rgb
对应颜色设置成1就变成对应颜色
0010 0100 绿底红字 十六进制=0x24
0100 0001 红底蓝字 十六进制=0x41
0001 0010 蓝底绿字 十六进制=0x12

对于昨天的第二扇区的代码,直接把数据放到了0xB8000H开始的彩色字符模式视频缓冲区内。

昨天的运行效果如下。

根据如下代码,可以看出每行用160字节可以显示80个字符。

单色缓冲区

将把上节中的es由0xB800改为0xB000后,qemu没有进行显示。所以后续还是用es=0xB800H吧。

int13/02H中断

根据int13/02H调用格式:

AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer

下述代码将第二扇区复制进了内存es:bx=[new:0]位置

        mov ah, 0x02mov al, 1mov ch, 0mov cl, 2mov dh, 0mov bx, newmov es, bxxor bx, bxint 0x13

下述代码令cs:ip=[new:0]

        jmp new:0

通过上述两部操作,把第二扇区的代码复制到了[new:0]的位置,同时也让指令指针指向了此位置,从而可以继续运行代码。

去掉冗余代码,最精简的可以使用第二扇区代的代码如下。

[BITS 16]
org 0x7C00
start:mov ah, 0x02mov al, 1mov ch, 0mov cl, 2mov dh, 0mov bx, newmov es, bxxor bx, bxint 0x13jmp new:0
data:new equ 0x0500
times   510-($-$$) db 0
dw      0xaa55
sect2:mov ax, 0xB800mov es, axmov byte [es:0x0000], '0'mov byte [es:0x0001], 0x48mov byte [es:0x00A0], '1'mov byte [es:0x00A1], 0x48mov byte [es:0x0140], '2'mov byte [es:0x0141], 0x48mov byte [es:0x00A0], '1'mov byte [es:0x00A1], 0x48mov byte [es:0x00A0], '1'mov byte [es:0x00A1], 0x48mov byte [es:420], 'H'mov byte [es:421], 0x48mov byte [es:422], 'E'mov byte [es:423], 0x68mov byte [es:424], 'L'mov byte [es:425], 0x28mov byte [es:426], 'L'mov byte [es:427], 0x38mov byte [es:428], 'O'mov byte [es:429], 0x18mov byte [es:430], '!'mov byte [es:431], 0x58hlt

GDT

全局描述符表Global Descriptor Table,表中每个元素8个字节,每个元素表示一个段(代码段,数据段,栈段)的信息,且GDT在进入保护模式之前必须存在,所以它必须位于1MB以下。

GDTR中存放的是GDT在内存中的基地址和其表长界限。

LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。

LDTR记录局部描述符表的起始位置,与GDTR不同,LDTR的内容是一个段选择子。

由于LDT本身同样是一段内存,也是一个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有一个选择子,LDTR装载的就是这样一个选择子。

LDTR可以在程序中随时改变,通过使用lldt指令。如上图,如果装载的是Selector 2则LDTR指向的是表LDT2。

由于每个进程都有自己的一套程序段、数据段、堆栈段,有了局部描述符表LDT则可以将每个进程的程序段CS、数据段DS、堆栈段SS封装在一起,只要改变LDTR就可以实现对不同进程的段进行访问。

如下代码为建立一个GDT的示例,首先定义一段连续内存。本示例构建了3个元素CODE_DESC、DATA_DESC、VIDEO_DESC,并预留了60个元素。在lgdt命令中将GDT_LIMIT和GDT_BASE赋给了寄存器GDTR。

其中:DD 的意思是define double(4-bytes),与之相似的还有db(byte)dw(word,2-bytes)

; gdt
GDT_BASE:dd 0x00000000dd 0x00000000CODE_DESC:dd DESC_CODE_LOW_32dd DESC_CODE_HIGH_32DATA_DESC:dd DESC_DATA_LOW_32dd DESC_DATA_HIGH_32VIDEO_DESC:dd DESC_VIDEO_LOW_32dd DESC_VIDEO_HIGH_32; reserve 60 gdt entries space
times 60 dq 0GDT_SIZE    equ   $ - GDT_BASE
GDT_LIMIT   equ   GDT_SIZE - 1gdt_ptr:dw GDT_LIMITdd GDT_BASE; enable A20in al, 0x92or al, 0000_0010bout 0x92, al; load GDTlgdt [gdt_ptr]; open protection mode - set cr0 bit 0mov eax, cr0or eax, 0x00000001mov cr0, eax; refresh pipelinejmp dword SELECTOR_CODE:protection_mode_entry

其中,SELECTOR_CODE等的定义如下:

;*************************** segment selector *********************************;
RPL0 equ 00b
RPL1 equ 01b
RPL2 equ 10b
RPL3 equ 11bTI_GDT equ 000b
TI_LDT equ 100bSELECTOR_CODE    equ (0x0001 << 3) + TI_GDT + RPL0
SELECTOR_DATA    equ (0x0002 << 3) + TI_GDT + RPL0
SELECTOR_VIDEO   equ (0x0003 << 3) + TI_GDT + RPL0

jmp dword SELECTOR_CODE:protection_mode_entry

执行这一句会把SELECTOR_CODE装入CS,并跳转到SELECTOR_CODE:protection_mode_entry处。

LDT

LDT示例代码如下所示

; LDT
[SECTION .ldt]
ALIGN   32
LABEL_LDT:
;                            段基址       段界限      属性
LABEL_LDT_DESC_CODEA: Descriptor 0, CodeALen - 1, DA_C + DA_32 ; Code, 32 位
LABEL_LDT_DESC_CODEB: Descriptor 0, CodeBLen - 1, DA_C + DA_32 ; Code, 32 位
LDTLen      equ $ - LABEL_LDT ;LDT表长度  ; LDT 选择子
SelectorLDTCodeA    equ LABEL_LDT_DESC_CODEA    - LABEL_LDT + SA_TIL
SelectorLDTCodeB    equ LABEL_LDT_DESC_CODEB    - LABEL_LDT + SA_TIL
; END of [SECTION .ldt]; Load LDT
mov ax, SelectorLDT
lldt    ax      ;加载LDT在GDT中的描述符

【日拱一卒行而不辍20220921】自制操作系统相关推荐

  1. 【日拱一卒行而不辍20220926】自制操作系统

    分页原理 在汇编文件chapter3/f/pmtest6.asm中,关于分页设置的代码如下. 此时还未开启多进程,仅有的一个进程中这个表有什么作用吗?页表需要进行切换吗? 每一个进程都会形成这样一个完 ...

  2. 【日拱一卒行而不辍20220925】自制操作系统

    下面这段系统联调的代码始终没有调通.需要进一步排查. 在汇编层面,下述代码已经进入了综合的深水区. ; ========================================== ; pmt ...

  3. 【日拱一卒行而不辍20221010】自制操作系统

    多进程 修改后的如下chapter6E的Makefile如下所示如下 ######################### # Makefile for Orange'S # ############# ...

  4. 【日拱一卒行而不辍20220924】自制操作系统

    8086内存地址变换过程 80x86在从逻辑地址到物理地址变换过程中使用了分段和分页二种机制. 第一阶段使用分段机制将程序的逻辑地址变换成可寻址内存空间的线性地址. 第二阶段用分页机制把线性地址转换成 ...

  5. 日拱一卒,功不唐捐 | 每日思考俱乐部 专栏更新通知

    缘起 在 2019 年七月份,我写了一篇文章<我为什么要写反思录>.文中提到了我做记录和思考的初衷,起初写在了自己的私密仓库中,也就是其他人都看不到. 持续了一段时间后,我发现,没有分享的 ...

  6. 日拱一卒,“功不唐捐

    据说,世界上只有两种动物能够登上金字塔顶,一种是老鹰,一种是蜗牛.他们是如此不同,老鹰矫健,敏捷,蜗牛弱小,迟钝,可是蜗牛仍然与老鹰一样能达到金字塔顶端.它凭的就是永不停息的执着精神. "日 ...

  7. 社区人物志|李昊鹏:日拱一卒,功不唐捐

    「社区人物志」是 Apache Doris 社区推出的系列专栏,我们关注每一个对 Doris 做出过贡献的 Contributor ,会定期从对 Doris 做出突出贡献的小伙伴中选出一位「社区之星」 ...

  8. #研发解决方案#大数据协作平台魔盒——日拱一卒,功不唐捐

    郑昀 创建于2017/6/29 最后更新于2017/6/30 关键词:大数据,Spark,SparkSQL,HBase,HDFS,工作流,任务,Flow,Job,监控报警 提纲: 为什么要大数据协作? ...

  9. 日拱一卒,集小胜为大胜; 学以致用,在战争中学习战争;

    项目,证明自己的学习能力: 短期掌握尽可能多的知识,并且连线总结成为网络 : 日拱一卒,集小胜为大胜: 学以致用,在战争中学习战争: 投入足够的时间: 学习中的总结,理解 ,应用,等编程套路: 目的性 ...

最新文章

  1. 2017《面向对象程序设计》寒假作业一
  2. eclipse下安装PyDev不显示问题
  3. ArcGIS Server SOE开发之奇怪异常:
  4. 回归的正则化模型:岭回归和Lasso回归(套索回归)
  5. 全网最详细的hive-site.xml配置文件里如何添加达到Hive与HBase的集成,即Hive通过这些参数去连接HBase(图文详解)...
  6. 七个不放过和四项原则
  7. mysql修改唯一索引
  8. Excel单元格区域快速导出为PDF
  9. Unity接TalkingData自动集成XCode
  10. php怎么黑admin管理员密码是什么,tplink管理员密码是什么?
  11. JSP如何统计页面访问次数
  12. 英语不好,能不能学软件编程?不懂英文能学编程吗
  13. Deen Smart隐私政策
  14. android7.0root工具,你与玩转Android 7.0,只差一个KingRoot的距离
  15. 计算机技术狂人叫什么,科学网-计算机科技创新需要狂人思维模式-姜咏江的博文...
  16. 金山快盘服务器维护中,金山快盘为什么停止服务
  17. redhat7.6添加中文语言支持
  18. Win7 TAP-Windows Adapter V9提示Windows 要求已数字签名的驱动程序
  19. 音频电路设计中的基本知识(-)
  20. 14个岗位,看完就知道自己在互联网行业该怎么混

热门文章

  1. 公众号网课搜题系统-掘光者题库
  2. cms32L051 掉电深度睡眠的唤醒
  3. 小程序内嵌H5、H5回跳至小程序、小程序打开公众号中的文章
  4. MarkDown一些有用的小技巧
  5. Oracle无法标识锁定数据文件,启动错误ORA-01157: 无法标识/锁定数据文件 解决方案...
  6. 小甲鱼python入门笔记(三)
  7. itools android玩游戏,itools模拟器能玩ios游戏吗?
  8. 人脸识别概述及基于多显卡服务器实现百万底库人脸比对的简单实现方案
  9. Codeforces140CNew Year Snowmen
  10. 移动互联网广告的那些事