Viewing page tables and some other questions regarding the MMU
Christoffer Dall
cd2436 at columbia.edu
Thu Apr 1 03:45:26 EDT 2010
On Thu, Apr 1, 2010 at 9:03 AM, Leo Barnes <barnes.leo at gmail.com> wrote:
>> The MMU does not have to be disabled. To manage the page tables, the
>> tables themselves must be mapped at some virtual address. In ARM
>> Linux, this is already done, and you can access the page table entry
>> for addr by doing something like this:
>>
>> pgd_t *pgd;
>> pud_t *pud;
>> pmd_t *pmd;
>> pte_t *pte;
>>
>> pgd = pgd_offset(mm, addr);
>> pud = pud_alloc(mm, pgd, addr);
>> if (!pud) {
>> printk(KERN_ERR "Could not alloc pud!\n");
>> return NULL;
>> }
>> pmd = pmd_alloc(mm, pud, addr);
>> if (!pmd) {
>> printk(KERN_ERR "Could not alloc pmd!\n");
>> return NULL;
>> }
>>
>> pte = pte_alloc_map(mm, pmd, addr);
>> if (!pte) {
>> printk(KERN_ERR "Could not alloc pte!\n");
>> return NULL;
>> }
>>
>
> Thanks, this looks useful. Which headers does this code rely on? I
> assume linux/mm.h, but anything else?
Try grepping for definitions or use cscope or ctags and you'll quickly
find out which files you need when you try to compile.
> Is the mm argument for the
> functions used a global variable or something I have to create (and if
> so, how to create it? the mm_struct is pretty damn large and filled
> with fields that I know very little about)?
For the current process you can do current->mm. There's a pointer from
each task_struct to that thread's mm_struct.
I recommend you look at a book like Understanding the Linux Kernel or
similar for these general kernel coding questions and I don't think
they're relevant for an ARM-linux mailing list.
More information about the linux-arm
mailing list