zjasan 发表于 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、段选择器的概念,不是很清楚?

zjasan 发表于 2005-4-19 18:03:17

up

john_sagitta 发表于 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个表项而已。

wanpeng81 发表于 2005-5-10 14:10:39

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

puretears 发表于 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的手册,写得很清楚。
页: [1]
查看完整版本: 看内存管理时遇到的一些问题,向大家请教!!