切换到保护模式

【我所認知的BIOS】—>實模式&保護模式切换实例 【我所認知的BIOS】—>實模式&保護模式切换实例LightSeed      2009-6-23      上一章從基礎概念上我談了談我的理解。素不知“紙上得來終覺淺,絕知此事要躬行”呀!不多說二話,我們來詳細剖析實模式和保護模式的相互切換。(我儘量解釋清楚每一句話,以下舉的例子是楊季文老師書里一個最簡單的例子)Let us go!1、這個例子中code做的事下麵我們看到 阅读详情

.model large
.586p
;******************
jump macro selecter,offsetv   ;16位偏移的段间直接转移指令的宏定义
  db 0eah
  dw offsetv
  dw selecter
endm
;******************
h_line macro x,y,re,col  ;写屏幕上任一行像素点
       local flg1,flg2,cag
       ;call page0

       mov bx,x
flg1:  push bx
       mov eax,y
       mov ecx,640
       mul ecx
       add eax,ebx
       mov ecx,10000h
       div ecx

       mov di,dx
       push di
       mov dx,ax
       push dx

       cmp dx,pg
       jnz cag
       jmp flg2

cag:   mov pg,dx
       mov ah,4fh
       mov al,05h
       mov bh,00h
       mov bl,00h
       pop dx
       push dx
       int 10h

     
flg2:  pop dx
       mov al,col
       pop di
       stosb
       pop bx
       inc bx     
       cmp bx,x+re
       jb flg1

      
endm
;****************
;*****************
descriptor struc  ;存储段描述符结构
  limitl dw 0     ;段界限
  basel  dw 0     ;段基(0--15)
  basem  db 0     ;段基(16--23)
  attributes dw 0 ;属性
  baseh db 0      ;段基(24--31)
descriptor ends
;*****************
echoch macro ascii ;显示字符
  mov ah,2
  mov dl,ascii
  int 21h
endm
;****************
pdesc struc     ;伪描述符结构
  limit dw 0
  base dd 0
pdesc ends
;*****************
atdw=92h
atdc=98h
;*****************
dseg segment use16

 gdt       label byte
 dummy     descriptor<>
 code      descriptor<0ffffh,,,atdc,>
 code_sel  =code-gdt
 datas     descriptor<0ffffh,0h,11h,atdw,0>
 datas_sel =datas-gdt
datad     descriptor<0ffffh,,,atdw,>
datad_sel =datas-gdt
gdtlen    =$-gdt
;
vgdtr     pdesc<gdtlen-1>
;
bufferlen =256
buffer    db bufferlen dup(0)
pg dw 0
dseg ends
;*******************
cseg segment use16
 assume cs:cseg,ds:dseg

 start:
   mov ax,dseg
   mov ds,ax

   mov bx,16
   mul bx                ;计算并设置GDT基地址
   add ax,offset gdt     ;界限已定义
   adc dx,0            
   mov word ptr vgdtr.base,ax
   mov word ptr vgdtr.base+2,dx

   mov ax,cs
   mul bx
   mov code.basel,ax     ;代码段开始偏移量为0
   mov code.basem,dl     ;界限已定义
   mov code.baseh,dh
;设计目标数据段描述符
   mov ax,ds
   mul bx                ;计算并设置数据段基地址
   add ax,offset buffer
   adc dx,0
   mov datad.basel,ax
   mov datad.basem,dl
   mov datad.baseh,dh

   lgdt fword ptr vgdtr  ;装入描述符

   cli

   call enableA20        ;打开地址线A20
;切换到保护方式
    mov eax,cr0
    or eax,1
    mov cr0,eax
 ;清指令预取队列,真正进入保护方式
    jump <code_sel>,<offset virtual>
    ;
virtual:
   mov ax,datas_sel
   mov ds,ax             ;加载源数据段描述符
   mov ax,datad_sel
   mov es,ax             ;加载目标数据段描述符
   cld
   xor si,si             ;设置初始指针
   xor di,di
   mov cx,bufferlen/4    ;设置4字节为单位的缓冲区长度
   rep movsd     ;传送.repz movsd 系统无法识别
;;*********************************
push a
mov ax,500
mov es,ax
mov bx,0
mov dl,0
mov dh,0
mov ch,0
mov cl,2
mov al,1
mov ah,2
int 0x13
popa

; pusha
; ;mov ax,dseg
; ;mov ds,ax
; mov ax,4f02h
; mov bx,118h
; int 10h
; mov eax,0a0000h
; mov es,ax
;
; h_line 20,20,100,0fh
; La:
; mov ah,10h
; int 16h
; cmp al,1bh
; jz kk1
; jmp La
; kk1:
; popa
;
;;*************************************
;返回实方式
   mov eax,cr0
   and eax,0fffffffeh
   mov cr0,eax
  
