Viewing page tables and some other questions regarding the MMU

Christoffer Dall cd2436 at
Thu Apr 1 03:45:26 EDT 2010

On Thu, Apr 1, 2010 at 9:03 AM, Leo Barnes <barnes.leo at> 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