[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How CPU(x86) resolve kernel address
Sanket Rathi <sanket.rathi@cdac.ernet.in> writes:
> I read all about the memory management in linux. all thing are clear to me
> like there is 3GB space for user procee and 1GB for kernel and thats why
> kernel address always greater then 0xC0000000. But one thing is not clear
> that is for kernel address there is no page table, actually there is no
> need because this is one to one mapping to physical memory but who resolve
> kernel address to actual physical address how CPU(X86) perform this task
> because when we do DMA we have to give actual physical address by
> virt_to_phys() so what is the mechanism by which CPU translate kernel
> address into physical address ( Somewhere i heard that CPU ignore some of
> the upper bits of address if so then how much bits and why).
Ouch virt_to_phys ouch! ouch! ouch! Don't do that.
At the very least use virt_to_bus. And almost certainly use
pci_alloc_consistent. On x86 the devices and the cpu happen to see
the same addresses for memory. On other architecture this just
doesn't work.
read:
Documentation/DMA-mapping.txt
Documentation/IO-mapping.txt
As for the page tables yes the kernel uses them. But because it has
a simple mapping from virtual to physical address it can do a lot of
optimizations that don't normally work. Like using 4MB pages.
Note that in the vmalloc region we use normal sized pages, and that
vmalloc actually has a smaller address space than normal kernel
memory, and there is a minor performance hit for using it, as the
normal optimization do not apply.
Eric
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/