;清指令预取队列,进入实方式
    jump <seg real>,<offset real>
 real:
   call disableA20  ;关闭地址线A20
   sti              ;开中断
   ;
   mov ax,dseg      ;重置数据段寄存器
   mov ds,ax
   mov si,offset buffer
   cld              ;显示缓冲区内容
   mov bp,bufferlen/16
nextline:
   mov cx,16
nextch:
   lodsb
   push ax
   shr ax,4
   call toascii
   pop ax
   call toascii
   echoch al
   echoch ' '
   loop nextch
   echoch 0dh
   echoch 0ah
   dec bp
   jnz nextline
   ;
   mov ax,4c00h
   int 21h

 ;*****************
  toascii proc
  and al,0fh
  mov al,30h
  cmp al,3ah
  jb  kk
  add al,07h
  kk:
  toascii endp

;******************
enableA20 proc
  push ax
  in al,92h
  or al,02h
  out 92h,al
  pop ax
  ret
enableA20 endp

;***************
disableA20 proc
   push ax
   in al,92h
   and al,0fdh
   out 92h,al
   pop ax
   ret
disableA20  endp
;******************

cseg ends
end start

操作系统:从实模式切换到保护模式 转载请注明出处         最近一直在学着自己动手制作操作系统,昨天总算是有了点成效,现作博客一篇整理下思路。         本次提供的代码是从实模式到保护模式的切换,并在保护模式下打印"Hello, world!"。 实验环境         lenovo G470         ubuntu11.10         bochs-2.4.6         环境搭 阅读详情

相关推荐

别再硬啃理论了!手把手教你用Simulink搭VSG并网模型,模拟线路故障(含三相故障模块详解)

本文提供了一份详细的Simulink VSG并网模型搭建指南,特别聚焦于三相故障模块的配置与仿真。通过逐步指导,帮助电力电子工程师掌握从基础电路搭建到复杂故障模拟的全流程,包括单相接地、两相短路等典型故障的波形分析与参数设置技巧,有效弥合理论与实践的鸿沟。

weixin_29057237的博客 317

系统从实模式跳转到保护模式的基本步骤

我们知道系统刚启动时是在实模式下的,需要经过一个跳转才能进入保护模式,获得更大的寻址能力。 在实模式下,系统是在16位的寄存器和,16位的数据总线和20位的地址总线,其最大寻址能力为1M。 而进入保护模式,则是32位的地盘,32位的地址线,所以寻址空间可达4GB,段寄存器中保存的则变成了一个索引,这个索引指向一个数据结构的表项,而这个数据结构就是GDT。 以下是进入保护模式的基本...

weixin_30420305的博客 531

2017–2024年中国10米/20米分辨率水稻种植分布数据集

摘要:本数据集提供2017-2024年中国23个省级行政区的水稻种植分布数据,包含单季稻和双季稻分类(GeoTIFF格式,WGS84坐标系)。5个省份分辨率为20米,其余为10米,基于Sentinel卫星数据和TWDTW方法生成。数据公开共享(7.99GB),使用需注明来源并引用相关文献(DOI:10.12199/nesdc.ecodb.rs.2025.012)。涉及学科包括遥感、生态学和地理学,研究成果需发送至国家生态科学数据中心备案。

国科大硕士在读,分享Python/GEE/Matlab/R专业代码实践,涵盖数据分析、算法开发与应用技巧等,以代码会友。 1381

linux汇编跳转保护模式,在Linux内核中从真实模式转换为保护模式

看来您的问题实际上是关于存储在下一行的偏移量是如何工作的,因为它相对于段的开始,不一定是内存的开始:2: .long in_pm32 # offset确实 in_pm32 是相对于linker script使用的偏移量 . 特别是链接器脚本具有:. = 0;.bstext : { *(.bstext) }.bsdata : { *(.bsdata) }. = ...

weixin_32480781的博客 149

深度解析direct path write temp与ASM IO性能问题:Oracle 19.17视图查询优化指南

本文深度解析了Oracle 19.17版本中复杂视图查询出现`direct path write temp`与`ASM IO for non-blocking poll`性能瓶颈的根本原因。通过对比11.2.0.4版本的执行计划差异,文章提供了从CBO参数调整、存储层优化到SQL架构重构的完整实战调优指南,帮助DBA有效解决升级后的查询性能问题。

2y3u4i5o6p的博客 1100

AI大模型驱动Web UI自动化测试:Playwright与RobotFramework智能整合实践

