在不使用virt_to_phys宏的情况下从模块中的已分配buf获取物理地址

时间:2015-07-21 03:06:47

标签: android memory-management linux-kernel arm

我正在尝试编写一个android arm内核模块,其中我需要使用_kmalloc分配的内存var的virt_to_phys转换。 我知道我可以使用宏virt_to_physc来完成这项任务。但是,我没有专门的完整内核源代码,因为virt_to_physc是一个宏 我无法获得一个函数地址读取kallsyms在我的模块中使用,所以我想找到另一种方法来完成这项任务。 我一直在尝试使用MMU(寄存器ATS1Cxx和PAR)来执行V => P,因为Iam在ARMv7进程中工作,但我无法使其工作。

这是我的测试代码......

int hello_init_module(void) {

    printk("Virtual MEM:0x%X \n", allocated_buf);
    //Trying to get the physc mem
    asm("\t mcr p15, 0, %[value], c7, c8, 2\n"
        "\t isb\n"
        \t mrc p15, 0, %[result], c7, c4, 0\n" : [result]"=r" (pa) : [value]"r" (allocated_buf));

    printk("Physical using MMU : %x\n", pa );

    //This show the right address, but I wanna do it without calling the macro.
    printk("Physical using virt_2_physc: 0x%X",virt_to_phys((int *) allocated_buf);)

}

我实际在做的是开发一个模块,该模块适用于具有相同3.4.10内核但内存结构不同的两个设备, 我可以使模块工作,因为它们具有相同的VER_MAGIC和函数crc,因此模块在两个设备中都能完美加载。 主要问题是,由于它们的结构存在差异,PAGE_OFFSET和PHYS_OFFSET实际上都会发生变化。 所以,我想知道是否有一种方法可以进行翻译而无需在我的模块中将此值定义为常量。这就是我尝试使用MMU执行V => P,但MMU在我的情况下没有工作,它总是返回0x1F的。 根据cat / proc / cpuinfo。我正在使用

Processor   : ARMv7 Processor rev 0 (v7l)
processor   : 0
Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls 
CPU implementer : 0x51
CPU architecture: 7

如果使用MMU作为使用virt_to_phys的替代方法无法做到这一点。 有人知道其他方法吗?

0 个答案:

没有答案