URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 5 » 如何修改编译器跳过lwl等四条非对齐指令?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
如何修改编译器跳过lwl等四条非对齐指令?
 
 
 
 
 
 
 
Subject: 如何修改编译器跳过lwl等四条非对齐指令?
Author: jrjdr    Posted: 2006-02-13 20:06    Length: 467 byte(s)
[Original] [Print] [Top]
我在一个类似于龙芯的芯片上做linux系统的移植,正好这款cpu也没有实现这四条专利指令,原本是通过指令保留异常解决的,可是在mount根文件系统的时候报错,没办法,只好修改memcpy,memset,copy_from_user,copy_to_user这四个函数,因为这四个函数用到非对齐指令的频率最高,然后根文件系统是mount上了,可以在执行busybox的init程序的时候老是要出一个越界处理异常,这个异常的epc正好指向我修改过的memcpy函数,找了很长时间没有找到原因,只好请教懂GCC和GAS的朋友,怎么修改编译器才能不出这四条指令
[Original] [Print] [Top]
Subject: Re: 如何修改编译器跳过lwl等四条非对齐指令?
Author: shy828301    Posted: 2006-02-14 10:53    Length: 156 byte(s)
[Original] [Print] [Top]
修改编译器很简单,只要找到产生这四条指令的代码,删掉就可以了。如果是汇编代码写的只有一点一点的改了,而且mips/linux里用到非对齐指令的地方还有,不止这几个函数
[Original] [Print] [Top]
Subject: Re: 如何修改编译器跳过lwl等四条非对齐指令?
Author: jrjdr    Posted: 2006-02-14 13:51    Length: 1,069 byte(s)
[Original] [Print] [Top]
是不是通过修改gas可以完全避免产生这四条非对齐指令,因为memcpy,memset,copy_from_user,copy_to_user这四个函数都是引用了arch/mips/lib/memcpy.S这个文件,这个文件就是用汇编语言写的,里边用到了lwl/lwr/swl/swr这四条指令。

其他函数虽然也用到了这四条指令,但通过做成保留指令异常的方法基本上我还没碰到过问题,就是效率低了。

我就是因为在出busybox的init程序的时候老是出现一个越界处理异常,这个异常epc返回地址就是我修改过的memcpy函数,所以我一直想找一个能够一次性解决这个问题的方法,使代码中不再出现这四条指令。

还有一个问题就是当把这四条指令做成异常处理,我不能保证如果这四条指令是在延迟槽里边的话,我的epc返回地址是正确的,在做异常的时候,我就是简单的把epc的地址加4,指向下一条指令,所以发生地址跳转这一类的错误是不可避免的(难道可以通过读cp0的cause寄存器的第31BD来判断是否是在延迟槽中,如果在,就将epc-4,如果不在延迟槽,就epc+4,我初步是这么想的,不知道对不对)。

还有我想知道如果修改gas的话,是不是只需要把生成这几条指令的代码注释掉,还是需要做修改,通过其他指令去代替。

谢谢你的回复
[Original] [Print] [Top]
Subject: Re: 如何修改编译器跳过lwl等四条非对齐指令?
Author: shy828301    Posted: 2006-02-14 15:28    Length: 56 byte(s)
[Original] [Print] [Top]
用其他指令代替非对齐指令,可以用移位指令与对齐指令的组合
[Original] [Print] [Top]
Subject: Re: 如何修改编译器跳过lwl等四条非对齐指令?
Author: jrjdr    Posted: 2006-02-15 20:52    Length: 75 byte(s)
[Original] [Print] [Top]
但是我并不清楚如何修改gas,请问具体怎么修改呢,这方面我完全不懂,谢谢指点!
[Original] [Print] [Top]
Subject: Re: 如何修改编译器跳过lwl等四条非对齐指令?
Author: shy828301    Posted: 2006-02-16 09:32    Length: 80 byte(s)
[Original] [Print] [Top]
不需要修改gas的,把kernel源码里的非对齐指令替换,修改gcc不产生非对齐指令就可以了
[Original] [Print] [Top]
Subject: Re: 如何修改编译器跳过lwl等四条非对齐指令?
Author: jrjdr    Posted: 2006-02-17 10:38    Length: 1,880 byte(s)
[Original] [Print] [Top]
我以前尝试改过gcc,是按照这篇文档的方法
http://gcc.gnu.org/ml/gcc-patches/2005-05/msg01249.html

两个问题:
1.可能他修改的gcc太老,mips_block_move_straight这个函数我只在3.1之前的版本看到过,3.1以后的版本我就没有查到这个函数,所以不知道怎么改,才能使每次move的bits个数为一个字节8,我本来是使用2.96的版本,但是这个版本编译glibc和uclibc有问题,所以直接使用了buildroot做了一个3.4版本的工具链,不知道在这个版本之后,gcc/config/mips/mips.c这个文件中哪个地方是定义block_move的字节数。

2.也是由于版本原因,在gcc/config/mips/mips.md这个文件中,需要注掉的那几句生成四条非对齐指令的语句我找不到,主要是这些要被注掉的语句在后续版本中的对应语句我都找不到

关于在linux中直接修改memcpy.S这个文件,本人水平有限,有一个宏定义一直不能看明白,我对gcc的汇编一直不感冒

这里有一个宏定义:

#define EXC(inst_reg,addr,handler)
9: inst_reg, addr
.section __ex_table,"a"
PTR 9b, handler;
.previous

然后在后面是用四条非对齐指令的时候都是调用了这个宏定义

#define LOADL lwl
#define LOADR lwr
#define STOREL swl
#define LOADL swr

#define LDFTRST LOADR
#define LDREST LOADL
#define STFTRST STORER
#define STREST STOREL

......................

比如这一句:

#define FIRST(unit) ((unit)*NBYTES)

EXC( LDFIRST t3, FIRST(0)(src), l_exc);

展开之后就不明白是什么意思了

有高人可以指点一下吗,谢谢
[Original] [Print] [Top]
« Previous thread
求<<编译原理与实践>>的影印版pdf文件
CPU 与 编译器
5
Next thread »
请教:关于汇编器的问题~~~
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:18, cost 0.051874876022339 ms.