- 论坛徽章:
- 0
|
本帖最后由 accessory 于 2010-02-03 04:18 编辑
LS说得对,PGD里得内容是物理地址,不能直接打印的。LZ代码里的另外一个错误是下面这句:
unsigned long *pgd = (unsigned long*)(current->mm->pgd);
这里current->mm->pgd 是一个pgd_t 类型,在X86-32下是这样定义的:
typedef struct { unsigned long pgd; } pgd_t;
所以不能直接转换成unsigned long
下面是我写的一段小代码。它用了另外一个思路。就是给定内核段的地址,把这个地址对应的pgd index, pgd 项的内容打印出来。代码如下:- pgd_t *pgdp = (current->mm->pgd);
- unsigned long addr = 0xc0000000, tmp, *pp;
- printk( KERN_DEBUG "pgd=0x%lx\n", pgdp->pgd);
- for(tmp=addr;tmp<0xc1000000;tmp+=0x400000){
- printk( KERN_DEBUG "pgd_index(0x%lx)=%d\n", tmp, pgd_index(tmp) );
- pp = pgd_offset_k(tmp);
- printk("conten of pdg is 0x%lx\n", *pp);
- }
复制代码 得到的结果如下:
Feb 2 15:01:48 localhost kernel: [ 5735.958715] pgd=0x3128067
Feb 2 15:01:48 localhost kernel: [ 5735.958762] pgd_index(0xc0000000)=768
Feb 2 15:01:48 localhost kernel: [ 5735.958794] conten of pdg is 0x1e3
Feb 2 15:01:48 localhost kernel: [ 5735.958832] pgd_index(0xc0400000)=769
Feb 2 15:01:48 localhost kernel: [ 5735.958856] conten of pdg is 0x4001e3
Feb 2 15:01:48 localhost kernel: [ 5735.958881] pgd_index(0xc0800000)=770
Feb 2 15:01:48 localhost kernel: [ 5735.958904] conten of pdg is 0x8001e3
Feb 2 15:01:48 localhost kernel: [ 5735.958930] pgd_index(0xc0c00000)=771
Feb 2 15:01:48 localhost kernel: [ 5735.958953] conten of pdg is 0xc001e3
经过多次INSMOD, RMMOD实验,发现第一个pgd输出会变。后面的全都不变。证实了所有进程的内核段都是一样的。
以上的测试环境:QEMU VM, CENTOS 5.3 LINUX 2.6.18 X86-32.
LZ可以参考上面的思路把后面的PTE也打印出来。
另外,可以参考下面这个帖子的第九楼:
http://linux.chinaunix.net/bbs/viewthread.php?tid=1124661 |
|