用它来获取内存的物理地址是正确的?

时间:2014-06-01 18:20:50

标签: linux memory kernel-module

我需要在linux驱动程序中获取已分配的内存块的物理内存:这是一个FPGA SOC,内存将传递给SGDMA FPGA模块。

归结为对'逻辑'的混淆。 vs' virutual' 记忆: 他们的同义词是反义词吗?

我的驱动程序代码段是:

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)),但我不知道哪个是正确的。

1 个答案:

答案 0 :(得分:0)

if(1)是对的。

以下是LDD3 book第15章中关于linux内核寻址类型的引用:

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

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