免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3009 | 回复: 7
打印 上一主题 下一主题

[内核入门] CORTEX-A9 模式切换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-26 19:47 |只看该作者 |倒序浏览
本帖最后由 garyv 于 2014-06-26 19:50 编辑

最近自己在Freescale的i.MX6Q(ARM cortex-a9)四核开发板上做了一个很小的kernel,kernel运行于PL1,app运行于PL0,现在希望从kernel切换到app,需要进行PL1至PL0的切换,但是下述代码切换一直出错,未知原因:

  1. void switch_to_app(u32 app_id)
  2. {
  3.     __asm volatile
  4.     (
  5.         "ldr r0, %0\n\t"
  6.         "msr spsr_c, %1\n\t"
  7.         "mov r1, #0\n\t"
  8.         "movs pc, r1"
  9.         : : "m"(app_id), "i"(0x10) : "r0", "r1"
  10.     );
  11. }
复制代码
执行到"movs pc, r1"时,产生 data abort 异常。

内核地址范围: 0xC0000000 ~ 0xC0FFFFFF

用户空间地址范围:0x00000000 ~ 0x000FFFFF

都是虚拟地址。



app的入口代码如下,起始于虚拟地址0:
  1.     .section .text

  2. _start:
  3.     @ startup by kernel
  4.     b _next

  5.     @ size info in byte
  6.     .word 0x55aa
  7.     .word 0x1100

  8. _next:
  9.     ldr r1, =__stack_top @ __stack_top is 0xFE000 specified in link script.
  10.     mov sp, r1

  11.     push {r1} @ app stack bottom
  12.     push {r0} @ app id
  13.     mov r3, r0
  14.     ...
复制代码



出错时的调试信息:

##DABORT EXCEPTION##CPU0
LR 0x00000000
AIFSR 0x00000000
ADFSR 0x00000000
IFAR 0xAC589A80
IFSR 0x00000000
DFAR 0xC0000000
DFSR 0x0000000F

LR是调整之后的LR,也就是说0地址就是产生data abort的地址。

希望本版里面的高手能提供linux kernel里面PL1 --> PL0 切换的关键代码供参考。


论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
2 [报告]
发表于 2014-06-26 20:25 |只看该作者
0地址映射了吗

你在kernel里读写一下0地址看看能不能成功呢

论坛徽章:
0
3 [报告]
发表于 2014-06-27 01:46 |只看该作者
回复 2# arm-linux-gcc


   映射是没有问题的,在调用switch_to_app()之前,读取 *(u32 *)0, *(u32 *)0x0004,读出来的值均正确,而且可读,所以执行应该是没有问题的。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2014-06-27 12:37 |只看该作者
1, 一般切换EL的都是用异常返回的指令(eret之类的)
2, 还需要确保你跳转的目标地址是否有可执行权限

论坛徽章:
0
5 [报告]
发表于 2014-06-27 19:26 |只看该作者
回复 4# amarant


    楼上说的EL是64bit armv8里面提出的新概念吧,cortex-a9没有这种说法,有PL0、PL1、PL2。

    话说回来,我在1楼写的切换方式是没有问题的,因为IRQ返回时也是做一样的事情:CPSR = SPSR_irq && PC = LR_irq。这个问题已经卡了好多天了,一直无法突破。。。

论坛徽章:
0
6 [报告]
发表于 2014-06-27 19:27 |只看该作者
回复 2# arm-linux-gcc


    armv7手册里面讲了,只要有可读属性,就具备可执行属性,属性配置方面是不存在问题的。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
7 [报告]
发表于 2014-06-27 20:20 |只看该作者
eret是armv7里新增的指令,效果和movs一样
armv8里则没有movs了,只能用eret

armv7页表里有XN(也叫做UXN)和PXN位,分别表示PL0和PL1是否可以执行这段代码,为0表示可执行,为1表示不可执行

论坛徽章:
0
8 [报告]
发表于 2014-06-27 21:39 |只看该作者
回复 7# arm-linux-gcc


    确认pxn bit == 0。

    群里有没有人用过Freescale imx6系列处理器的?我发现一个更奇怪的问题:

    同样的代码在双核i.MX6D上面跑,一切正常!这个问题只出现在四核i.MX6Q上面!它们是一个系列的啊,pin-to-pin,软件完全兼容的!

    我已经联系freescale的FAE了,还没得到回复,估计会石沉大海。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP