|
|
|
Re: Viewing page tables and some other questions regarding the MMU | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
|
|
On Thu, Apr 1, 2010 at 9:03 AM, Leo Barnes <barnes.leo@xxxxxxxxx> 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.
_______________________________________________
linux-arm mailing list
linux-arm@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/linux-arm
[Linux ARM] [Linux ARM MSM] [Linux ARM Kernel] [Fedora ARM] [IETF Annouce] [Security] [Bugtraq] [Linux] [Linux OMAP] [Linux MIPS] [ECOS] [Asterisk Internet PBX] [Linux API]
![]() |
![]() |