Linux kernel 如何在内核中分配16K连续内存并获取物理地址?

Linux kernel 如何在内核中分配16K连续内存并获取物理地址?,linux-kernel,Linux Kernel,我的理解是内核页面大小是4K。我想为我的驱动程序分配16K连续内存作为缓冲区。我使用了kmalloc(),它返回一个指针(我假设分配成功) 这是否意味着16K是连续的 我从kmalloc()得到的地址是虚拟地址吗?如果我需要将该地址传递给硬件寄存器,我是使用虚拟地址还是物理地址?是-使用kmalloc分配的内存在物理上是连续的,地址是虚拟地址。尝试使用virt_to_phys()宏获取物理地址。但为什么virt_to_phys()的返回值与我输入的值相同(我从kmalloc获得的值)?它对我有效

我的理解是内核页面大小是4K。我想为我的驱动程序分配16K连续内存作为缓冲区。我使用了kmalloc(),它返回一个指针(我假设分配成功)

这是否意味着16K是连续的


我从kmalloc()得到的地址是虚拟地址吗?如果我需要将该地址传递给硬件寄存器,我是使用虚拟地址还是物理地址?

是-使用kmalloc分配的内存在物理上是连续的,地址是虚拟地址。尝试使用virt_to_phys()宏获取物理地址。

但为什么virt_to_phys()的返回值与我输入的值相同(我从kmalloc获得的值)?它对我有效:kmalloc()addr:0xc3c0a000,而virt_to_phys()的返回值为:0x3c0a000。我有XScale-435处理器。据我所知,在英特尔x86上,它的工作原理是一样的——只需从kmalloc()addr中减去PAGE_OFFSET(我的系统为0xc000000)值即可。