Web自动化测试是软件质量保障的关键环节,其核心原理是通过脚本模拟用户操作,对Web应用界面进行功能验证。传统方法依赖固定的元素定位和脚本逻辑,在应对频繁的UI变更时面临维护成本高、脚本脆弱的挑战。随着AI大模型技术的发展,其强大的自然语言理解和代码生成能力为自动化测试带来了新的技术价值。通过将大模型的意图理解与代码生成能力,与Playwright强大的浏览器自动化执行引擎以及RobotFramework灵活的关键字驱动框架相结合,可以构建出能够理解自然语言指令、动态生成稳定操作脚本的智能测试系统。这种融合

weixin_28718769的博客 412

关于从保护模式切换到实模式的相关说明

参考于渊的《自己动手写操作系统》第三章中从实模式切换到保护模式。 在由保护模式切换到实模式之前,用normal选择子对段寄存器进行填充。 原因: 在切换到实模式之前,把一个指向似乎没有用的数据段的描述符Normal的选择子装载到DS和ES。这是为什么呢? 实模 式下 段描 述符 高速 缓冲 寄存 器的 内容 段寄存器 段基地址

rongwenbin的专栏 1335

STM32F407编译下载全流程:从CubeMX到HEX烧录

嵌入式固件开发中,编译与下载是连接代码与硬件的关键闭环。其本质是将高级语言描述的逻辑,经交叉编译(ARM GCC)、链接(ELF生成)、格式转换(HEX/BIN)后,通过调试接口(SWD/UART)写入MCU Flash存储器的过程。该流程涉及工具链协同、二进制格式特性(如Intel HEX的地址映射与无元数据设计)、启动模式(System Memory Bootloader)、Flash选项字节(RDP/WRP)等底层机制,直接决定固件可运行性与安全性。典型应用场景包括STM32F407开发板调试、量产固

weixin_28840811的博客 259

【操作系统】从实模式进入保护模式

从实模式进入到保护模式(不知道为什么要进入的保护模式的可以参考文章:【操作系统】CPU的保护模式与实模式的区别),我们需要进行以下几个步骤: 为什么要打开就不在此赘述了,详细可以查看之前写过的文章:【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因,总的来说是旧的CPU(8086/8088之类的)在实模式下地址线为20位(A0~A19),最大寻址空间为0xFFFFF,超出部分会被地址回卷到0重新开始。但是进入到保护模式下我们需要去访问更大的内存空间,所以需要将“地址回卷”这个功能关闭掉

师兄怎么办 2041

垂类大模型 研发方向与具体方案调研

领域知识库加上通用大模型,针对通用大模型见过的知识比较少的问题,利用向量数据库等方式根据问题在领域知识库中找到相关内容,再利用通用大模型强大的summarization和qa的能力生成回复,完成本次垂直大模型研发。目前很多企业希望将大模型的能力应用到企业内部当中,但很多通用大模型只是一个预训练模型,其所能回答的知识主要来源于互联网上公开的通用知识库,对于部分垂直领域和企业内部的私有知识库的问答,给出的回答。:垂类大模型的效果与底座性能息息相关,研发垂类大模型第一步就是确定开源大模型解决方案。

风吹落叶的博客 3329

【工业级视觉实战】海康威视SDK + Python + YOLOv11:零延迟目标追踪系统落地指南

要在 Python 中调用海康 DLL,首先得把 C++ 的结构体 1:1 翻译过来。这是很多开发者踩坑最深的地方(指针错误、内存溢出)。import sys# 根据操作系统加载库else:# 定义设备信息结构体 (对应 C++ LPNET_DVR_DEVICEINFO_V30)("sSerialNumber", ctypes.c_byte * 48), # 序列号("byAlarmInPortNum", ctypes.c_byte), # 报警输入个数。

BUG猿的博客 225

操作系统的实现(1)

