将虚拟地址映射回物理地址

时间:2012-04-18 13:33:55

标签: c linux virtual-memory beagleboard texas-instruments

免责声明:我在Texas Instruments Forum上交叉发布此问题,但我在那里没有得到任何回复五天。我是嵌入式编程的新手,所以请指出您是否需要其他信息,或者我的方法是荒谬的。

动机

我有一个DM3730 processor from Texas Instruments的嵌入式设备(与Beagleboard -xm相同)处理器通过其显示子系统(DSS)连接到LCD显示器。显示器看起来很暗,必须进行伽玛校正。幸运的是,DSS有一个Palette / gamma查找表。不幸的是,我无法让它工作。

我发现了什么

我在德州仪器论坛上找到了similar question可比较的处理器,TI员工给出了以下解释(强调我的):

  

我认为目前的Linux内核对颜色索引图形没有任何支持,但从应用程序级别到直接注册配置相当容易。

     

[...]

     

接下来,声明一个包含256个无符号整数的数组,并用每个颜色索引条目所需的RGB值填充它。

     

将DISPC_GFX_TABLE_BA设置为先前配置的阵列的物理地址(注1,这需要物理地址而不是虚拟地址,因此您可能需要将其映射回来。注2,这需要要是一个32位对齐的地址,所以根据数组的创建方式,可能需要创建一个稍大的char数组并填充数组,使得起始位于32位边界上)

     

[...]

他后来引用mem_util转换地址,我可以用它直接从应用程序级别(用户空间)写入寄存器,但我无法弄清楚如何“映射回”虚拟地址到物理地址。

系统信息

~# uname -a
Linux dm37x-evm 2.6.32.1 #1 Fri Dec 2 11:19:53 EST 2011 armv7l unknown

我的问题

  • 如何将虚拟地址映射回物理地址?
  • 这可以在用户空间完成吗? (我设想我提供了一个用户可以调整伽马曲线的界面)
  • 这一般是正确的做法吗?我应该把它移到内核空间(我不愿意这样做,因为我没有很多Linux内核的经验)
  • 任何好的资源或例子!

2 个答案:

答案 0 :(得分:1)

有一个CMEM驱动程序,用于将物理内存映射到用户空间内存。它也可以进行虚拟到物理翻译。

所以,有了这个驱动程序,你可以:

  1. 分配对齐的缓冲区
  2. 获取用户空间地址
  3. 从程序中填写缓冲区
  4. 获取缓冲区的物理地址

答案 1 :(得分:1)

对您的问题的一个非常具体的答案是使用CMEM,其目的是从启动时预留内存中分配一块内存。

在下面的示例代码中,我通过编解码器引擎使用cmem。 ptr是您在应用程序中用于访问缓冲区的内容,而physptr是您在寄存器中编写的内容。

    ptr = Memory_contigAlloc(len, Memory_DEFAULTALIGNMENT);
    if(ptr == NULL) {
        debug_printf("Buffer allocation failed : buf size = %d\n", len);
        return -1;
    }
    physptr = (void *)Memory_getBufferPhysicalAddress(ptr, len, 0);

“正确”的方法实际上是不使用memutil并在内核中完成整个事情。