主题 : 4412的3.5内核是不是有内存指针保护限制?我的驱动无法正常工作。 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 11651
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
贡献值: 0 点
综合积分: 76 分
注册时间: 2009-12-15
最后登录: 2015-11-23
楼主  发表于: 2014-10-16 09:27

 4412的3.5内核是不是有内存指针保护限制?我的驱动无法正常工作。

我在做4412的硬件图像旋转驱动时,发现3.5内核存在内存保护现象。在6410上正常运行的操作和程序,4412上报指针错误,无法操作内存。包括:
a. shell命令中的dd指令,只要和显存一挂钩,马上报错。
   按6410的用法用命令: #dd if=/dev/fb0 of=fbfile 可以将fb中的内容保存下来; 但在4412中一运行该指令,就马上报错:
Unable to handle kernel paging request at virtual address f0049000
[   39.885000] pgd = ec7c8000
[   39.885000] [f0049000] *pgd=6d02a811, *pte=00000000, *ppte=00000000
[   39.885000] Internal error: Oops: 7 [#1] PREEMPT SMP ARM
[   39.885000] Modules linked in: libertas_sdio(O) libertas(O) zd1211rw(O) rt2800usb(O) rt2800lib(O) rt73usb(O) rt2x00usb(O) rt2x00lib(O) ath9k_htc(O) mac80211(O) ath9k_common(O) ath9k_hw(O) ath(O) cfg80211(O) compat(O) rtl8192cu(O) snd_soc_tiny4412_wm8960 snd_soc_wm8960
[   39.885000] CPU: 0    Tainted: G           O  (3.5.0-FriendlyARM #2)
[   39.885000] PC is at memcpy+0x48/0x330
[   39.885000] LR is at fb_read+0x14c/0x1b0
[   39.885000] pc : [<c02544e8>]    lr : [<c0273d0c>]    psr: 20000013
[   39.885000] sp : ec769f1c  ip : 00000000  fp : ec443e00
[   39.885000] r10: 00000000  r9 : ec768000  r8 : 00000200
[   39.885000] r7 : f0049000  r6 : 000bc008  r5 : ec769f80  r4 : 00000200
[   39.885000] r3 : ec769f38  r2 : 00000180  r1 : f0049000  r0 : ec443e00
[   39.885000] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[   39.885000] Control: 10c5387d  Table: 6c7c804a  DAC: 00000015
.......
[   40.740000] ---[ end trace a0a1060a9c00bc6c ]---
Segmentation fault

    同样写回屏幕的命令: #dd if=fbfile of=/dev/fb0; 也报相同错误

b. 4412的旋转寄存器的基地址0x12810000,ioremap后,对其赋值无任何反应,赋任意值后再读出均为0.
   request_mem_region(0x12810000,0x100,"rotator_base_out");   //包括测试了request_region()函数。
   rotator_base = ioremap(0x12810000, 0x100);
   writeb(0x55,rotator_base );
   tmp=readb(rotator_base);
按道理  tmp应该为0x55,但读出始终为0.
   而用4412的lcd寄存器基地址0x11c00000,代替0x12810000后,是可以读可以写。可以看到4412对液晶的配置。能正常赋值读取。

c. 对任意物理内存地址,ioremap后,读取立即报指针错误。
   4412为1G内存,它的物理地址从0xA000_0000-----0xE000_0000;
   根据它的lcd寄存器,它的显存物理地址为0xC000_0000;
   按照上面步骤(b)的操作对0xA000_0000-----0xE000_0000的任意地址,ioremap,只要一调用readb()或readl()马上就报指针错误:
Unhandled fault: imprecise external abort (0x406) at 0xf5000000
Internal error: : 406 [#1] PREEMPT SMP ARM
下面将详细贴出
//---------------------------------------------------------------------
d. 逐层跟踪writel和readl函数,后将writel和readl函数直接简化为对内存指针的操作。例如将readl函数直接简化为:
tmp=(uint32_t )(* (uint32_t *)rotator_base );
writel简化为:
*(uint32_t *)rotator_base =0x1425;
效果一模一样,说明问题的症结不在读写函数。

以上程序或指令在6410上均能正常操作。在4412的3.5内核中应该有对内存有很强的保护,应该如何解决这个问题呢?


ps,曾经考虑过trustzone的问题,而后我使用了2014年3月份以前的没有trustzone的友善内核,情况一样。
        我又比对6410和4412的menuconfig,没找到有明显的内存保护选项。

正在研究mmu,但目前没有思路。请各位帮帮忙,谢谢。




级别: 侠客
UID: 25875
精华: 0
发帖: 80
金钱: 402 两
威望: 80 点
贡献值: 0 点
综合积分: 160 分
注册时间: 2010-07-30
最后登录: 2020-07-04
1楼  发表于: 2017-02-15 12:38
此帖售价 1 金钱,已有 0 人购买
若发现会员采用欺骗的方法获取财富,请立刻举报,我们会对会员处以2-N倍的罚金,严重者封掉ID!
描述:如何关闭INO分配方式
附件: INO.png (19 K) 下载次数:5 售价:1金钱