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

将虚拟地址映射回物理地址,第1张

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

免责声明:我在德州仪器论坛上交叉发表这个问题,但是我没有得到任何答复五天。 我对embedded式编程相当陌生,所以请指出,如果您需要更多的信息,或者我的方法是无意义的。

动机

我有一个带有德州仪器公司的DM3730处理器的embedded式设备(您可以在Beagleboard-xm上find相同的结果)处理器通过显示子系统(DSS)连接到LCD显示器。 显示器看起来很暗,必须进行伽马校正。 幸运的是,DSS有一个Palette / gamma查找表。 不幸的是,我无法得到它的工作。

我发现了什么

如何阅读Java中的蓝牙低功耗RSSI不androID

在poky版本中运行自定义bitbake时发生do_install错误

RNdis小工具无法启动

我在德州仪器(TI)论坛上find了一个类似的问题,提出了一个类似的处理器,TI员工给出了下面的解释(重点是我的):

我不认为目前的linux内核支持彩色索引graphics,但通过直接寄存器configuration从应用程序级别启用相当容易。

[…]

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

将disPC_GFX_table_BA设置为之前configuration的arrays的物理地址(注1, 这需要物理地址而不是虚拟地址,因此您可能需要将其映射回注意2,这需要是一个32位alignment的地址,如何创build数组可能需要创build一个稍大的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内核的经验)

任何好的资源或例子!

你的问题的一个非常具体的答案是使用cmeM,其目的是从引导时间保留的内存分配连续的内存块。

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

ptr = Memory_contigalloc(len,Memory_DEFAulTAlignmENT); if(ptr == NulL) { deBUG_printf("Buffer allocation Failed : buf size = %dn",len); return -1; } physptr = (voID *)Memory_getBufferPhysicalAddress(ptr,len,0);

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

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

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

分配对齐的缓冲区

获取用户空间地址

从程序中填充缓冲区

获取缓冲区的物理地址

总结

以上是内存溢出为你收集整理的将虚拟地址映射回物理地址全部内容,希望文章能够帮你解决将虚拟地址映射回物理地址所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1272616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存