一个操作系统的实现中jmp dword SelectorCode32:0的理解

	; 准备切换到保护模式
	mov	eax, cr0
	or	eax, 1
	mov	cr0, eax

	; 真正进入保护模式
	jmp	dword SelectorCode32:0	; 执行这一句会把 SelectorCode32 装入 cs,
					; 并跳转到 Code32Selector:0  处

这段时间在一个操作系统的实现

好书啊,感谢作者

这两天一直纠结在    ;

jmp    dword SelectorCode32:0    ;

这句话,看了些资料,现将自己理解的分享一下,不对的地方,大家指点一下

首先经过上面三句话之后,已经进入到了保护模式了

SelectorCode32应该是段选择子,而现在还是16位下,如果不加dword 后面的偏移地址是16位  也就是 0000h

而32下的偏移地址应该是32位,于是nasm提供了这样一个用法   jmp    dword SelectorCode32:0    ;

表示后面的0是32位的,这几句代码的下面就是32位的代码了,其虚拟地址是从0开始的

经过段描述符就到了32位的代码了

时间: 2024-07-28 17:19:40

一个操作系统的实现中jmp dword SelectorCode32:0的理解的相关文章

把一个整数数组中所有的非0整数移到左边

1.一个整数数组,把非0的整数移到左边,对整数的顺序不做要求.写一个函数实现,并返回数组的非0整数个数.不使用额外的存储.比如: 初始数组为:[ 1, 0, 2, 0, 0, 3, 4 ],处理后的数组是:[ 4, 1, 3, 2, 0, 0, 0 ],函数返回非0整数的个数4. 解答:两个指针,一个从左向右移动,一个从右向左移动. int moveLeft(int* arr, int len) { if (arr == NULL || len <= 0) return -1; int i =

一个操作系统的实现(4)-认识LDT

看到这里,你应该已经很了解GDT了,如果还不了解GDT.请看这篇文章:一个操作系统的实现(2)-认识保护模式,认识保护模式那篇文章的最后详细介绍了由16位寻址升级到32位寻址而引入的GDT. LDT(Local Descriptor Table):从名字上面就可以看出来它与GDT(Gobal Descriptor Table)的区别.GDT是全局描述符表,LDT是局部描述符表(相对于GDT). 下面仍然是从代码的角度讲解什么是LDT.主要讲解在上一节的基础上增加的代码.在文章的最后会附上所有代码

一个操作系统的实现(9)-中断和异常

这节讲了中断与异常的一些基本概念.然后通过代码实现一个显示字符的中断和时钟中断. 实模式与保护模式下的中断有区别 保护模式下的中断与实模式下的中断有几点不同. 实模式下的中断向量表在保护模式下被IDT取代 实模式下可以使用BIOS中断,而保护模式下不能用 这里面出现了一个新的名词IDT,接下来就介绍什么是IDT. 中断描述符表(IDT,Interrupt Descriptor Table) 中断描述符表的作用 与GDT和LDT一样,IDT也是一个描述符表,IDT的描述符可以是下面三种之一: 中断

《一个操作系统的实现》读书笔记--第三章---不同特权级代码段之间的跳转

http://blog.csdn.net/begginghard/article/details/7262901 1.特权级 2.一致代码段和非一致代码段 3.DPL.RPL.CPL分别代表的含义,存储在什么位置,以及它们之间的关系 4.不同特权级数据段之间的访问规则 5.不同特权级代码段之间的转移 6.代码段之间的转移对堆栈的影响 7.结合pmtest5.asm来见证不同特权级代码段之间的跳转 一.特权级在IA32的分段机制下,特权级总共有4个特权级别,从高到低分别是0.1.2.3.数字越小表

一个操作系统的实现(5)-关于特权级

这节讲述IA32分段机制中的特权级.包括CPL.DPL.RPL的介绍以及代码实现不同特权级之间的转换. IA32的分段机制有四种特权级别,从高到低分别是0.1.2.3.数字越小表示的特权级越大. 处理器引入特权级的目的是为了保护核心代码和数据.核心的代码和数据会被放在较高的层级中.从而避免低特权级(外层)的任务在不被允许的情况下访问位于高特权级(内层)的段. 在开始之前,首先介绍一下一致代码段的概念. 一致代码段 关于一致代码段中一致的理解:程序经常会通过call和jmp实现直接转移操作.当转移

一个操作系统的实现(2)-认识保护模式

今天开始学习intel处理器的保护模式.书的第二章 这节讲述的是如何从实模式进入保护模式.用的例子是在保护模式下向屏幕上输出字符P 如何进入保护模式呢?主要步骤如下: 0. 进入保护模式的步骤 准备GDT 用lgdt加载gdtr 打开A20 置r0的PE位位1 跳转,进入保护模式 下面是书的例子: 1. 进入保护模式实例 ; ========================================== ; pmtest1.asm ; 编译方法:nasm pmtest1.asm -o pm

一个操作系统的实现(8)-进一步体会分页机制

上面的两篇文章中,我们对可用内存进行了统计,并且合理的分配了页表的大小.这节中,我们来看看分页的好处 在此之前不知道你有没有注意过一个细节,如果你写一个程序(在Linux或Windows下均可),并改个名复制一份,然后同时调试,你会发现,从变量地址到寄存器的值,几乎全部都是一样的!而这些"一样的"地址之间完全不会混淆起来,而是各自完成着自己的职责.这就是分页机制的功劳,下面我们就来模拟一下这个效果. 线性地址到物理地址的映射 先执行某个线性地址处的模块,然后通过改变cr3来转换地址映射

一个操作系统的实现(7)-获取机器内存并进行合理分页

在前面的程序中,我们用了4MB的空间来存放页表,并用它映射了4GB的内存空间,而我们的物理内存不见得有这么大,这显然是太浪费了.如果我们的内存总数只有16MB的话,只是页表就占用了25%的内存空间.而实际上,如果仅仅是对等映射的话,16MB的内存只要4个页表就够了.所以,我们有必要知道内存有多大,然后根据内存大小确定多少页表是够用的.而且,一个操作系统也必须知道内存的容量,以便进行内存管理. 克勤克俭用内存 这里利用中断15h来获取计算机的内存. 在调用中断15h之前,我们需要填充下列寄存器:

一个操作系统的实现(6)-初识分页机制

这节仍然是从实现的角度来讲述分页机制. 为什么要引入分页机制.我们都知道分段机制是为了提供保护机制,那么为什么还要引入分页机制呢? 为什么引入分页机制 想象一下这样一种情况:假设我们用的计算机物理内存是4GB,但是我们的程序大小是5GB.那么这个时候我们无法将程序全部放到内存中,也就无法运行程序.分页机制引入的原因之一就是为了解决这个问题.分页机制的引入实现了虚拟存储器的机制. 另外,程序执行具有局部性,也就是说一段时间内,只需要程序代码中的一小部分(相对于整个程序)就可以实现程序的执行.那么我