我需要在linux驱动程序中获得分配内存块的物理内存:这是一个FPGA SOC,内存被传递给SGDMA FPGA模块。
这可以归结为对“逻辑”和“虚拟”记忆的混淆:--它们是同义词还是反义?--
因此,我的驱动程序代码片段是:
unsigned long m = __get_free_pages(GFP_USER, order); // returns 'logical' address
if (m) {
instance->read_buffer[i].order = order;
if(1) { // should this be 0?
因此,我理解当cpu查找一个虚拟地址时,它会查看TLB,然后查看页面表,以获得物理地址( pa ),但是我有点困惑它如何处理这个pa。
它是否只是检查每个级别的内存地址,直到它被击中?例如:在缓存l1上检查pa,如果错过则在l2检查pa,如果错过则在l3检查pa,如果错过则在RAM中检查pa,如果丢失则从磁盘读取。我尝试过搜索这个和搜索堆栈溢出,但是我找不到对这个过程的任何全面或清晰的解释。
我被问到上述问题操作系统的viva和我的答案逻辑地址小于物理地址,因为:逻辑地址-is对于应用程序-starts可见的地址从0开始并且在整个应用程序的大小中是连续的-has Max size等于应用程序物理地址的长度-是通过将基址寄存器内容添加到逻辑地址来获得的,这给出了虚拟地址,然后使用页表来获得真正的物理地址-具有等于物理存储器长度的最大长度
我被告知答案是错误的,因为虚拟地址空间的大小大于物理地址空间的大小。