32linux单片机,基于MIPS32平台的Linux操作系统移植

reserved instruction exception,然后根据例外的种类跳转到相应的例外处理程序入口处。借助于编写对应的例外处理程序,可以为未被实际指令集实现但又属于标准指令集的指令(以1wl、1wr、swl、swr为例)提供逻辑等效的替换方法。在Linux内核源(以2.4.26版本为例)代码的目录树下进入.\arch\mips\kernal目录,打开traps.c文件,并添加simulate_lxRI函数,代码如下:

95bd777911b0ac1e5dffd0d3e8a9230c.png

其中:_OP_为宏操作,可取出32位机器码中的操作码以判断操作类型;Ox22对应于1wl指令、0x26对应于1wr指令,0x2A对应于swl指令,而0x2E则对应于swr指令。程序将根据不同的操作码进入不同的替代程序。va和byte变量则计算出4条非对齐指令的偏移量。

完成代码后将此函数添加到同一文件的do_ri函数中去,此函数即负责处理Linux操作系统的保留指令例外。添加的代码为:

47a030276b14566192783a660d3e5fea.png

即当simulate——lxRI正确处理完非对齐存取指令并返回1后,系统将通过compute_returrn_epc函数把epc寄存器的值放回pc寄存器并返回;否则,继续处理do_ri中其他的例外处理程序。

这一方法工作量小,容易保证修改后的等效性,对大多数熟悉C语肓的程序员来说都是易于掌握的。在软硬件协同开发的系统设计前期具有很大的实际使用价值。系统设计师可快速建立原型机跑通操作系统,以验证软硬件的正确性。但由于其采用的是例外处理的方式,若频繁发生例外则将影响系统性能,所以对memcpy(此函数代码在Linux源代码的arch\mips\lib目录下的memcpy.s文件中)这样使用频繁的汇编程序应手工修改其代码。再加上编译器一般不会生成4条非对齐指令(仅当C程序中的结构体有非字对齐等少数情况下会出现),所以此修改方法可保证能大致接近原性能。

c2c9ed493cd281aa86d8a6f5178c4c01.gif [1] [2] [3] 610626052e95c7fbe3d254abc769d9ad.gif

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值