qqsky 发表于 2004-7-15 17:07:56

很多问题不明白,请高手解答一下吧, 感激不尽!

内核代码:2.4.19
arm补丁:patch-2.4.19-rmk6
xscale补丁:diff-2.4.19-rmk6-pxa1

打完补丁后,用gcc-2.95.3进行交叉编译,在make dep时出现如下错误:
arm-linux-gcc -D__KERNEL__ -I/var/os_src/linux-2.4.19/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -g -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -mshort-load-bytes -msoft-float -Uarm -S -o constants.h.tmp.1 getconstants.c

cc1: bad value (xscale) for -mtune= switch
cc1: bad value (xscale) for -mcpu= switch

make: *** Error 1
make: Leaving directory `/var/os_src/linux-2.4.19/arch/arm/tools'
make: *** Error 2
make: Leaving directory `/var/os_src/linux-2.4.19/arch/arm/tools'


在网上查,说是应该用gcc-3.3.2等高版本的编译器.于是用gcc-3.3.2进行编译,make dep可以通过,但在make zImage时,有出现

-blkpg.c:252: error: asm-specifier for variable `__r1' conflicts with asm clobber

这样的错误.
到底是怎么回事啊,快帮帮我呀!

还有两个问题:
1.armlinux的编译地址,就是TEXTADDR,好像都在0xc000,0000以上,
如0xc000,8000. 为什么这个TEXTADDR要设置成这样子呢?
2.因为TEXTADDR几乎都在0xc000,0000以上,从链接脚本中可以看出,stext,
__proc_info_begin, __proc_info_end, __arch_info_begin,
__arch_info_end等符号的地址都应该在0xc000,0000以上吧. 在__lookup_processor_type函数, 和 __lookup_architecture_type函数中,对__proc_info_begin, __proc_info_end, __arch_info_begin,__arch_info_end这些符号的访问, 也就是对0xc000,0000
以上的地址进行访问.   那在处理器的mmu开启以前, 这些地址并没有被映射到物理地址上啊,为什么可以对这些地址进行访问呢?

prox2004 发表于 2004-7-16 12:25:16

这个问题网上讨论很多,可以google到.
可能算gcc3.3的bug.
请看http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11103
可以换用其他版本的gcc

qqsky 发表于 2004-7-16 14:51:09

哪个版本的gcc比较合适啊!

还有后面的两个问题呢? 有没有人知道?

prox2004 发表于 2004-7-17 12:06:34

按http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11103 说,
gcc3.2可能可以.
另外,也可以试试改动blk_ioctl 的代码,
避免诸如register int res asm("r0");这样的语法.
应该可以.

chyyuu 发表于 2004-7-26 23:52:00

在 ftp://166.111.68.183/pub/embed/armlinux/xscale/xscale-gcc-3.3.3.tar.bz2
应该可以,我用它编译了linux-2.6.7 成功。
ftp://166.111.68.183/pub/embed/armlinux/xscale/lubbock/06-02-2003/bin/arm-linux-toolchain-bin-05-23-03.tgz
我用它编译过arm-linux-2.4.19-rmk7-pxa2


0xc000,8000是虚地址,对应于物理地址a0008000

这只是vmlinux的地址定位,
看看
bootloader实际上把zImage放到a0200000,然后zImage自己解压到a0008000
然后再执行实际的内核内容。
执行完make menuconfig后,
你可看看 linux-2.4.19/arch/arm/boot/vmlinux.lds
并对照 linux-2.4.19/arch/arm/vmlinux...lds

在start_kernel函数中,启动了MMU后,就访问的是cxxxxxx了。
页: [1]
查看完整版本: 很多问题不明白,请高手解答一下吧, 感激不尽!