实现目的: 通过实验了解虚拟内存
实验内容:在proc 文件系统下,我们建立一个文件,每次向这个文件写人字符时,调用相应的虚拟内存处理函数
- /*
- mtest_dump_vma_list():打印出当前进程的各个VMA,这个功能我们简称"listvma"
- mtest_find_vma(): 找出某个虚地址所在的VMA,这个功能我们简称“findvma"
- my_follow_page( ):根据页表,求出某个虚地址所在的物理页面,这个功能我们简称"findpage"
- mtest_write_val(), 在某个地址写上具体数据,这个功能我们简称“writeval".
- */
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/proc_fs.h>
- #include <linux/string.h>
- #include <linux/vmalloc.h>
- #include <asm/uaccess.h>
- MODULE_LICENSE("GPL");
- MODULE_DESCRIPTION("Fortune Cookie Kernel Module");
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/slab.h>
- #include <linux/mm.h>
- #include <linux/vmalloc.h>
- MODULE_LICENSE("GPL");
- /*
- @如何编写代码查看自己的进程到底有哪些虚拟区?
- */
- static void mtest_dump_vma_list(void)
- {
- struct mm_struct *mm = current->mm;
- struct vm_area_struct *vma;
- printk("The current process is %s/n",current->comm);
- printk("mtest_dump_vma_list/n");
- down_read(&mm->mmap_sem);
- for (vma = mm->mmap;vma; vma = vma->vm_next) {
- printk("VMA 0x%lx-0x%lx ",
- vma->vm_start, vma->vm_end);
- if (vma->vm_flags & VM_WRITE)
- printk("WRITE ");
- if (vma->vm_flags & VM_READ)
- printk("READ ");
- if (vma->vm_flags & VM_EXEC)
- printk("EXEC ");
- printk("/n");
- }
- up_read(&mm->mmap_sem);
- }
- /*
- @如果知道某个虚地址,比如,0x8049000,
- 又如何找到这个地址所在VMA是哪个?
- */