#FORMAT Plain /* * tyler@agat.net * * Virtual Memory Module (intended to Linux Kernel 2.6(.12)) * * This module just explains the concept and the mechanism of the Linux * virtual memory system */ #include #include #include #include #include #include unsigned long new_page ; unsigned long temp ; struct page *new_desc_page ; int init_module() { new_page = __get_free_page(GFP_KERNEL) ; new_desc_page = (struct page *)virt_to_page(new_page) ; /* * That's how the virtual memory system works. * To retrieve the virtual adress corresponding to the page, * we get the index in the page frame (new_desc_page-mem_map). * We then multiply it by the size of the page. We get the physical adress. * And in kernel mode, the differences between virtual and physical adresses * is just an offset of PAGE_OFFSET. So we add PAGE_OFFSET */ temp = (new_desc_page-mem_map)*PAGE_SIZE+PAGE_OFFSET ; printk("0x%x\n",temp) ; printk("0x%x\n",new_page) ; /* * In kernel mode, the virtual adresses has just an offset of PAGE_OFFSET * (the page tables are properly configured to do this) * On i386, the PAGE_OFFSET=0xC0000000 */ temp = __pa(new_page) ; printk("0x%x\n",new_page-PAGE_OFFSET) ; printk("0x%x\n",temp) ; return 0 ; } void cleanup_module() { free_page(new_page) ; }