- 论坛徽章:
- 11
|
回复 5# nswcfd
感谢楼上,cr3与current->mm->pgd确实是一致的,进程context 切换后,current->mm->pgd相当于二级指针,自身是一个地址,另指向页全局目录PGD的地址- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/mm.h>
- #include <linux/mm_types.h>
- #include <asm/pgtable.h>
- #include <linux/vmalloc.h>
- #include <linux/sched.h>
- static int __init show_pgd(void)
- {
- unsigned long cr3, vaddr, pgd_entry_index;
- pgd_t *pgdir, *pgd_entry;
- vaddr = (unsigned long)vmalloc(1000 * sizeof(char));
- if (vaddr == 0) {
- printk("vmalloc failed..\n");
- return -1;
- }
- printk("vmalloc_vaddr=0x%lx\n", vaddr);
- cr3 = read_cr3();
- pgdir = current->mm->pgd;
- pgd_entry = pgd_offset(current->mm, vaddr);
- pgd_entry_index = pgd_index(vaddr);
- printk("cr3 = 0x%lx\n", cr3);
- printk("virtual pgd = %p\n", pgdir);
- printk("physical pgd = 0x%lx\n", __pa(pgdir));
- printk("pgd_entry = 0x%lx\n", pgd_val(*pgd_entry));
- printk("pgd_entry_index = %ld\n", pgd_entry_index);
- vfree((void*)vaddr);
- return 0;
- }
- static void __exit finish(void)
- {
- printk("The module is exit\n");
- }
- module_init(show_pgd);
- module_exit(finish);
- MODULE_LICENSE("GPL");
复制代码 运行结果为- vmalloc_vaddr=0xffffc90009c2d000
- cr3 = 0x38be9000
- virtual pgd = ffff880038be9000
- physical pgd = 0x38be9000
- pgd_entry = 0x3fad8067
- pgd_entry_index = 402
复制代码 另请教一下
怎样在kernel module中自行处理page fault,也就是pte不存在时手动分配页帧? |
|