gpt4 book ai didi

linux - 使用物理地址获取内存的哪种实现是正确的?

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:08 25 4
gpt4 key购买 nike

我需要在 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?
instance->read_buffer[i].virtual = (void *)m;
instance->read_buffer[i].physical = virt_to_phys((void *)m);
} else { // seems like the correct option as no casts are required
instance->read_buffer[i].physical = m
instance->read_buffer[i].virtual = phys_to_virt(m);
}

结构体的定义是:

struct my_structure { 
...
unsigned long physical;
void * virtual;
...
};

两者都会毫无怨言地编译(将 if (0) 更改为 if (1)),但我不知道哪个是正确的。

最佳答案

if(1) 是正确的。

这里引用了 LDD3 book 第 15 章中有关 Linux 内核寻址类型的内容。 :

内核逻辑地址这些构成了内核的正常地址空间。这些地址映射主存储器的某些部分(可能是全部),并且通常被视为物理地址。在大多数体系结构中,逻辑地址及其关联的物理地址仅存在恒定的偏移量。 ... 从 kmalloc 返回的内存有一个内核逻辑地址。

内核虚拟地址内核虚拟地址与逻辑地址类似,它们是从内核空间地址到物理地址的映射。然而,内核虚拟地址不一定具有到表征逻辑地址空间的物理地址的线性、一对一映射。 所有逻辑地址都是内核虚拟地址,但许多内核虚拟地址不是逻辑地址

关于linux - 使用物理地址获取内存的哪种实现是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com