免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4499 | 回复: 5
打印 上一主题 下一主题

[FreeBSD] 关于i386下的内存映射,为什么FreeBSD没有高端内存(Linux high memory)的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-27 23:59 |只看该作者 |倒序浏览
今天跟哥们说起Linux的高端内存(high memory)的问题,我解释为什么FreeBSD在i386下没有这个问题,一时没有想清楚,也不记得哪里有文档了,就在这里解释一下吧
首先看接口,关于映射,抽象出了三个数组,在sys/i386/include/pmap.h

  1. extern pt_entry_t PTmap[];
  2. extern pd_entry_t PTD[];
  3. extern pd_entry_t PTDpde[];
复制代码

pt_entry_t 简单的说就是 page table entry, pd_entry_t 就是page directory entry
PTmap的含义是一个数组,这个数组中包含了映射任意虚拟地址的page table entry.
PTD的含义是一个数组,它包含了映射任意虚拟地址的page directory entry
PTDpde的含义是

看两个物理地址与虚拟地址转换的宏,同一个文件

  1. #define vtopte(va)      (PTmap + i386_btop(va))
  2. #define vtophys(va)     pmap_kextract((vm_offset_t)(va))

  3. static __inline vm_paddr_t
  4. pmap_kextract(vm_offset_t va)
  5. {
  6.         vm_paddr_t pa;

  7.         /*
  8.          * 首先找到映射这个虚拟地址的page directory 看看是否起用了PSE(超级页, 4M大小的页)
  9.          */

  10.         if ((pa = PTD[va >> PDRSHIFT]) & PG_PS) {
  11.                 pa = (pa & PG_PS_FRAME) | (va & PDRMASK);
  12.         } else {
  13.                 /*
  14.                  * 没有启用PSE那么找到映射这个虚拟地址的page table entry读出其内容,就是映射
  15.                  * 这个虚拟地址的物理地址
  16.                  */
  17.                 pa = *vtopte(va);
  18.                 pa = (pa & PG_FRAME) | (va & PAGE_MASK);
  19.         }
  20.         return pa;
  21. }

复制代码

i386_btop 就是 byte to page把字节数转换为页数。

现在我们看这些数组的实现, i386/i386/locore.s

  1.          .globl  PTmap,PTD,PTDpde
  2.          .set    PTmap,(PTDPTDI << PDRSHIFT)
  3.          .set    PTD,PTmap + (PTDPTDI * PAGE_SIZE)
  4.          .set    PTDpde,PTD + (PTDPTDI * PDESIZE)

  5. /* ....................................  */
  6. /*
  7. * fillkpt
  8. *      eax = page frame address
  9. *      ebx = index into page table
  10. *      ecx = how many pages to map
  11. *      base = base address of page dir/table
  12. *      prot = protection bits
  13. */

  14. /* install a pde recursively mapping page directory as a page table */
  15.         movl    R(IdlePTD), %eax
  16.         movl    $PTDPTDI, %ebx
  17.         movl    $NPGPTD,%ecx
  18.         fillkpt(R(IdlePTD), $PG_RW)
复制代码

set 就是给一些符号赋值,跟define的感觉差不多,具体可以看info as

PTDPTDI 一个小于1024的正整数,可以忽略具体数值, PDRSHIFT是page directory shift 就是22

我们看一下这个页表的结构,假设这个页表的物理地址是A,那么
0  1  2...PTDPTDI.......
[-][-][-]...[A]............[-]
‘-‘是我们不关心的内容

OK,事实只有这些,剩下的是我们的理解了 这里每个page table entry的大小是4,每个page directory entry的大小是4

先看看vtopte是怎么回事, 根据上面的一系列的set,我们知道PTmap事实上是 (PTDPTDI << 22),

假设va的最高十位得值是v1, 第二个十位的值是v2,最后的12位对寻找pte没有影响,我们忽略,那么实际的page directory
entry是在第v1项(假设内容是B),实际的page table entry是在B所指向的page table的v2项, 也就是说实际page table
entry的物理地址是 (B & PAGEMASK) + v2 * 4

i386_btop(va)  = va >> 12
PTmap + i386_btop(va) = (void*)(PTmap + (va >> 12) * x) = (void*)((PTDPTDI << 22) + (va >> 12) * 4)
现在这个地址的结构, 最高十位是PTDPTDI,第二个十位是v1,最后的12位是v2 * 4
处理器要访问这个地址,那么首先要通过mmu找到其物理地址,怎么转换呢,首先用这个地址的高10位在页表找page directory entry
而这个高十位就是PTDPTDI,而在PTDPTDI这个位置找到page directory entry指向了A(也就是页表自身)然后用第二个十位也就是v1
检索page table entry,这时候得到的值是B然后处理器知道这个虚拟地址最终所对应的物理地址是 (B & PAGEMASK) + v2 * 4

PTD是同样的道理,我就不啰嗦了。

评分

参与人数 1可用积分 +5 收起 理由
gvim + 5 好文

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2007-10-28 02:44 |只看该作者
我也想知道为何freebsd没有 highmem这个说法.

但是lz说了半天似乎只是讲了页表建立和物理地址虚拟地址翻译,究竟为何不存在highmem并没有说清楚啊.

是因为freebsd内核有独立的页表么? linux里似乎内核借用了用户进程的页表

论坛徽章:
0
3 [报告]
发表于 2007-10-28 02:51 |只看该作者
freebsd 没有考虑 PAE 下么

论坛徽章:
0
4 [报告]
发表于 2007-10-28 09:42 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2007-10-28 11:55 |只看该作者
原帖由 lllaaa 于 2007-10-28 02:44 发表
我也想知道为何freebsd没有 highmem这个说法.

但是lz说了半天似乎只是讲了页表建立和物理地址虚拟地址翻译,究竟为何不存在highmem并没有说清楚啊.

是因为freebsd内核有独立的页表么? linux里似乎内核借用 ...

对,我说得不够到位,补充一下。

Linux 需要highmem的原因是因为需要把物理内存直接映射到内核空间,而内核空间只有1G。把物理内存直接映射到内核空间的原因是为了进行虚拟地址与物理地址之间转换时方便,在Linux中我们能找到一个地址转换的宏, include/asm-i386/page.h

  1. #define __pa(x)                 ((unsigned long)(x)-PAGE_OFFSET)
  2. #define __va(x)                 ((void *)((unsigned long)(x)+PAGE_OFFSET))
复制代码

FreeBSD不需要用这种方式来进行地址转换,所以不需要直接映射物理内存到内核空间,所以没有highmem的问题。

论坛徽章:
0
6 [报告]
发表于 2007-10-29 10:29 |只看该作者
已收藏,有时间慢慢看^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP