首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

了解linux内存映射的!展示你能力的机会来了,请听一道100分的有关问题!

2013-07-09 
了解linux内存映射的大虾!展示你能力的机会来了,请听一道100分的问题!!!嘿嘿,其实是小弟在在开发过程中遇

了解linux内存映射的大虾!展示你能力的机会来了,请听一道100分的问题!!!
嘿嘿,其实是小弟在在开发过程中遇到关于内存映射的问题,不知道怎么解决。还请大神帮忙!!

    arm9 + linux 环境,板子RAM大小为256M, 目前有个需求是将内存从后面去掉2M,让系统跑在254M内存上,最后的2M由一个内核ko模块去操作,存放一些打印LOG,设备重启后log不丢失(设备异常重启,RAM不掉电)。

    目前已经成功预留出了2M内存,这2M空间不受内核管理,即系统以为RAM大小只有254M, 但是要在一个自己写的内核ko模块中去操作这2M内存。小弟试过直接由物理地址转换虚拟地址(函数phys_to_virt)然后去访问,但是一访问就会产生缺页异常。
听别人说是因为 这2M内存没有被内核映射,故不能正常访问。那么就要我去手动进行映射。但是具体该怎么去映射呢? 

还请大侠指点一二,小弟将感激不尽!!!了解linux内存映射的!展示你能力的机会来了,请听一道100分的有关问题! Linux 内核 内存管理 arm
[解决办法]
IOMAP文件中加这几句
这是个例子,具体地址,自己改吧。
#define _BASE          IOMEM(0xFC900000)
#define _PHYS          0xFE000
#define _SIZE          SZ_2M
[解决办法]
保留内存在kernel传递ATAG参数时可以少传入这部分内存,这部分内存还不是被保存了,只是没用告诉kernel这部分内存,kernel中需要使用时ioremap是一种方法(比较简单),但是更好的方式是ion,
[解决办法]
其实网上有篇文章写的是静态映射。具体的网页地址我忘记了。但是确实有这么一片文章,描写的内容和我们现在讨论的问题相关。
静态映射 iotable init
动态映射 ioremap
其实这个量个函数调用的方法不一样,但是目的都是一样的。就是建立以个虚拟到phy的对应关系。
2.再问一句,如果我把这2M当做设备寄存器一样,用ioremap的方式去映射成IO内存去访问,是否合理?
这个可以的。只是:1 调用到ioremap的这个函数你可能自己要写意个module。2 调用的参数和使用的方法有区别,我熟悉所以推荐了静态映射的方法,这个方法当时用过,用在VIDEO的还是什么的一个buffer缓存上。

其实kernel中还有的板子的bsp中有很多类似的用法,学习和借鉴一下别人的用法对自己很有帮助。说实话,我也是经常忘记自己做过什么。

热点排行