QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1288|回复: 4

看内存管理时遇到的一些问题,向大家请教!!

[复制链接]
发表于 2005-4-18 22:59:40 | 显示全部楼层 |阅读模式
1、swapper_pg_dir(内核页目录表)中的每个项(或是所指向的项)有多大?为什么?
        swapper_pg_dir的前768项指向线形地址的0-3GB空间。那么得到上面的答案是4MB,不知道为什么会有这么大?
2、线形地址空间的0-3GB是不是每个任务都有,还是所有的人物共享这3gb空间?
3、门描述符中,是不是每个中断向量都有一个门描述符,并且存放再IDTR里面?
4、LDTR,GDTR这个寄存器在具体寻址的时候好像没有涉及到,不知道在寻址时在什么时候参与?
5、4GB的线形地址空间怎么来得,为什么不是4Gbit呢?
6、段选择器的概念,不是很清楚?
 楼主| 发表于 2005-4-19 18:03:17 | 显示全部楼层
up
回复

使用道具 举报

发表于 2005-4-20 08:46:00 | 显示全部楼层
i386的我不太熟,我看过PowerPC的swapper_pg_dir是定义在head.S中的一个4096 Bytes的空间啊,每一项是一个u32的指针么,指向二级PMD表,哪里有那么大?而且swapper_pg_dir是内核页表啊,只映射内核地址空间的,比如你的内存是16M,那么映射到KERNELBASE(0xc0000000一般),每个PAGE是4k,虚拟地址的msb 10bit用来索引一级页表也就是swapper_pg_dir了,那么一共有4K页,用到了swapper_pg_dir中的4个表项而已。
回复

使用道具 举报

发表于 2005-5-10 14:10:39 | 显示全部楼层
我的理解:
每个任务都有自己的0-3G虚存空间,但是用不了那么多,所以很多目录项都是空的。
LDTR和GDTR在LINUX实现的时候,耍了个小小的把戏,只是为了应付X86的段映射的设计,实际上,可以把虚存地址看成线性地址。
4G的设计大概是这样的,32位的线性地址,最大的寻址空间是2的32次方,就是4G。至于中间的目录号、页号、偏移量是多少位,都改变不了最大的寻址空间。为什么不用BIT,而使用BYTE呢?因为寻址的基本单位是BYTE,如果寻址的基本单位是BIT,那么可以寻到的存贮容量就很小了。BYTE也是操作系统处理数据的基本单位。这个大概跟计算机发展的历史有关。猜的。
回复

使用道具 举报

发表于 2005-5-10 22:02:09 | 显示全部楼层
哈,建议楼主好好看看IA32保护模式的教程,都是些基本概念
1. 当使用32位物理地址的时候,swapper_pg_dir中的每一项可以映射的地址空间范围
是4MB。原因如下:一个页目录项可以1024个页表项,而一个页表项可以映射4KB的地址
空间,所以一个页目录项可以映射的范围是1024*4KB = 4MB。但是当使用36位物理地
址的时候,一个页目录项只能映射2MB的地址空间。

2. 在2.6内核中,使用了Copy-On-Write技术,所以,父子进程之间如果是只读的关系就
会共享地址空间,但是一旦子进程向自己的地址空间写东西,内核就会为其生成
一个新的页面,另外3GB~4GB的地址空间是被所有的进程共享的。

3. 这个问题是这样的:在保护模式下,中断门是系统响应中断的唯一方式,如果你不提供
中断门,系统无法找到对应的处理过程。所有的中断门形成了一个中断门描述符表,之后
IDTR中存放的是指向中断门描述附表的segment selector

4.  Linux内核本身并没有使用LDTR这是为了执行某些windows程序而设立的。而GDTR
可是时时刻刻都在使用的。整个4GB地址空间都是通过GDTR指向的全局描述附表指定的。

5. 32位的地址空间,可以提供的地址范围是2^32(2的32次方)
2^10 = 1KB
2^30 = 1GB
(2^30)^2 = 4GB
就这么简单

6. Segment selector这个东西的作用有二,一个是在保护模式中进行段访问的时候提供
指向段描述符的指针,另一方面进行访问控制,这个你可以看看Intel的手册,写得很清楚。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 12:01 , Processed in 0.090074 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表