实模和保护模式的概念 接下来比较重要的一点就是从实模式到保护模式的切换了. 这一块概念比较多, 我也是参考了多份资料才分析清楚了之间的关系. 好在这部分网上相关的文章很多, 这里我挑重点用自己的理解概括一下. CPU有多种工作模式, 这里我们提一下实模式和保护模式. 实模式 : 操作系统刚启动就算实模式, 这种模式下, 寻址是通过 : 物理地址 = 段值 * 16 + 偏移实现的 (由于8086...

weixin_30832143的博客 205

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

实模式、保护模式的区别 实模式保护模式切换方法

实模式保护模式区别       从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在保护模式。          实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。          在保护模式下,全部32条地址线有效,可寻址高达4G字节的

那些年....的专栏 5689

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

80x86保护模式系列教程(4)实模式与保护模式切换实例

四.实模式与保护模式切换实例本文介绍两个实现实模式与保护模式切换的实例,通过他们说明如何实现实模式与保护模式的切换, 也说明保护模式下的80386及其编程。 演示实模式和保护模式切换的实例(实例一)实例一的逻辑功能是,以十六进制数的形式显示从内存地址110000H开始的256个字节的值。本实例指定该内存区域的目的仅仅是想说明切换到保护模式的必要性,因为在实模式下不能访问该指定内存区

Liang Tang's 专栏 3930

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

保护模式及其编程——实模式与保护模式的切换

机器上电,CPU进入实模式,从物理地址0xFFFFFFFF0处开始执行初始化代码,设置基本系统功能操作必要的数据结构信息,例如处理中断和异常的IDT表。接下来,如果继续在保护模式工作,需要加载操作系统模块;如果要进入实模式,那么需要进行模式切换。 1.进入保护模式时的初始化操作 处理器能够进入到保护模式之前,需要操作系统加载和初始化软件必须在内存中设置好保护模式下使用的数据结构

xyjikl 625

DG 3种保护模式切换

最大保护模式 这种保护模式确保如果主数据库故障不会发生数据丢失。要提供这种级别的保护,恢复每个事务所需的重做数据必须在事务提交之前同时 写到本地联机重做日志和至少一个备数据库上的备重做日志。要确保不发生数据丢失,如果故障导致主数据库无法写重做流到至少一个事务一致性备数据 库的备重做日志时,主数据库会关闭。 最大可用性模式 这种保护模式提供了可能的最高级别的数据保护,而不用与主数据库的可...

leo__1990的博客 643

RMAN DG切换(主备切换,保护模式切换,Failover)

本案例使用Oracle 12.1.2.0 + Redhat 6.5 x64版本 rman dg切换方式有两种:一种是采用dgmgrl的方式 ,一种是采用手动方式来切换(be)

YiChen的博客 704

Console1984高级技巧:保护模式与非保护模式切换最佳实践

Console1984是Rails控制台的安全扩展工具,专为保护敏感数据访问和审计而设计。这款强大的安全工具提供了保护模式和非保护模式两种工作状态,帮助开发者在生产环境中安全地访问敏感数据。本文将详细介绍Console1984的两种模式切换技巧,帮助您掌握这个Rails安全控制台的最佳实践方法。 ## Console1984保护模式详解 🛡️ 保护模式是Console1984的默认工作状态,

gitblog_00161的博客 401

实模式切换到保护模式

代码3.1 chapter/a/pmtest1.asm 代码66到77行。   在做好准备后,从实模式切换到保护模式并不难。原则上只要把控制寄存器CR0中的PE位置1即可。本实例采用如下三条指令设置PE位:            mov          eax,cr0          or            eax,1          mov          c

长井的专栏 1175

实模式与保护模式切换

四.实模式与保护模式切换实例本文介绍两个实现实模式与保护模式切换的实例,通过他们说明如何实现实模式与保护模式的切换, 也说明保护模式下的80386及其编程。 演示实模式和保护模式切换的实例(实例一)实例一的逻辑功能是,以十六进制数的形式显示从内存地址110000h开始的256个字节的值。本实例指定该内存区域的目的仅仅是想说明切换到保护模式的必要性,因为在实模式下不能访问该指定内存区域,

in_han 的专栏 967

保护模式与实模式的切换

关于从保护模式切换到实模式的相关说明   参考于渊的《自己动手写操作系统》第三章中从实模式切换到保护模式,最后有重新切回实模式的代码(代码如下),其中有几点不太明白的,参考其他文章之后在此记录一下。 其中还有不太明白的地方,希望大家能在下面 留个言帮我讲明白,谢谢。 下面代码有些宏定义没贴出来,应该能看明白。   1; ====================

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1244

实模式与保护模式切换(一)

基于网上的一些博客的基础上,我对操作系统中实模式与保护模式的切换,做了一点整理,仅供参考,这篇写的是从实模式进入到保护模式。 在从实模式进入到保护模式之前,要先对GDT(全局描述符表),GDT段选择子,数据段,全局堆栈段进行定义。 对全局描述符表定义 org 0100h ;加载到偏移地址0100处 jmp LABEL_BEGIN ;跳入到16位代码段(实模式)进行各个数据段,代码段,堆栈段的初始化,最后跳入到保护模式 ; 对GDT定义 ;SECTION.g

qq_43302174的博客 1373
上一篇: 关于汇编的图形显示
z_long
博客等级 码龄17年 13粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值