On Jan 21, 2008 11:43 PM, Vegard Nossum <vegard.nossum@xxxxxxxxx> wrote: > Hi, > > I am experiencing something strange about pages and ptes on x86. I am > calling alloc_pages() with order = 1 (should be 2 pages). This returns > a struct page with virtual address c7800000 (returned by > page_address()). Now I call lookup_address() on the same address, and > the pte is located at c0438c78. So far, so good. But if I try to call > lookup_address() on the next page (i.e. address 7801000), this returns > a pte which is located at c7800004. How can this happen? This would > mean that the pte is inside the previous page, which is nonsense, > since it was just returned to me by the page allocator. I will follow up to say that it was my own code that changed the pte. My code was based on the (invalid) assumption that all pages have different pte_t*s. Why don't all pages have different pte_t*s? Take the following code: struct page *pga, *pgb; pga = alloc_pages(flags, 0); pgb = alloc_pages(flags, 0); printk("pte for %08x = %p\n", page_address(pga), lookup_address(page_address(pga))); printk("pte for %08x = %p\n", page_address(pgb), lookup_address(page_address(pgb))); It allocates two pages and prints out the virtual address of the page itself, then the pte_t* of that address. When run, I get this: pte for c7802000 = c0438c78 pte for c7803000 = c0438c78 So it seems that the two pages actually share a pte. How is this possible? Am I using lookup_address() wrongly? Sincerely, Vegard Nossum -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