From: kernelnewbies-bounce@xxxxxxxxxxxx [mailto:kernelnewbies-bounce@xxxxxxxxxxxx]On Behalf Of P.F. Tsai >I have problems about converting virtual address into physical address and >reverse. I supply a kernel function to grab cr3 value, but how do I READ >the content from the address located by cr3 to load the GDT and access the >entry in it ? CR3 register holds the physical address of current process's PGD. It is the GDTR register which holds the address of GDT. >static unsigned long v2p(unsigned long va) >{ > pgd_t *pgd; >pmd_t *pmd; > pte_t *ptep, pte; > struct page *page; >unsigned long pa; >pgd = pgd_offset(tsk->mm, va); /* what is tsk->mm */ >pmd = pmd_offset(pgd,va); >pte = pte_offset(pte,va); >pte = *ptep; >page = pte_page(pte); /* aha, we have the pa of the page */ >pa = (pte_val(*ptep) & PTE_PHYS_MASK) | (va&(PAGE_SIZE-1); >return pa; >} The above function traverses the Page Directory and Page Table to get the physical address, but I do not know how safe it will be if you supply a non existant address to it. Linux kernel provides you with functions like virt_to_phys and friends to convert a kernel mode virtual address to physical address and vice versa. For your case, may be after you get the physical address of GDT from GDTR, you can use 'ioremap' to get the mapped kernel mode virtual address and access GDTR entries with it. Do note that the code you are writing is extremely prone to corrupt the system (if you alter the GDT values). I am assuming that you are doing this for getting a better understanding of the system. -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/