推荐给好友 上一篇 | 下一篇

/sys/i386/include/pmap.h中与页表相关宏值的含义

/sys/i386/include/pmap.h中定义的值:
*wIJaO1B%GpD,K3b1BSD爱好者乐园4Kn.JI t!LKJ^;Y
94  /*
2\*VI t$aT}195   * Size of Kernel address space.  This is the number of page table pagesBSD爱好者乐园;d;@o*HF(|j7t
96   * (4MB each) to use for the kernel.  256 pages == 1 Gigabyte.BSD爱好者乐园Rkzm^ C5T
97   * This **MUST** be a multiple of 4 (eg: 252, 256, 260, etc).BSD爱好者乐园 y.L:gKmI ?,I
98   */
^@lriX+{199  #ifndef KVA_PAGES
(ld%i/p"E qs[1100  #ifdef PAE
ykac3wy u*G1101  #define KVA_PAGES       512
*j:L U6Bf1102  #else
B3J$]&roG~ L.z#W1103  #define KVA_PAGES       256BSD爱好者乐园z)x'k5R4WmP
104  #endifBSD爱好者乐园4ikG {aLB7C
105  #endif
9P*J#R2n WLN1106
J WP D!]&R\2qy1107  /*
!mRL#hhq1108   * Pte related macrosBSD爱好者乐园m1H8q-J0y"G%W\l
109   */
t&s9@ gf9E?1110  #define VADDR(pdi, pti) ((vm_offset_t)(((pdi)<<PDRSHIFT)|((pti)<<PAGE_SHIFT)))BSD爱好者乐园#k*|-Sr2~r Q
111
.Y?A i-I1112  /* Initial number of kernel page tables. */
p8NwX)z1113  #ifndef NKPT
`*[ [ b{1114  #ifdef PAEBSD爱好者乐园B `P1WNC
115  /* 152 page tables needed to map 16G (76B "struct vm_page", 2M page tables). */
1f{F3N~2dV0w'_ Y.L1116  #define NKPT            240
t0T0Qb^$PJz#a1117  #else
`)C%l \5_ gmb1118  /* 18 page tables needed to map 4G (72B "struct vm_page", 4M page tables). */
6t&C]x\$D:Tt6[5?D1119  #define NKPT            30
5a)?dQhi1120  #endif
Pn?Z9_+zI1121  #endif
5V7X5U l0~v5W+L:W1122
c)~#n YA-B1123  #ifndef NKPDE
J;iJwt2Q8sI1124  #ifdef SMPBSD爱好者乐园&r%m(g2Q.^|3{du#E
125  #define NKPDE   (KVA_PAGES - 1) /* number of page tables/pde's */
N v8Q U+F-DcT1126  #else
#PcxZsFz!t9I1127  #define NKPDE   (KVA_PAGES)     /* number of page tables/pde's */BSD爱好者乐园!T ^#^2\D,lm%@7g
128  #endifBSD爱好者乐园I g;eS6k"\8G8U
129  #endifBSD爱好者乐园2fF8X@8t
130
/?!K8P#L%g6aru,|u1131  /*
:y5^.X.iz%f@~1132   * The *PTDI values control the layout of virtual memory
vF_a3A.H-^V,S,AW1133   *
G%D"T#oqs Yp1134   * XXX This works for now, but I am not real happy with it, I'll fix itBSD爱好者乐园[hdFw |
135   * right after I fix locore.s and the magic 28K holeBSD爱好者乐园z#vS!EJg
136   *BSD爱好者乐园2|[,N a `V2cb
137   * SMP_PRIVPAGES: The per-cpu address space is 0xff80000 -> 0xffbfffffBSD爱好者乐园 AO z Plj W
138   */
swN ]L4sV B5~ TM1139  #ifdef SMPBSD爱好者乐园 KB6@n r
140  #define MPPTDI          (NPDEPTD-1)     /* per cpu ptd entry */BSD爱好者乐园n9q"Y9R P
141  #define KPTDI           (MPPTDI-NKPDE)  /* start of kernel virtual pde's */BSD爱好者乐园}.z} iS_@-T d
142  #else
-_j X7}kAo1143  #define KPTDI           (NPDEPTD-NKPDE)/* start of kernel virtual pde's */
9\`#xP ^u'gB|1144  #endif  /* SMP */BSD爱好者乐园~mv&@p3D E{
145  #define PTDPTDI         (KPTDI-NPGPTD)  /* ptd entry that points to ptd! */
ZL-e.f;gC0bP1
ta1r.[m2B}&M'z1KVA_PAGES是内核地址空间所占的页表页面总数,此处定义为256,因此内核地址空间的大小BSD爱好者乐园"XJ;K}I0HJ
    为1G字节。BSD爱好者乐园4_9k5c&Zf+y*YF
VADDR是根据页表目录索引和页表索引得到对应页面的起始虚拟地址,其中pdi是页表目录索引,BSD爱好者乐园gVM^h6z)Ae
    即地址在第22到31比特中的偏移,pti是页表索引,即地址在第12到21比特中的偏移。BSD爱好者乐园|!c1CU5dv3X
NKPT是内核在vm系统工作之前所需的页表页面的数目。对于非PAE的i386而言,其中有18个
c(Si3x CF/Wr1    页面是用来存放指向vm_page结构体的页表的。因为4G空间共有1M个页面,因此需要1M个BSD爱好者乐园_^T6rF
    vm_page结构体来组织,每个vm_page结构体的大小是72字节,一共需要72M的空间,
hS'Mx!F+ui1    即18432个页面,每个页表页面上可存储1024个页表项,因此,对应于18432个页面的页表项BSD爱好者乐园GO6tq|i3F
    共需18个页面来存储。此处定义的30个页面中的剩余12个页面是对内核在此过程中的其它
X-e%t!f*Ou!Es2A1    内存需求所需页表空间的估计量。全局变量nkpt初始化为NKPT,之后将随着内核地址空间的
5RO)ryNQ1    增长而递增。
{#|6S KW)w'N1NKPDE是内核所占的页表目录项的总数,对于非smp,NKPDE就是KVA_PAGES,即内核占用的页表
$Tt7B1J} r_A1    页面总数,对于smp,则比KVA_PAGES少1,相当于保留了4M的空间。BSD爱好者乐园:d_1evA6U~.qs7C:N
MPPTDI是smp环境中用于每个cpu的页表目录项的索引,它是1024个页表目录项中的最后一个,
i.G5y;~/Fq1    表示的是地址空间中最顶端的4M空间(0xffc00000-0xffffffff),因此此处将其定义为1023。
:UL~ruH8@4I9~fE2@1KPTDI是第一个内核页表目录项的索引,对于smp环境,内核页表目录项的总数NKPDE是255,BSD爱好者乐园A~4iE%p7V3vs[.v
    而其顶端紧邻NPPTDI,因此KPTDI就是1023减去255,即768。
u3rXK0e?d V1PTDPTDI是指向页表目录自身所属页表页面的页表目录项的索引,页表目录的页表页面紧邻在BSD爱好者乐园|7s?"]X3Rv|8Q
    第一个内核页表页面的下方,而页表目录项只占一个页表页面,因此PTDPTDI就等于768减去1,
E#N.A N8ke1    即767。BSD爱好者乐园sY0L:_*e%A

.R] r`.d6s1|~'Mt1根据上述定义,4G虚拟地址空间的页表目录项可划分如下:0 ... 766 | 767 | 768 ... 1022 | 1023 。
ZY/WOF1
T?Ce5j+{ Me1/sys/i386/include/param.h中定义的宏值:BSD爱好者乐园H2XJQ1I,C R7o
BSD爱好者乐园%Cf:^(P`Ua
77  #define PAGE_SHIFT      12              /* LOG2(PAGE_SIZE) */
7q)_;c?(Sx178  #define PAGE_SIZE       (1<<PAGE_SHIFT) /* bytes/page */BSD爱好者乐园5^KB%Y!t'W cV
79  #define PAGE_MASK       (PAGE_SIZE-1)
0P#O%[Pw(y5S`180  #define NPTEPG          (PAGE_SIZE/(sizeof (pt_entry_t)))BSD爱好者乐园9z;a&g,K#]*}1}
81
a]4ck @_h182  #ifdef PAEBSD爱好者乐园8Q1tQ9y7D"f
83  #define NPGPTD          4
Rt*V }I/iZ184  #define PDRSHIFT        21              /* LOG2(NBPDR) */
v!u qwY$V185  #elseBSD爱好者乐园AK.N7`SE n-o-^:N
86  #define NPGPTD          1BSD爱好者乐园*b%L a1U#LA
87  #define PDRSHIFT        22              /* LOG2(NBPDR) */BSD爱好者乐园#z1BR1E w\Q^
88  #endifBSD爱好者乐园7T~Z't+SJ
89
Zp%}#PMB;f190  #define NBPTD           (NPGPTD<<PAGE_SHIFT)
%M7_&e2H]3o4l4{I191  #define NPDEPTD         (NBPTD/(sizeof (pd_entry_t)))
.bYIqWdy1sM8XB192  #define NPDEPG          (PAGE_SIZE/(sizeof (pd_entry_t)))BSD爱好者乐园9P(oVx]]^ X{
93  #define NBPDR           (1<<PDRSHIFT)   /* bytes/page dir */BSD爱好者乐园Q&?$e-Y `'t!T
94  #define PDRMASK         (NBPDR-1)
*vf#@tz(qN/k l1BSD爱好者乐园hRB+sv$}1w
PAGE_SHIFT是页表索引在32位地址中的起始比特。
,wA MUXK `8b:NE4J2G1PAGE_SIZE是页面尺寸,此处定义为4096字节。BSD爱好者乐园 M!gc/q M_Q
PAGE_MASK是一个低12比特全1的常量。BSD爱好者乐园 FP0Kb#q:^?
NPTEPG是一个页面中能够存放的页表项的数目,对于非PAE的i386而言,
G:K5VDx y Gw$\1    一个页表项占4个字节,因此NPTEPG为1024。BSD爱好者乐园X5N|~a#w7\_(o
NPGPTD是页表目录所占用的页面数目,对于非PAE的情况,页表目录共需
qx B zbi~,T1    4*(2^10)=4096字节,即1个页面。
R!] ])|#XO [+a0I1PDRSHIFT是页表目录索引在32位地址中的起始比特。BSD爱好者乐园 wC-C6HiU*\"v
NBPTD是页表目录所占用的字节总数,因为NPGPTD是1,所以NBPTD就是4096。
x5_P(JTtR1NPDEPTD是页表目录项的总数,对于非PAE的i386而言,一个页表目录项占4个字节,BSD爱好者乐园"n8L~9y A8r
    因此NPDEPTD是1024。BSD爱好者乐园 Pvd[f!~9qFt
NPDEPG是一个页面中存放的页表目录项的总数,即1024。BSD爱好者乐园 l*u ^e)MMViB
NBPDR是同属一个页表目录项的字节数目,即4M。
6t7L!k v7c2V-q1PDRMASK是一个低22比特全1的常量。BSD爱好者乐园9Y1A H2u@2H

1v[Y*IEh rX1KERNBASE是在/sys/i386/include/vmparam.h中定义的:BSD爱好者乐园l1_*[d'@i{R
BSD爱好者乐园*wn@f*Hm:M4D
142  #define KERNBASE                VADDR(KPTDI, 0)
hsu%B UL#b3b-^1
Q)E ro;g8Q1实际上就是根据第一个内核页表目录项的索引KPTDI算出其对应的虚拟地址,
@_ou{1计算方法为768*(2^22),即0xC0000000,即3072M,即3G。

[重要提醒]对本篇资料有疑问,请到论坛讨论,尽量使文章准确无误>>>
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: 源代码
 

评分:0

我来说两句

seccode