忘记密码   免费注册 查看新帖 | 论坛精华区
ChinaUnix.net
  平台论坛 博客 微博 读书 人才 精华 文库 自测 | 频道操作系统 开发 数据库 存储 服务器 网络 IT新闻 Linux 下载 Power用户组
最近访问板块 发新帖
查看: 3486 | 回复: 3

/sys/i386/include/pmap.h中与页表相关宏值的含义 [复制链接]
更多

Rank: 7Rank: 7Rank: 7

帖子
2475
主题
136
精华
14
可用积分
5601
专家积分
0
在线时间
53 小时
注册时间
2005-09-02
最后登录
2011-02-15
论坛徽章:
0
发表于 2008-08-26 20:44:25 |显示全部楼层
/sys/i386/include/pmap.h中定义的宏值:

94  /*
95   * Size of Kernel address space.  This is the number of page table pages
96   * (4MB each) to use for the kernel.  256 pages == 1 Gigabyte.
97   * This **MUST** be a multiple of 4 (eg: 252, 256, 260, etc).
98   */
99  #ifndef KVA_PAGES
100  #ifdef PAE
101  #define KVA_PAGES       512
102  #else
103  #define KVA_PAGES       256
104  #endif
105  #endif
106
107  /*
108   * Pte related macros
109   */
110  #define VADDR(pdi, pti) ((vm_offset_t)(((pdi)<<PDRSHIFT)|((pti)<<PAGE_SHIFT)))
111
112  /* Initial number of kernel page tables. */
113  #ifndef NKPT
114  #ifdef PAE
115  /* 152 page tables needed to map 16G (76B "struct vm_page", 2M page tables). */
116  #define NKPT            240
117  #else
118  /* 18 page tables needed to map 4G (72B "struct vm_page", 4M page tables). */
119  #define NKPT            30
120  #endif
121  #endif
122
123  #ifndef NKPDE
124  #ifdef SMP
125  #define NKPDE   (KVA_PAGES - 1) /* number of page tables/pde's */
126  #else
127  #define NKPDE   (KVA_PAGES)     /* number of page tables/pde's */
128  #endif
129  #endif
130
131  /*
132   * The *PTDI values control the layout of virtual memory
133   *
134   * XXX This works for now, but I am not real happy with it, I'll fix it
135   * right after I fix locore.s and the magic 28K hole
136   *
137   * SMP_PRIVPAGES: The per-cpu address space is 0xff80000 -> 0xffbfffff
138   */
139  #ifdef SMP
140  #define MPPTDI          (NPDEPTD-1)     /* per cpu ptd entry */
141  #define KPTDI           (MPPTDI-NKPDE)  /* start of kernel virtual pde's */
142  #else
143  #define KPTDI           (NPDEPTD-NKPDE)/* start of kernel virtual pde's */
144  #endif  /* SMP */
145  #define PTDPTDI         (KPTDI-NPGPTD)  /* ptd entry that points to ptd! */

KVA_PAGES是内核地址空间所占的页表页面总数,此处定义为256,因此内核地址空间的大小
    为1G字节。
VADDR是根据页表目录索引和页表索引得到对应页面的起始虚拟地址,其中pdi是页表目录索引,
    即地址在第22到31比特中的偏移,pti是页表索引,即地址在第12到21比特中的偏移。
NKPT是内核在vm系统工作之前所需的页表页面的数目。对于非PAE的i386而言,其中有18个
    页面是用来存放指向vm_page结构体的页表的。因为4G空间共有1M个页面,因此需要1M个
    vm_page结构体来组织,每个vm_page结构体的大小是72字节,一共需要72M的空间,
    即18432个页面,每个页表页面上可存储1024个页表项,因此,对应于18432个页面的页表项
    共需18个页面来存储。此处定义的30个页面中的剩余12个页面是对内核在此过程中的其它
    内存需求所需页表空间的估计量。全局变量nkpt初始化为NKPT,之后将随着内核地址空间的
    增长而递增。
NKPDE是内核所占的页表目录项的总数,对于非smp,NKPDE就是KVA_PAGES,即内核占用的页表
    页面总数,对于smp,则比KVA_PAGES少1,相当于保留了4M的空间。
MPPTDI是smp环境中用于每个cpu的页表目录项的索引,它是1024个页表目录项中的最后一个,
    表示的是地址空间中最顶端的4M空间(0xffc00000-0xffffffff),因此此处将其定义为1023。
