保护模式

[书]x86汇编语言:从实模式到保护模式 -- 第11章 进入保护模式,初识全局描述符表GDT

為{幸葍}努か 提交于 2020-01-01 22:26:23
进入保护模式;初始化全局描述符表,通过GDT进入代码段、数据段、堆栈段 ; FILE: c11_mbr.asm ; DATE: 20191229 ; TITLE: 硬盘主引导扇区代码 ; 设置堆栈段和栈指针 ; 0x07c00以此为界限,mbr代码段cs:ip向上,mbr堆栈段ss:sp向下 mov ax, cs mov ss, ax mov sp, 0x7c00 ; 计算gdt所在的逻辑段地址 ; 32位忽略高位0,折算为20位,即ds:bx形式(ds*16 + bx) mov ax, [cs:gdt_base + 0x7c00] ; 低16位 mov dx, [cs:gdt_base + 0x7c00 + 2] ; 高16位 mov bx, 16 div bx mov ds, ax ; 商为逻辑段地址 mov bx, dx ; 余数为偏移地址 ; 创建gdt第#0号描述符 ; 处理器规定,gdt中第一个描述符必须是空描述符 mov dword [bx], 0x00000000 mov dword [bx+0x04], 0 ; 创建gdt第#1号描述符,保护模式下的代码段描述符 ; 该段:线性基地址为0x0000 7c00,段界限为0x0 01FF(即段长512字节),粒度为字节(G=0) ; 属于存储器的段(S=1),是32位的段(D=1),目前位于内存中(P=1)

冰点系统还原精灵使用方法

我是研究僧i 提交于 2019-12-15 14:09:23
冰点系统还原精灵使用方法 开启或解除还原使用方法: 键盘按住Shift不放 鼠标左键双击右下角任务栏的小熊图标 密码为 冻结=自动还原模式(第一项)(也可以理解为 影子模式或者保护模式) 解冻=解除还原模式(第三项) (也可以理解为正常模式或者没有保护模式) 第二项建议新手别使用。 【注意】更改状态,点击“确定”后,重启电脑才生效。 来源: https://www.cnblogs.com/ygit123/p/12043914.html

实模式到保护模式:第11章读书笔记

无人久伴 提交于 2019-12-11 21:03:45
在这一章的主要任务就是从实模式进入保护模式 - 首先创建几个初始化描述符,确保在进入保护模式之后程序能够正常运行, - 将初始化描述符的内容放到GDT表中,此时虽然将GDT表的基地址和大小加载到GDT寄存器中,但是GDT表所在位置已经定义好了 - 接下来将GDT表所在位置和大小全部加载到GDT寄存器中 - 接下来开启第21根地址线,禁止中断,将cr0寄存器的PE位的值置为1,进入保护模式,但是此时还是处于16位的保护模式 2. 什么是GDT表? - 在保护模式中,内存访问方式与实模式不同,在实模式中,寻址方式是 段寄存器*16+偏移量 在32处理器中,段寄存器的结构发生了变化,结构如下 - 在保护模式下的内存访问的方式 - 段寄存器中存储的值为段描述符的索引,也就是0-15位可见部分 - 当将索引加载到寄存器中,处理器会自动到GDT表中根据索引找到对应的描述符,然后将描述符的内容加载到描述符高速缓冲器部分 - 内存访问的方式是根据段寄存器的高速缓冲器中的基地址的内容加上指令的偏移值(描述符的内容在将索引加载到寄存器时,会将描述符的值加载到寄存器的不可见部分),最终得到物理地址 - GDT表其实是对应了一块内存区域,GDT寄存器保存了GDT表的基地址和表的最大偏移量(GDT表的大小 - 1),所有的全局描述符都存储在这块内存区域中,便形成了GDT表 - GDT寄存器的格式如下: -

Lab1:bootloader操作系统的启动

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-05 07:29:40
前言 最近接了一个外包项目再加上填一些之前立的flag,发现好像很久没有发博客了。现在编译原理操作系统算法方面都还有大坑没有填,加上离实习越来越近,应用层方面的学习也要加强了,但反倒是压力越大越想摸鱼 之前暑假的时候跟着书上写过一个 玩具操作系统 ,然后之后还翻了一下Linux0.11一起写了一个 系列的博客 ,但是还是觉得认识的太浅薄,然后最近发现清华大学的一个操作系统课程,就跟着了。准备用博客来记录一下,虽然会和之前的那个系列有些重复,但是也算是加强巩固了 BIOS 对于所有寄存器开机时都有各自的初始值,在X86中,CS和EIP寄存器分别是F000H,0000FFF0H,所以X86开机执行的第一条指令就是位于这个位置的指令,一般这条指令都是长跳转指令,从这里跳到BIOS程序的起始位置。 BIOS的工作是硬件自检和初始化,并且读取该设备的第一扇区,并且转交CPU控制权 bootloader 由BIOS加载的第一扇区一般放的都是bootloader,bootloader的工作就是 切换到保护模式,启用分段机制 读取磁盘中的操作系统内核 将CPU控制权转交到操作系统 实模式 实模式的存在主要是为了兼容老的操作系统(16bit),在这种状态下软件可访问的物理内存空间不能超过1MB,主要的区别就是实模式的寻址能力和方式,实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域

《操作系统真象还原》保护模式入门

有些话、适合烂在心里 提交于 2019-12-04 16:48:08
  以下是第四章的收获: 保护模式   什么是保护模式?直接定义保护模式似乎是件很抽象的事情,我们不妨先看看为什么要有保护模式,且保护模式能为我们做些什么?   保护模式是相对于实模式而言的,且是为了解决实模式的一些问题而提出来的。实模式是8086CPU下的寻址模式、指令用法、寄存器大小等。   那么实模式有什么问题呢?为什么需要保护模式呢? 为什么需要保护模式   ①实模式下,用户进程和系统进程属于同一特权级别,平起平坐,系统进程能调用什么,用户进程就能调用什么。   ②实模式下,进程访问的地址直接就是物理地址,想修改内存里面的内容十分容易,没有一点限制。   ③实模式下,可以随意修改段基址,访问所有内存。   以上三点均为安全问题,也是主要问题。我们可以从保护模式的“保护”中看出,保护模式下运行的程序会更加安全可靠,更具“安全感”,不会被另一个程序随意修改。   ④访问内存,需要不断变换段基址,来访问我们想要的内存地址,因为一个段的大小只有64KB。   ⑤内存大小只有1M,不够用。   ⑥每次只能运行一个程序,浪费CPU的资源。   ④到⑥点是使用上的问题,想想如果我们现在的电脑还用着使用着实模式下的CPU的的话,程序的效率会有多么低下,访问内存还得自缚手脚,运行一个程序还要等上一个程序运行完,显然是现代操作系统里难以想象的。   下面就来想如何解决这些问题,第①点的话

ucore实验Lab1知识点总结

ε祈祈猫儿з 提交于 2019-12-04 16:20:56
Intel 80386 ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统。 Intel 80386是80x86系列中的第一种32位微处理器。80386的内部和外部数据总线都是32位,地址总线也是32位,可寻址高达4GB内存。 工作方式包括实模式、保护模式以及虚拟86模式。 Bootloader 我们知道计算机启动是从BIOS开始,再由BIOS决定从哪个设备启动以及启动顺序,比如先从DVD启动再从硬盘启动等。计算机启动后,BIOS根据配置找到启动设备,并读取这个设备的第0个扇区,把这个扇区的内容加载到0x7c00,之后让CPU从0x7c00开始执行,这时BIOS已经交出了计算机的控制权,由被加载的扇区程序接管计算机。 这第一个扇区的程序就叫Boot,它一般做一些准备工作,把操作系统内核加载进内存,并把控制权交给内核。由于Boot只能有一个扇区大小,即512字节,它所能做的工作很有限,因此它有可能不直接加载内核,而是加载一个叫Loader的程序,再由Loader加载内核。因为Loader不是BIOS直接加载的,所以它可以突破512字节的程序大小限制(在实模式下理论上可以达到1M)。如果Boot没有加载Loader而直接加载内核,我们可以把它叫做Bootloader。 Bootloader加载内核就要读取文件,在实模式下可以用BIOS的INT 13h中断

实模式/保护模式

一曲冷凌霜 提交于 2019-12-04 09:44:36
## 实模式和保护模式 ### 实模式 时间短,一般无法感知 CPU 复位 (reset) 或加电 (power on) 的时候就是实模式启动 ,这个时候处理器是以实模式工作, 不能实现权限分级,也不能访问 20 位以上的地址线 ,也就是只能访问 1M 内存( 2^18bits, 18 位地址线) 之后一般就是加载 OS 模块,进入保护模式 8086 地址线是 20 位,寄存器是 16 位,采用: 物理地址 = 段地址 <<4 + 偏移 从 8086 发展来的 32 位处理器地址线扩展到 32 位,有 4GB 寻址空间 在保护模式下,系统计算地址的时候是按照对 1MB 求模进行 ——Wrap-Around 技术 ### 保护模式 #### 起源 最开始的程序寻址是:段 + 偏移,这样的好处是程序员指定的地址就是物理地址,物理地址对程序员可见 这样带来的问题是: 1. 无法支持多任务 2. 程序的安全性无法得到保证 在 windows 的旧版本中,电脑时不时死机 / 蓝屏,这其实就是因为内存被破坏导致的。 因为在实模式中 , 将物理内存看成分段的区域,程序代码和数据位于不区域,系统程序和用户程序区别对待,而指针是任意的,如果用户程序指针指向了系统程序或其他用户程序区域,并改变了区域的数据,就会造成破坏,导致程序 / 系统崩溃 在保护模式下,全部 32 条地址线有效, 4G 寻址空间

ucore-lab1-练习3report

断了今生、忘了曾经 提交于 2019-12-04 04:20:15
文章链接: https://www.cnblogs.com/cyx-b/p/11809742.html 作者: chuyaoxin 一、实验内容 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。请分析bootloader是如何完成从实模式进入保护模式的。 提示:需要阅读 小节“保护模式和分段机制”和lab1/boot/bootasm.S源码,了解如何从实模式切换到保护模式,需要了解: 为何开启A20,以及如何开启A20 如何初始化GDT表 如何使能和进入保护模式 二、实验相关 (1)汇编 没有学过汇编的我刚看到源码时,有点懵逼,于是,我首先查了不少关于汇编的小资料。 Ucore中用到的是AT&T格式的汇编 在 AT&T 汇编格式中 %   寄存器名要加上 '%' 作为前缀; $   用 '$' 前缀表示一个立即操作数;   .set symbol, expression 将symbol的值设为expression cli 屏蔽系统中断 .code16 由于代码段在实模式下运行,所以要告诉编译器使用16位的模式编译 标号: 在x86汇编代码中,标号有唯一的名字加冒号组成。它可以出现在汇编程序的任何地方,并与紧跟其后的哪行代码具有相同的地址。 概括的说 ,当程序中要跳转到另一位置时,需要有一个标识来指示新的位置,这就是标号

ucore-lab1-练习3report

瘦欲@ 提交于 2019-12-04 04:02:47
文章链接: https://www.cnblogs.com/cyx-b/p/11809742.html 作者: chuyaoxin 一、实验内容 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader。请分析bootloader是如何完成从实模式进入保护模式的。 提示:需要阅读 小节“保护模式和分段机制”和lab1/boot/bootasm.S源码,了解如何从实模式切换到保护模式,需要了解: 为何开启A20,以及如何开启A20 如何初始化GDT表 如何使能和进入保护模式 二、实验相关 (1)汇编 没有学过汇编的我刚看到源码时,有点懵逼,于是,我首先查了不少关于汇编的小资料。 Ucore中用到的是AT&T格式的汇编 在 AT&T 汇编格式中 %   寄存器名要加上 '%' 作为前缀; $   用 '$' 前缀表示一个立即操作数;   .set symbol, expression 将symbol的值设为expression cli 屏蔽系统中断 .code16 由于代码段在实模式下运行,所以要告诉编译器使用16位的模式编译 标号: 在x86汇编代码中,标号有唯一的名字加冒号组成。它可以出现在汇编程序的任何地方,并与紧跟其后的哪行代码具有相同的地址。 概括的说 ,当程序中要跳转到另一位置时,需要有一个标识来指示新的位置,这就是标号

操作系统实现(一):从Bootloader到ELF内核(转载)

心不动则不痛 提交于 2019-12-04 03:44:16
原文链接: http://www.cppblog.com/airtrack/archive/2014/10/30/208729.html Bootloader 我们知道计算机启动是从BIOS开始,再由BIOS决定从哪个设备启动以及启动顺序,比如先从DVD启动再从硬盘启动等。计算机启动后,BIOS根据配置找到启动设备,并读取这个设备的第0个扇区,把这个扇区的内容加载到0x7c00,之后让CPU从0x7c00开始执行,这时BIOS已经交出了计算机的控制权,由被加载的扇区程序接管计算机。 这第一个扇区的程序就叫Boot,它一般做一些准备工作,把操作系统内核加载进内存,并把控制权交给内核。由于Boot只能有一个扇区大小,即512字节,它所能做的工作很有限,因此它有可能不直接加载内核,而是加载一个叫Loader的程序,再由Loader加载内核。因为Loader不是BIOS直接加载的,所以它可以突破512字节的程序大小限制(在实模式下理论上可以达到1M)。如果Boot没有加载Loader而直接加载内核,我们可以把它叫做Bootloader。 Bootloader加载内核就要读取文件,在实模式下可以用BIOS的INT 13h中断。内核文件放在哪里,怎么查找读取,这里牵涉到文件系统,Bootloader要从硬盘(软盘)的文件系统中查找内核文件,因此Bootloader需要解析文件系统的能力