精华内容
下载资源
问答
  • 实模式和保护模式

    万次阅读 多人点赞 2018-09-23 13:11:02
    从80386开始,CPU有三种工作模式:实模式、保护模式和虚拟8086模式。80286开始的CPU引入保护模式,实际上,实模式概念是在保护模式推出之后为了区别保护模式之前的8086CPU工作模式才有的,在8086时代CPU工作模式只有...

           从80386开始,CPU有三种工作模式:实模式、保护模式和虚拟8086模式。80286开始的CPU引入保护模式,实际上,实模式概念是在保护模式推出之后为了区别保护模式之前的8086CPU工作模式才有的,在8086时代CPU工作模式只有一种,自然没有实模式之说。实模式有着先天的缺陷(下文详述),但出于向上兼容的考虑,现代CPU仍然保持着对16位操纵模式的兼容。

           所谓工作模式,是指CPU的寻址方式、寄存器大小、指令用法和内存布局等。

    实模式

           实模式的“实”体现在程序中用到的地址都是真实的物理地址,“段基址:段内偏移地址”产生的逻辑地址就是物理地址,即程序员可见的地址完全是真实的内存地址。

            在实模式下,内存寻址方式和8086相同,由16位段寄存器的内容乘以16(左移4位)作为段基址,加上16位段偏移地址形成20位的物理地址,最大寻址空间1MB,最大分段64KB。可以使用32位指令,即32位的x86 CPU也可以兼容实模式,此时的实模式相当于高速的8086(32位CPU的实模式可以使用32位下的资源)。在32位CPU下,系统复位或加电时都是以实模式启动,然后再切换为保护模式。在实模式下,所有的段都是可以读、写和可执行的。

           下图是实模式下的内存访问模型:

           8086CPU的实模式开创性地提出了地址分段的概念,改变了在它之前的CPU只能“硬编码”,程序无法重定位的缺点。然而实模式还是有很多缺陷,其中最主要的是实模式的安全隐患。在实模式下,用户程序和操作系统拥有同等权利,因为实模式下没有特权级。此外,程序可以随意修改自己的段基址,加上实模式下对地址的访问就是实实在在的物理地址,因此程序可以随意修改任意物理地址,甚至包括操作系统所在的内存,这给操作系统带来极大的安全问题。

    保护模式

           尽管在Intel 80286手册中已经提出了保护模式,但实际上它只是一个指引。80286虽然有了保护模式但其依然是16位的CPU,其通用寄存器还是16位宽,只不过其地址线由20位变成了24位,即寻址空间扩大到了16MB(但受限于寄存器位宽,单个寄存器的寻址空间仍然为64KB)。80286只是一个“过渡”产品,很快就被淘汰。

           真正的32位地址出现在Intel 80386上,它的地址总线和寄存器都是32位的,因此其单寄存器的寻址空间扩大到了4GB——在当时甚至其后的数年,仅通过段内偏移地址都足以访问内存的任意角落,这也开启了“平坦模型”的时代。

           保护模式本身是80286及以后的x86系列处理器产生的一种操作模式,它具有许多特性设计为提高系统的多道任务和系统的安全性及稳定性——例如内存的保护,分页机制和硬件虚拟存储的支持。现代多数的x86处理器操作系统都运行在保护模式下,包括Linux, Free BSD, 和Windows3.0(它也运行在实模式下,为了和Windows 2.x应用程序兼容)及以后的版本。 

           在保护模式中,内存的管理模式分为两种——段模式和页模式。其中页模式也是基于段模式的。也就是说,保护模式的内存管理模式事实上是:纯段模式和段页式。进一步说,段模式是必不可少的,而页模式则是可选的——如果使用页模式,则是段页式,否则这是纯段模式。

           为了改进实模式下内存访问的不安全性,保护模式给内存段添加了段属性来限制用户程序对内存的操作权限。保护模式引入了全局描述符表(Global Descriptor Table,GDT),GDT的表项是描述段类型属性的数据结构——段描述符。GDT中的每一个段描述符都描述了一个内存段的基本属性,如段基址、段界限、类型、DPL等等。

           正是由于以上概念的提出,使得“段地址:段内偏移地址”的访问策略从实模式下对物理地址的直接映射变成了保护模式下对GDT或LDT的间接映射(如下图所示),进程在访问内存段(无论是数据段还是代码段)前都需要通过特权级检查。段属性的加入让用户程序对内存的访问不再“为所欲为”。

    展开全文
  • X86汇编语言从实模式到保护模式X86汇编语言从实模式到保护模式X86汇编语言从实模式到保护模式X86汇编语言从实模式到保护模式X86汇编语言从实模式到保护模式
  • x86汇编语言-从实模式到保护模式 x86汇编语言-从实模式到保护模式
  • 实模式

    千次阅读 2007-03-04 22:28:00
    一个系统最简单的内存物理模式是实模式,操作系统和程序必须访问的一段线行 没分段的地址空间。 实模式对操作系统和一般程序用户 尽最大的可能隐藏了分段机制的实现方式。 为了用32位结构机制实现实模式模型 ...

     The simplest   memory   model   for a   system   is the   basic “flat   model,”   in   which the   operating
    system and application programs have access to a continuous, unsegmented address space. To
    the greatest extent possible, this basic flat model hides the segmentation mechanism of the archi-
    tecture from both the system designer and the application programmer.

    To implement a basic flat memory model with the IA-32 architecture, at least two segment
    descriptors must be created, one for referencing a code segment and one for referencing a data
    segment (see Figure 3-2). Both of these segments, however, are mapped to the entire linear
    address space: that is, both segment descriptors have the same base address value of 0 and the
    same segment limit of 4 GBytes. By setting the segment limit to 4 GBytes, the segmentation
    mechanism is kept from generating exceptions for out of limit memory references, even if no
    physical memory resides at a particular address. ROM (EPROM) is generally located at the top
    of the physical address space, because the processor begins execution at FFFF_FFF0H. RAM
    (DRAM) is placed at the bottom of the address space because the initial base address for the DS
    data segment after reset initialization is 0.

    翻译:

    一个系统最简单的内存物理模式是实模式,操作系统和程序必须访问的一段线行 没分段的地址空间。

    实模式对操作系统和一般程序用户 尽最大的可能隐藏了分段机制的实现方式。

    为了用32位结构机制实现实模式模型 至少要创造2个段描述符,一个是描述代码段 一个是描述数据段

    2个段都对应着整个线行地址空间 2个段都有一样的基地址和相同的最大地址空间4Gb,通过设置段限长4GB,

    段机制避免了一般因为超过限长范围的通用故障,即使某个特别的地址不存在物理内存, ROM一般被放置在

    在物理地址的最高位。因为处理器开始在FFFFFFF0执行, RAM被设置在底地址空间 因为在DS段中的重置

    初始基地址为0

     

     

    翻译错的地方请多多指教

    展开全文
  • x86汇编语言++从实模式到保护模式 x86汇编语言++从实模式到保护模式
  • 《x86汇编语言:从实模式到保护模式》主要讲述INTEL x86处理器的16位实模式、32位保护模式,至于虚拟8086模式,则是为了兼容传统的8086程序,现在看来已经完全过时,不再进行讲述。《x86汇编语言:从实模式到保护模式...
  • 保护模式与实模式

    2011-12-12 15:50:00
    描述了实模式与保护模式的区别,及启动过程中二者的切换过程!!
  • 计算机保护模式与实模式的区别 什么是实模式、保护模式和虚拟8086方式
  • X86从实模式到保护模式 源代码。
  • x86汇编语言-从实模式到保护模式 配套源码及资料
  • 《x86汇编语言:从实模式到保护模式》主要讲述INTEL x86处理器的16位实模式、32位保护模式,至于虚拟8086模式,则是为了兼容传统的8086程序,现在看来已经完全过时,不再进行讲述。《x86汇编语言:从实模式到保护模式...
  • 实模式、保护模式和虚拟8086模式

    千次阅读 2016-12-04 20:14:06
    参考自:实模式与保护模式解惑之(一)——二者的起源与区别(河西无名式) 概述:实模式和保护模式是处理器发展的两个非常重要的阶段。这两个模式下的编程也有着显著的不同,弄明实模式与保护模式的区别是理解...

    参考自:实模式与保护模式解惑之(一)——二者的起源与区别(河西无名式)


    概述:实模式保护模式是处理器发展的两个非常重要的阶段。这两个模式下的编程也有着显著的不同,弄明实模式与保护模式的区别是理解操作系统运行原理和编写操作系统的基础。本文主要讲解了实模式和保护模式的区别和保护模式的起源,侧重点在二者寻址方式上的差异。


    这里插入一段 CPU 的发展式(源自:8086 CPU 寄存器简介(小宝马的爸爸 - 梦想的家园)):

    Intel CPU 系列,最初是 4 位微处理器 4004,然后到 8 位微处理器的 8008 

    再到 8 位微处理器 8080,以及稍后的 16 位微处理器 8086

    由 8086 开始,Intel 进入现在所谓的  x86  时代 

    Intel  8086 为 16 位  CPU ,而因为在 8086 之前的 CPU 都是 8 位 CPU,这样也就造成了很多的外设也只支持 8 位

    因此  Intel  紧接着就退出了 8 位的 8088 CPU,因此  Intel 8088 也就可以看做是 8086 的 8 位版本

    如果是从汇编语言的角度上来说,8086 和 8088 是没有区别的,即 8086 上跑的程序可以不加修改的移植到 8088 

    8088 上跑的程序也可以不加修改的移植到 8086 上,当然,还是有些特殊的地方是不同的,而这些基本上在这里可以忽略掉

    在 8088  CPU 之后,Intel  又推出了  80186 ,80286 ,这两款 CPU 均是 16 位  CPU 

    对于 80186 来说,其与 8086 的区别可以简单的看做是 80186 多了几条指令而已

    而 80286 则不同,80286 的地址总线数目有了变化

    在 8086 , 8088 , 80186 上,CPU 的地址总线都是 20 根,即可最大寻址 2^20 即达到 1MB 的寻址能力

    而对于 80286 CPU 来说,其地址总线数目达到了 24 根,从而最大寻址能力为 2^24 即 16MB

    由于支持更多的物理内存寻址,因此 80286 便开始成为了多任务,多用户系统的核心

    而后来,Intel  又推出了 80386 ,80386 为 32 位微处理器,Intel 80x86 家族的 32 位微处理器始于 80386

    同时 80386 也完全兼容先前的 8086/8088,80186,80286,并且 80386 全面支持 32 位数据类型和 32 位操作

    并且 80386 的数据总线根数和地址总线根数均达到了 32 根,从而可以最大物理寻址为 232  即 4GB 

    而之后的 80486 也是 32 位微处理器,而后又出来了 Pentium 和 Pentium Pro 等等第五代微处理器

    这些处理器虽然也是 32 位微处理器,但是他们的数据总线和地址总线都有所扩展,比如 Pentium 的数据总线达到 64 位,

    而Pentium Pro 的地址总线位数达到了 36 位 。


    1、保护模式起源

    最开始的程序寻址是 [段:偏移] 模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程序员是可见的。但是,由此也带来两个问题1)无法支持多任务2)程序的安全性无法得到保证(用户程序可以改写系统空间或者其他用户的程序内容)

        实模式将整个物理内存看成分段的区域,代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。

        在保护模式下,全部32条地址线有效,可寻址高达4GB的地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟8086方式,便于执行8086程序。

        保护模式出现的原因是:保护进程地址空间。这样,就产生了一个结果:两种模式下程序的寻址方式发生了变化。

        从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。在系统刚刚启动的时候是实模式,在实模式下,存储器寻址方式和8086是一样的,由段寄存器的内容乘以16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。此时的80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址。实模式下80386不支持优先级,所有的指令相当于工作在最高级(优先级0)下,所以它可以执行所有特权指令包括读写控制寄存器CR0等。实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过使能CR0寄存器的保护模式使能位PE而进入保护模式的。实模式下不支持硬件上的多任务切换。 


    等到操作系统运行起来以后就运行在保护模式。虚拟8086模式是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。它不是一个真正的CPU模式,还属于保护模式。



    2、保护模式和实模式的区别


    2.1 寻址方式


    1)实模式寻址方式

    808616位的cpu,有16位的寄存器,16位数据总线以及20位地址总线,可以访问1MB的内存地址由 [段:偏移] 组成,物理地址的计算公式为:  physical address = segment * 16 + offset   其中,segmentoffset都是16位的。

        通过上述分段技术,能够表示的最大内存为:FFFFh:FFFFh=FFFF0h+FFFFh=10FFEFh=1M+64K-16Bytes1M多余出来的部分被称做高端内存区HMA)。但8086/8088只有20位地址线,只能够访问1M地址范围的数据,所以如果访问100000h~10FFEFh之间的内存(大于1M空间),则必须有第21根地址线来参与寻址(8086/8088没有)。因此,当程序员给出超过1M100000H-10FFEFH)的地址时,因为逻辑上正常,系统并不认为其访问越界而产生异常,而是自动从0开始计算,也就是说系统计算实际地址的时候是按照对 1MB 求模的方式进行的,这种技术被称为wrap-around

       到了 80286,虽然系统的地址总线由原来的20根发展为24根,这样能够访问的内存可以达到2^24=16MB,但是Intel在设计80286时提出的目标是向下兼容,所以在实模式下,系统所表现的行为应该和8086/8088所表现的完全一样,也就是说,在实模式下,80386以及后续系列应该和8086/8088完全兼容仍然使用20位地址线。


    2)保护模式寻址方式

    80386开始,进入32cpu时代,有32位地址总线。寻址仍然采用了[段 偏移] 的模式,虽然段值仍然由原来的16cs/ds等寄存器指定,但此时这些寄存器中存放的不再是段基址,而是一个索引:从这个索引,可以找到一个表项,里面存放了段基址等很多属性,这个表项称为段描述符,这个表就称为GDT。有关GDT的相关介绍,可以参考GDT详解


    2.2 段大小

    实模式下段的大小是固定的64k,而保护模式则不是固定的。关于段基址,实模式下,低16位是0;保护模式下坚持4KB对齐,就是说低 12位 都是0。


    2.3段基址的存放地点

    实模式下在cs/ds等寄存器中,保护模式在段描述符中,而要取得段描述符,又需要取得CS等中的段选择子。


    2.4对段的保护机制

    实模式下没有提供对段的保护,保护模式下面提供了对段的保护机制。


    展开全文
  • CPU实模式和保护模式

    2011-09-07 21:39:31
    介绍CPU的实模式 保护模式。。。。。。。。。。。。。
  • Freedos在运行时从实模式进入保护模式.pdf
  • 06.实模式进入保护模式

    千次阅读 2018-10-30 21:17:30
    上一节我们实现了从内核加载器中加载其它扇区代码并执行,但始终工作在实模式状态下。内存寻址方式和8086相同,由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位偏移地址形成20位的物理地址,最大寻址空间1...

    简介

    上一节我们实现了从内核加载器中加载其它扇区代码并执行,但始终工作在实模式状态下。内存寻址方式和8086相同,由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位偏移地址形成20位的物理地址,最大寻址空间1MB,最大分段64KB。

    保护模式与实模式相比地址转换方式差异较大:

    实模式下的地址转换方式,假设我们在ES中存入0x1000,DI中存入0xFFFF,那么ES:DI=0x1000*0x10+0xFFFF=0x1FFFF。
    保护模式下ES:DI=全局描述符表中第0x200项描述符(一个描述符8个字节)给出的段基址+0xFFFF

    1、描述符
    保护模式下引入描述符来描述各种数据段,所有的描述符均为8个字节(0-7),由第5个字节说明描述符的类型,类型不同,描述符的结构也有所不同。若干个描述符集中在一起组成描述符表,而描述符表本身也是一种数据段,也使用描述符进行描述。“地址转换”由描述符表来完成,描述符表是一张地址转换函数表。

    2、选择子
    选择子是一个2字节的数,共16位,最低2位表示RPL,第3位表示查表是利用GDT(全局描述符表)还是LDT(局部描述符表)进行,最高13位给出了所需的描述符在描述符表中的地址。(注:13位正好足够寻址8K项)有了以上三个概念之后可以进一步工作了,现在程序的运行与实模式下完全一样!各段寄存器仍然给出一个“段值”,只是这个“假段值”到真正的段地址的转换不再是“左移4位”,而是利用描述符表来完成。

    3、80x86系列中引入了两个新寄存器GDTR和LDTR,其中GDTR用于表示GDT在内存中的段地址和段限(就是表的最大偏移上限),因此GDTR是一个48位的寄存器,其中32位表示段地址,16位表示段限。

    目标

    实现实模式到保护模式的切换需要使用汇编语言实现,boot.s文件修改如下

    ;能用于操作内存的寄存器只能是bx、bp、si、di
    ;0x7c00--0x7dff 这512字节用于启动区
    ;对内存的访问都必须指定段寄存器,没有显示指定时将使用ds作为段寄存器
    
    
            org 0x7c00
        
            LOAD_ADDR EQU 0x9000   ;内核加载偏移地址
        
            mov ax,0
            mov ss,ax
            mov ds,ax
            mov es,ax 
        
            mov bx,LOAD_ADDR
           
            mov ch,1        ;柱面号
            mov dh,0        ;磁头号
            mov cl,2        ;扇区号
            mov ah,0x02     ;0x02表示读盘操作
            mov al,1        ;表示连续读取扇区数
            mov dl,0        ;驱动器号,早期有多个软驱,一般只有一个写死0
            int 0x13        ;调用BIOS实现磁盘读取
            jc error        ;读盘操作失败,flag标志寄存器cf 标志位被置1 
            jmp bx          ;跳转到加载的内存地址开始执行代码
        
        
        fin:
            hlt
            jmp fin
        
        
        putloop:
            mov al,[si]
            inc si
            cmp al,0
            je fin
            mov ah,0x0e     ;中断调用参数
            mov bx,15       ;字符颜色
            int 0x10        ;中断调用号
            jmp putloop
        
        
        error:
            mov si,errMsg
            jmp putloop
           
        
        errMsg:
            db 'error'
            db 0
    

    kernel.s文件如下

    	;全局描述符结构 8字节
        ; byte7 byte6 byte5 byte4 byte3 byte2 byte1 byte0
        ; byte6低四位和 byte1 byte0 表示段偏移上限
        ; byte7 byte4 byte3 byte2 表示段基址
        
    
    
        ;定义全局描述符数据结构
        ;3 表示有3个参数分别用 %1、%2、%3引用参数
        ;%1:段基址     %2:段偏移上限  %3:段属性
        %macro GDescriptor  3
            dw %2 & 0xffff
            dw %1 & 0xffff
            db (%1>>16) & 0xff 
            dw ((%2>>8) & 0x0f00) | (%3 & 0xf0ff)
            db (%1>>24) & 0xff 
        %endmacro
    
    
        DA_32       EQU 0x4000   ; 32 位段
        DA_CODE     EQU 0x98     ; 只执行代码段属性值
        DA_RW       EQU 0x92     ; 可读写数据段属性值
    
    
        org 0x9000 
        jmp entry
        
        [SECTION .gdt]
        ;定义全局描述符                            段基址           段偏移上限       段属性
        LABEL_GDT:           GDescriptor         0,             0,             0
        LABEL_DESC_CODE:     GDescriptor         0,             SegCodeLen-1,  DA_CODE+DA_32 
        LABEL_DESC_VIDEO:    GDescriptor         0xb8000,       0xffff,        DA_RW
    
    
        ;gdt 表大小
        GdtLen  equ     $-LABEL_GDT
    
        ;gdt表偏移上限和基地址
        GdtPtr  dw      GdtLen-1
                dd      0
    
    
        ;cpu开机进入实模式时使用的段寄存器 cs,ds,es,ss 和偏移地址组成内存地址,内存地址=段寄存器 * 16 + 偏移地址 
        ;保护模式中段寄存器保存的是gdt 描述表中各个描述符的偏移,也叫选择子
        
    
        SelectorCode32  EQU     LABEL_DESC_CODE-LABEL_GDT
        SelectorVideo   EQU     LABEL_DESC_VIDEO-LABEL_GDT
    
        [SECTION .s16]
        [BITS 16]
    entry:
        mov ax,cs 
        mov ds,ax
        mov es,ax
        mov ss,ax
        mov sp,0x100 
    
        ;设置LABEL_DESC_CODE描述符段基址
        mov eax,0 
        mov ax,cs 
        shl eax,4
        add eax,SEG_CODE32
        mov word [LABEL_DESC_CODE+2],ax
        shr eax,16
        mov [LABEL_DESC_CODE+4],al
        mov [LABEL_DESC_CODE+7],ah
    
        mov eax,0
        mov ax,ds
        shl eax,4 
        add eax,LABEL_GDT
        mov dword [GdtPtr+2],eax
    
        ;设置GDTR 寄存器
        lgdt [GdtPtr]
    
        cli     ;关闭可可屏蔽中断,如键盘中断
    
        in al,0x92 
        or al,0x02
        out 0x92,al 
    
        mov eax,cr0
        or eax,1 
        mov cr0,eax
    
        jmp dword SelectorCode32:0
    
    
        [SECTION .s32]
        [BITS 32]
    SEG_CODE32:
        mov ax,SelectorVideo 
         
    
        ;gs 寄存器是80386新增的辅助段寄存器
        mov gs,ax
    
        ;在屏幕中间显示字符串,屏幕为每行80个字符,共25行。低字节为ascii字符编码,高字节为字符显示属性
        ;可参考 《汇编语言》 王爽,屏幕显示相关章节
    
        ;在屏幕11行20列开始显示字符
        mov ax,(80*11+20)
        mov ecx,2
        mul ecx
        mov edi,eax
        mov ah,00000010b 
    
        mov si,msg 
        
    putloop:
        mov al,[esi]
        cmp al,0
        je  fin
        mov [gs:edi],ax
        add edi,2
        inc esi 
        jmp putloop
    
    fin:
        hlt
        jmp fin
    
    msg:
        db 'protected mode',0
    
    
    SEG_CODE32_END: nop 
    
    
    
    ;32为模式代码长度
    SegCodeLen  EQU SEG_CODE32_END-SEG_CODE32
    

    使用nasm 分别编译boot.s 、kernel.s 生成boot.bat和kernel.bat

    使用C语言软盘功能模块制作虚拟软盘,main.c

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #include "floppy.h"
    
    
    int main(int argc,char **argv){
        FILE *fp = initFloppy("floppy.img");
        if(fp == NULL) {
            printf("初始化磁盘失败");
            exit(0);
        }
        
        FILE *src = fopen("boot.bat", "r");
        if(src == NULL) {
            printf("文件打开失败");
            exit(0);
        }
        char buf[512];
        memset(buf, 0, 512);
        fread(buf, 512, 1, src);
        buf[510] = 0x55;
        buf[511] = 0xaa;
        writeFloppy(0, 0, 1, fp, buf);
        fclose(src);
        
        memset(buf, 0, 512);
        src = fopen("kernel.bat", "r");
        if(src == NULL) {
            printf("文件打开失败");
            exit(0);
        }
        fread(buf, 512, 1, src);
        writeFloppy(1, 0, 2, fp, buf);
        fclose(src);
        
        fclose(fp);
        return 1;
    }
    

    使用C语言文件操作boot.bat、kernel.bat,生成floppy.img 虚拟软盘文件,VirtualBox虚拟机加载该软盘文件效果如下:
    在这里插入图片描述

    我们成功从实模式进入保护模式,并在保护模式下实现字符显示!

    补充

    在内存地址空间中,B8000H~BFFFFH共32KB的空间,为8025彩色字符模式的显示缓冲区,向这个地址空间写数据,写入的内容将立即出现在显示器上.
    在80
    25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色,闪烁,高亮等组合信息).
    这样一个字符在显示缓冲区中就要占两个字节,分别存放字符的ASCII码和属性,80*25模式下,一屛内容在显示缓冲区中占4000个字节.
    显示缓冲区分为8页,每页4KB,显示器可以任意显示任意一页的内容,一般情况下,显示第0页的内容,也就是B8000~B8F9FH中的4000个字节.

    颜色属性字节格式:
    7 6 5 4 3 2 1 0
    BL R G B I R G B
    闪烁 背景(rgb) 高亮 前景(rgb)

    展开全文
  • 实模式与保护模式

    千次阅读 2015-07-31 22:30:10
    实模式实模式简单来说就是16位模式(也有16位保护模式,但由于地址线的限制,实则都差不多),在16位模式下是使用20根地址线,可以寻址1MB内存,但又由于处理器内部的寄存器只有16位(以前的处理器),因此为了能...
  • x86汇编语言 从实模式到保护模式 完整版 文字版 带书签,并有随书文件。
  • x86汇编语言 从实模式到保护模式,
  • 实模式到保护模式

    千次阅读 2019-04-13 16:25:29
    这节就实战编写loader实现从实模式到保护模式再返回实模式 目录 1、从实模式到保护模式 1、从计算机的历史谈起 2、CPU历史的里程碑 - 8086 3、80286的登场 4、初识保护模式 5、80386的登场(计算机新时期的...
  • 详细的讲述了x86如何从实模式转到保护模式值得一看
  • x86汇编语言-从实模式到保护模式.文字版
  • x86 实模式与保护模式

    千次阅读 2016-07-26 16:25:47
    0386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode。实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在...
  • x86汇编语言-从实模式到保护模式 汇编学习 汇编学习
  • 实模式保护模式区别  从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在保护模式。    实模式只能访问地址在1M以下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439,425
精华内容 175,770
关键字:

实模式