KPTDI是第一个内核页表目录项的索引,对于smp环境,内核页表目录项的总数NKPDE是255,
    而其顶端紧邻NPPTDI,因此KPTDI就是1023减去255,即768。
PTDPTDI是指向页表目录自身所属页表页面的页表目录项的索引,页表目录的页表页面紧邻在
    第一个内核页表页面的下方,而页表目录项只占一个页表页面,因此PTDPTDI就等于768减去1,
    即767。

根据上述定义,4G虚拟地址空间的页表目录项可划分如下:0 ... 766 | 767 | 768 ... 1022 | 1023 。

/sys/i386/include/param.h中定义的宏值:

77  #define PAGE_SHIFT      12              /* LOG2(PAGE_SIZE) */
78  #define PAGE_SIZE       (1<<PAGE_SHIFT) /* bytes/page */
79  #define PAGE_MASK       (PAGE_SIZE-1)
80  #define NPTEPG          (PAGE_SIZE/(sizeof (pt_entry_t)))
81
82  #ifdef PAE
83  #define NPGPTD          4
84  #define PDRSHIFT        21              /* LOG2(NBPDR) */
85  #else
86  #define NPGPTD          1
87  #define PDRSHIFT        22              /* LOG2(NBPDR) */
88  #endif
89
90  #define NBPTD           (NPGPTD<<PAGE_SHIFT)
91  #define NPDEPTD         (NBPTD/(sizeof (pd_entry_t)))
92  #define NPDEPG          (PAGE_SIZE/(sizeof (pd_entry_t)))
93  #define NBPDR           (1<<PDRSHIFT)   /* bytes/page dir */
94  #define PDRMASK         (NBPDR-1)

PAGE_SHIFT是页表索引在32位地址中的起始比特。
PAGE_SIZE是页面尺寸,此处定义为4096字节。
PAGE_MASK是一个低12比特全1的常量。
NPTEPG是一个页面中能够存放的页表项的数目,对于非PAE的i386而言,
    一个页表项占4个字节,因此NPTEPG为1024。
NPGPTD是页表目录所占用的页面数目,对于非PAE的情况,页表目录共需
    4*(2^10)=4096字节,即1个页面。
PDRSHIFT是页表目录索引在32位地址中的起始比特。
NBPTD是页表目录所占用的字节总数,因为NPGPTD是1,所以NBPTD就是4096。
NPDEPTD是页表目录项的总数,对于非PAE的i386而言,一个页表目录项占4个字节,
    因此NPDEPTD是1024。
NPDEPG是一个页面中存放的页表目录项的总数,即1024。
NBPDR是同属一个页表目录项的字节数目,即4M。
PDRMASK是一个低22比特全1的常量。

KERNBASE是在/sys/i386/include/vmparam.h中定义的:

142  #define KERNBASE                VADDR(KPTDI, 0)

实际上就是根据第一个内核页表目录项的索引KPTDI算出其对应的虚拟地址,
计算方法为768*(2^22),即0xC0000000,即3072M,即3G。
已有 1 人评分可用积分 收起 理由
gvim + 5 感谢原创

总评分: 可用积分 + 5   查看全部评分

Rank: 8Rank: 8

帖子
7617
主题
99
精华
9
可用积分
15879
专家积分
10
在线时间
3693 小时
注册时间
2003-08-20
最后登录
2012-02-07
论坛徽章:
0
发表于 2008-08-26 21:50:34 |显示全部楼层

Rank: 7Rank: 7Rank: 7

帖子
1296
主题
247
精华
4
可用积分
7577
专家积分
10
在线时间
499 小时
注册时间
2005-07-05
最后登录
2012-01-25
论坛徽章:
0
发表于 2008-08-26 22:17:19 |显示全部楼层
哈哈,这个能看懂
欢迎访问我的博客 : 自由软件之旅

欢迎加入我的google论坛 : kde on FreeBSD

Rank: 7Rank: 7Rank: 7

帖子
2475
主题
136
精华
14
可用积分
5601
专家积分
0
在线时间
53 小时
注册时间
2005-09-02
最后登录
2011-02-15
论坛徽章:
0
发表于 2008-08-27 09:07:19 |显示全部楼层
原帖由 杜比环绕声 于 2008-8-26 22:17 发表
哈哈,这个能看懂


这个是分析locore.s的副产品,这些宏的名字起得太节约了。
您需要登录后才可以回帖 登录 | 注册

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP