谁有好的讲保护模式的书,给好书推荐演讲稿几本谢谢...

保护模式----从分段到分页
其实很早以前就想写这个关于分页模式的了,可是自己还是有点东西没弄的太明白,今天也是终于写出来了,关于上一篇讲分段机制的,一博友还夸了我一下,另我有点小激动,开博客三年来第一次啊!谢谢那位博友,也同时给我很大鼓励,觉得就是每天抱着一大堆天书,没人指导的也值了!
当然也免不了会有错误,但是以后会开一个错误更正章,专门负责更正错误。
关于分段模式和分页模式的关系,分页是在分段的基础上进行的,具体关系请见:内存管理--三个地址,分页与分段的关系
大家都知道,我们现在的内存现在都是几个GB,上一章也说了是为了提高寻址范围而有了保护模式,那么在保护模式下分段模式下总感觉内存定位不是很好,其实单单是使用分段的话也能实现应有的功能。而分页模式就为内存提供了更加细致的划分,每个页是4KB,每个也都能准确的寻址定位到具体的字节。这样细致的划分也就很啥啥啥了。
那么首先来介绍下分页机制的原理,分页机制采用的是三级寻址,为了好理解,我们用一个比喻:
我们平时看书的时候要想看哪个具体内容,也就是哪一页,我们首先找到目录里面的哪一章,然后在找到的章中找到哪一节,然后我们再到找到的节中具体的找到哪一页。那么,这其中就用到了三个“地址”,章、节和页。
类似的,在内存分页机制也是这样的(引用老师说的话就是当计算机的东西困扰人的时候,计算机工作者就会想到实际生活,看,这个就是实际生活的例子),我们把一页内存(4KB)比喻成书的一节(注意不是一页,而是一节,可以把具体的字节(具体地址)看成是书的一页),保存这些内存页的地址的地方我们成为页表,实际是内存里面的一张表(先记住!!!),我们把保存所有页表地址的地方比喻成为章,我们成为页目录表,也就是说页目录表里面存的是很多页表的地址,页表里面存的是很多页地址(你明白了吗?:-)),实际上页目录表和页表都是内存里面的表,是实际存在内存里面的。那么现在你就会问了,页目录表是怎么寻到的?其实页目录表的首地址是在一个固定的寄存器中存存着的,硬件会自动识别:-)。那么,现在寻到4KB的页了以后是不是还是需要一个地址来寻到具体的地址,也就是定位到哪一个字节?是的:-)。现在来理清一下寻址方式:
好了,了解了分页机制的大致过程之后我们再来看点专业的东西:
首先,我们来看看保存页目录表的寄存器:
CR3控制寄存器:
还记得上一章说的CR0吗?跟这个差不多,80X86一共有五个控制寄存器:CR0~CR4,现在我们看看前四个:
前三个暂时不说,看 CR3,CR3的后20位保存的是页目录表的地址的高20位,也就是说页目录表的地址的低12位必须位0。
然后再来说说传说中的线性地址和物理地址,还有一种地址怕弄乱在此不说,线性地址说通俗点就是我们程序里面写的地址(事实上线性地址是由分段模式翻译过来的地址,具体请见:内存管理--三个地址,分页与分段的关系),物理地址就是内存里面的实际地址,保护分页模式下线性地址经过一系列翻译后翻译成物理地址,然后才可访问,那么我们在程序里面写的线性地址格式如下:
22~31位:A段
12~21位:B段
0~11位:C段
为了防止头晕,我们不使用那些专业术语,我们直接使用A、B、C段来表示,A段存的数据指示的是页目录表里面的哪一项,单位为(个),注意,不是字节!!!B段存的数据指示的是页表里面的哪一项,单位为(个),C段指示的是页内的偏移量,单位为(字节)。
值得说明的是:内存里面可以有很多页目录表,一般4GB以内,一个页目录表就够用了,一个页目录表指向很多页表,一个页表指向很多页,从上面可以看出,一个页目录表总共最多可以指向2^10=1024个页表,一个页表最多可以指向2^10=1024个页,每个页有2^12=4KB.实际上,一个页目录表里面的项有4字节,一个页表里面的项也是4个字节。所以一页内存可以存储一个页目录表或者一个页表。
我们再来看看页目录表里面的一项,我们就称为页表项,一个页表项占4个字节,格式如下:
其中 12~31位存的是页表的基地址,其他的下面介绍。
页表里面的一项称为页表项,格式如下:
其中 12~31位存的是页的基地址,其他的位同页表项一样:
如下摘自《Linux0.11源码分析》:
下面就总结看看寻址:
从上面可以知道,基地址位20位,就是说基地址后面20位为0.
延续上面的A、B、C段,我们称页目录项的物理地址部分位X1,页表项的物理地址部分为X2,那么:
页表基地址位:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
X1*8+A*4,
因为A的单位为个数,一个位4字节,所以要乘以4.
页基地址位:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
物理地址位
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
页基地址+C
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
X2*8+B*4+C
设置好这些后我们再设置一个东西,那就是CR0的pg位,pg=0时不启用分页机制,当pg=1时才启用分页机制。
设置好分页机制以后,内存地址从线性地址到物理地址的转换是由硬件负责的,我们不用管,剩下的就是软件控制内存什么的了,现在不知道该写什么了,等想到了再继续写。
下面是代码:代码说明后来加上(电脑没电了。。。。。)
org 0x7c00
SETUPSEG equ 0x9000
DATASEG&&&&&&&
equ 0x8000
ROOT_DEV db& 0
[ROOT_DEV],dl
call load_msg
ax,DATASEG
load_setup:
ax,SETUPSEG
dl,[ROOT_DEV]
jnc& ok_load_setup
jmp load_setup
ok_load_setup:
jmp SETUPSEG:0x0000
load_msg:&&&
call load_curser
ax,loadmessage
load_curser:
loadmessage&&&&&
db& "Booting diers..."
&&&&&&&&&&
510-($-$$)& db& 0
dw& 0xaa55
setup.asm:
org 0x0000
SETUPSEG equ 0x9000
DATASEG&&&&&&&
equ 0x8000
SETSEG&&&&&&&&&&
equ 0x0400
dw& 0x3000
dw& 0x0000
null_table:
dw& 0,0,0,0
system_code_table:
dw& 0x2000
dw& 0x0000
dw& 0x9a00
dw& 0x00c0
system_data_table:
dw& 0x2000
dw& 0x0000
dw& 0x9200
dw& 0x00c0
user_code_table:
dw& 0xffff
dw& 0x0000
dw& 0xfa00
dw& 0x02cf
user_data_table:
dw& 0xffff
dw& 0x0000
dw& 0xf200
dw& 0x02cf
call load_msg
load_jump:
ax,DATASEG
ax,SETUPSEG
jnc& load_set
jnc& ok_load
jmp load_set
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; hadware read here.
;; get memory size.
ax,DATASEG
;; set curser show message.
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; open A20.
call open_a20
;; no interrupts allowed.
;; mov set file to 0x0.
call move_jump
;; move gdt to 0x
call move_gdt
;; set gdt.
lgdt [gdtaddr]
;; set idt empty.
lidt [idtaddr]
;; init 8259A.
call init_8259a
;; set cr0
call set_cr0
;; jump to set program.
jmp 0x8:0x0
call load_curser
ax,loadmessage
load_curser:
in&& al,dx
move_jump:
ax,SETUPSEG
init_8259a:
out 0x20,al
call io_delay
out 0xa0,al
call io_delay
out 0x21,al
call io_delay
out 0xa1,al
call io_delay
out 0x21,al
call io_delay
out 0xa1,al
call io_delay
out 0x21,al
call io_delay
out 0xa1,al
call io_delay
out 0x21,al
call io_delay
out 0xa1,al
call io_delay
or&& eax,1
loadmessage:
db& "Setup diers..."
1024-($-$$) db& 0
and eax,0x7fffffff
al,[0x80003]
ah,[0x80004]
[0xb8000],al
[0xb8001],ah
[0x80003],al
[0x80004],ah
jmp 0x8:0x11000
512-($-$$)& db& 0
PAGEDIR&& equ 0x
PAGES equ 0x
INT_DESC_TABLE&& equ
GLOBAL_DESC_TABLE equ 0x
dw& 0x0800
dw& 0x2000
dw& 0x0000
dw& 0x3000
dw& 0x0000
set_page_dir:
ebx,PAGES+7
add ebx,eax
[PAGEDIR+esi],ebx
add eax,4096
cmp esi,4096
jz&& end_set_page_dir
end_set_page_dir:
eax,0x00008e00
set_int_table:
[INT_DESC_TABLE+esi],ebx
[INT_DESC_TABLE+esi],eax
cmp ecx,512
jz&& set_int_end
jmp set_int_table
set_int_end:
lidt [_idt]
open_pages:
or&& eax,0x
open_pages_end:
操作系统文章更正地址:
------------------------------------------------------------
各位,过了许久,本博主开通了个微信公众号,欢迎订阅。
请微信搜索公众号:wandalidb,或者扫描下方二维码:
微信所发布的内容主要是分享一些实用却不那么容易获得的干货,主要写的内容包括以下几块:
1、常用技术,大家互相学习
2、读书心得及日常影响
3、健身计划,大家相互激励
4、工作感言,大家相互勉励
5、问题及自己的分析
6、教育相关自己见解,欢迎热烈讨论
也欢迎大家来投稿(需要原创),我也可以发上去,可以在微信和博客下方留言。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。只需一步,快速开始
后使用快捷导航没有帐号?
查看: 13708|回复: 375
有史以来最详细完整的给你讲解保护模式寻址全过程,比小甲鱼还详细清晰!!!!!!
& 累计签到:16 天连续签到:0 天
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
哎,才来这个论坛几天,需要鱼币,买小甲鱼视频,在此发一些技术文章,如果觉得好,请回复。这里说一下intel系列汇编的寻址方式,大家叫做16位汇编,采用的基址*16+偏移地址,这个不用说了,很简单,自从80386之后,采用32位地址和32位数据线,为了实现兼容,此时的寻址方式也支持以前的,这种叫做实模式,。现在有保护模式了,现在我就来说一下保护模式的寻址方式,纵观,很多书籍,无论神马罗云彬,还是于渊都没有说清楚我再次说一次,哎,语文不好,希望你可以看懂,现在开始!!!!!!!
1.明白一些东西,GDT,LDT,GDTR,LDTR,TSS,IDT,TR:
首先,看指令 mov eax,ds:[bx] ;ds=0x10,bx=0x0
你肯定会说是吧ds*16+bx=0x100地址的内容放到eax寄存器,不过不全对,在实模式下面是这样,但是在保护模式就不同了,
ds=1 0000B,,请百度段选择子结构,得到索引时10B也就是2,,然后去GDT全局描述表里面找第二个描述符(从0开始计算),描述符是一个8位的结构,里面包含了段基址,我们拿这个段基址*16+bx来找内存内容给eax,描述符呢,是8位的,包含段基址,段界限,颗粒度,段的权限DPL,和类型TYPE看是代码段还是数据段,还有s属性,汗蛋疼,,记得GDT里面可以有描述LDT和内核代码和数据段的描述符,IDT是不在GDT里面的,中断描述符,TSS是104位的,其最后8位开始时描述LDT的,蛋碎,LGDT是用来加载GDT的,LLDT用来加载LDT,SGDT是保存GDT的,SLDT用来保存LDT到内存,TR指向TSS的基地址,GDTR指向GDT基地址,。LDTR用来索引在GDT中的LDT描述符,然后找到LDT基地址,然后根据段选择子来查找,TSS也就是任务表,
汗啊,蛋疼,发现说不下去了,好多好多内容,要太监了,难怪那么多书籍没有写完整的了,我这样说你们懂吗,蛋疼!,发现教东西不是件简单的事情,!!!!!!游客,如果您要查看本帖隐藏内容请
感谢楼主无私奉献!
感谢楼主无私奉献!
感谢楼主无私奉献!
本帖被以下淘专辑推荐:
& |主题: 12, 订阅: 1
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:16 天连续签到:0 天
你们还是自己百度GDT,LDT,TSS,IDT,LGDT,SGDT,LLDT,LIDT,SIDT,TSS,TR,段选择子,段描述符,中断描述符,陷阱描述符,任务描述符,调用门描述符,分页机制,百度明白之后不懂得在下面提问吧,我来一个个回答你们,蛋碎,教人如此困难!!!不知道从哪里说起
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:48 天连续签到:1 天
来看看~& &
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:16 天连续签到:0 天
哇塞碰到我的偶像甲鱼啊!!!甲鱼哥我也好喜欢海贼王啊,!!,好吧那我就耐心讲一下,是这样的一般情况下,只有一个GDT全局描述符表,里面存储着一堆的描述符,这些描述符用来描述内核的代码段,数据段,或者LDT表(在GDT里面有一种描述符专门用来描述LDT表的段基址),的内容,他们的结构图如下,下面是两个任务的切换的时候GDT还有LDT,IDT的内容图,
图片太大了,不能上传,我共享到云盘吧,大家来看看!!!!!
/s/1hqn4XUk
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:29 天连续签到:0 天
来看看,学习下
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:75 天连续签到:1 天
支持下吧。打字这么辛苦
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:92 天连续签到:1 天
学习了!!!
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:215 天连续签到:1 天
学习了!!!
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:16 天连续签到:1 天
你们还是自己百度GDT,LDT,TSS,IDT,LGDT,SGDT,LLDT,LIDT,SIDT,TSS,TR,段选择子,段描述符,中断描述符,陷阱描述符,任务描述符,调用门描述符,分页机制,百度明白之后不懂得在下面提问吧,我来一个个回答你们,蛋碎,教人如此困难!!!不知道从哪里说起
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1773 天连续签到:8 天
看看先。。谢谢
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:234 天连续签到:1 天
本帖最后由 oggplay 于
22:12 编辑
先把基本汇编指令搞清楚了,再研究操作系统。
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:775 天连续签到:1 天
史以来最详细完整的给你讲解保护模式寻址全过程
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:88 天连续签到:1 天
学习学习中~~~
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:22 天连续签到:0 天
来看看,,,看看是不是真货
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:41 天连续签到:1 天
好东西必须收藏
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:9 天连续签到:0 天
顶楼主啦..希望楼主多发精品好帖啦.....
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:79 天连续签到:1 天
看来 还是有 很多&&入门级问题 要深入啊。
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:47 天连续签到:0 天
看来 还是有 很多&&入门级问题 要深入啊。
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:137 天连续签到:1 天
努力学习!!!
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:278 天连续签到:1 天
1. 如果您的提问得到满意的***,请务必选择【最佳***】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的***;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
小甲鱼强烈推荐 /1
特效不会给你基本工资,但却能让你升职加薪
- - - - - - - - - - - -
有备无患,念念不忘
•••(
Powered by

参考资料

 

随机推荐