智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 15916|回复: 4
打印 上一主题 下一主题

SH4在特权模式下的访问

[复制链接]

489

主题

1691

帖子

1

精华

管理员

网站创始人&站长

Rank: 11Rank: 11Rank: 11Rank: 11

积分
85856

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
56934
贡献
17352
兑换币
13128
注册时间
2007-6-8
在线时间
5785 小时
跳转到指定楼层
1#
发表于 2009-9-18 16:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作者:快乐水牛

SH4/SH4A有两个处理器模式:用户模式(User Mode)和特权模式(Privileged Mode)。SH4一般运行在用户模式下,当一个异常或中断发生时,CPU就跳到特权模式里。
之前我们谈了SH4的MMU(内存管理单元),知道CPU在用户模式下只能访问U0区(H'00000000 ~ H'80000000),如果访问U0之外的其他地址,则发生地址错误。如图所示:



SH4的所有片上外设寄存器位于高端地址0XFF000000地址以上,比如看门狗计数寄存器在特权模式下的地址是0xFFC00008,如果要操作看门狗,是不能直接访问0XFFC00008这个地址的,只能进入特权模式去访问它。

从用户模式进入特权模式,最好的方式是使用软中断指令TRAPA,比如执行TRAPA #32之后,系统会跳到向量号为32的中断处理程序里,这样就进入了特权模式,类似于linux的系统调用。

SuperH编译器提供了一个软中断函数trapa_svc(),该函数为可变参数,如下:
int trapa_svc(int trap_no, int index, type1 para1, type2 para2, type2 para3, type4 para4);
描述:系统调用
when trapa_svc is executed,  index is specified in R0,
...and para1 to para4 in R4 to R7, respectively.
...Then, TRAPA #trap_no is executed.

比如执行trapa_svc(32, 3, 0x11, 0x22)时,参数3放到寄存器R0,之后的2个参数0x11,0x22依次放到R4,R5里,然后执行TRAPA #32指令。
因此,我们模仿linux系统调用机制,设置一个函数指针数组,存放特权模式下要执行的函数。CPU在用户模式下执行trapa_svc后进入特权模式,在中断子程序里根据trapa_svc传入的参数,查找数组,找到对应的函数地址,再执行该函数。函数执行完毕,中断返回时,CPU又切回到用户模式。

; system_call为软中断处理程序
_system_call:
MOVML.L R14,@-R15
MOV.L #sys_call_table, R10         ; get the address of the function table                  
SHLL2 R0                           ; index = index * 4
ADD R0,R10                         ; element address = sys_call_table + index * 4
MOV.L @R10,R10                     ; get the address of the corresponding function in table
JSR @R10                           ; call the corresponding routine
NOP

MOVML.L @R15+,R14
RTE                                ;中断返回,切换到用户模式
NOP
   
; 函数指针数组,4字节对齐

.section D,DATA,ALIGN=4
sys_call_table:
.DATA.L  _sys_fun0                 ; index 0
.DATA.L  _sys_fun1                 ; index 1
.DATA.L  _sys_fun2                 ; index 2
.DATA.L  _sys_fun3                 ; index 3
.DATA.L  _sys_fun4                 ; index 4
.DATA.L  _sys_fun5                 ; index 5
.DATA.L  _sys_fun6                 ; index 6


后记:
SH4在用户模式下对2G~4G的空间进行保护,这样可以防止应用程序破坏该区域的内容。
一般来说,内核和驱动的代码位于3G~4G的空间,在用户模式下访问内核和驱动,只能通过软中断进入到特权模式才能执行内核或驱动程序。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

0

主题

356

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5251
威望
2761
贡献
1652
兑换币
1908
注册时间
2013-10-28
在线时间
419 小时
毕业学校
电大
2#
发表于 2015-9-7 00:57:36 | 只看该作者
:):):):):):)
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
56
威望
30
贡献
18
兑换币
17
注册时间
2017-4-5
在线时间
4 小时
毕业学校
武汉科技大学
3#
发表于 2017-4-5 08:14:07 | 只看该作者
大家好!       我是新手,我有个问题想请教下。我的是SH4核心的SH7355,我想直接修改0x80000000和0xA0000000后面地址的内容,请问我该怎么写代码呢?如果是汇编,我要怎么在main函数里调用呢?谢谢!比如:修改0x8000FF00~0x8000FF07地址字符串为:“abcdefgh”,能帮我写出具体的代码吗?万分感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 00:41 , Processed in 0.404985 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表