整理下这几天遇到的问题,郁闷
现在遇到的问题是,再开发板上跑OpenSPARC,只有OpenSPARC项目提供的SunOS 5.11和Ubuntu7.10两个ramdisk。 而再qemu上的虚拟机,我只成功的装上了Debian9.0,还有一个也是OpenSPARC项目给出的SunOS 5.10的一个虚拟机镜像。
Debian9.0还是很新的,64位系统。
问题是,我在OpenSPARC的代码里改了ALU的部分,但没效果。能确认ALU改动生效了,因为如果改的太过分,系统就跑不起来了。
后来发现,板上能跑的这两个操作系统,并不是64位的。而我的改动都是按64位寄存器改的,虽然后来发现了这个问题,按低32 位也做了点改动,但还是不行。每次做一点改动就要编译sparc,还要生成bitstream,最后启动进系统,全部加起来估计要2,3个 小时了,实在是蒙不出原因了。
所以就需要一个系统能在QEMU上跑,看看情况。完全靠逆login,libpam,libc也不是很现实。
这两个操作ramdisak一共87MB,所以里面带的程序非常少。 有的有ldd,有的有file这两个程序,没有gcc,gdb。
首先说网络不能用,找了根网线,配了静态IP和网关什么的,还是连不上网。 就没再在这上面较劲了,后来通过mount ramdisk,可以把里面的程序拿出来,可以把新程序加进去了。
发现login和libc都是32位的,以为系统是32位sparc。 uname和isainfo可以给出提示,SPARC32PLUS,也就是64位sparc v9系统上跑32位操作系统。
手册上说这种兼容模式global和output寄存器还可以用64位,只有local和input寄存器是32位的。 这个事,在后面调试的时候,发现系统里是有用到64位寄存器的时候,大部分时间还是32位。我也 没搞清楚什么时候用64。从libc的strcmp的代码里看,比较字符串的时候读内存用的是o2,o3寄存器,并且步进是+8。 但后来调试的时候还是看到寄存器只用到了32位。这里不知道什么情况。
这两个系统,发现操作系统都是64位的。特别是ubuntu7.10,里面还有/lib64目录,里面是64bit的lib。
后来我打算把64bit的init和login以及各种lib都装进去,最后的结果是init说kernel too old。 所以就想把vmlinuz,initrd-img都换掉,换上debian9.0的。结果,debian9.0内核太大,ramdisk里的SILO只分配8MB内存给内核。 也没找到可以调这个大小的参数。
后来就是想装qemu虚拟机去调这个问题。结果ubuntu7.10装不上,debootstrap什么的问题,要在安装包里替换这个,搞了一晚上也没搞明白。 光盘重新打包后就不能boot了,而且这个debootstrap deb包也找不到sparc版了。
又想到装ubuntu7.04 ubuntu6.06,也都又问题boot kernel那卡住了。
虚拟机的硬盘是着改成logical_block_size和physical_block_size都512字节,也不行。
-device ide-hd,bus=ide.0,drive=mydisk,logical_block_size=512,physical_block_size=512
这时候就很郁闷了。。。
突然又想起有个SunOS 5.10的虚拟机,结果这个里面程序更多点,也是32bit的。 这个可以调。
这时候发现在输入用户名的时候,字符串是4个字节一组进到寄存器里去的,只用了寄存器的low 32bits。
对比用户名会对比好多次,这和debian9.0上的情况是一致的。
估计是因为这个系统很老,大概05年出的,还有很多次比较是一个字节一个字节比较的。
这几次操作自然都没有处理,所以在login的时候会有问题。
并且这个系统的shadow还不是用$1$这种。