by falcon <[email protected]>
2008-01-13
如果想从事loongson的软件开发,却没有开发板,那么可以通过其虚拟机gxemul(for loongson)来emulate。不过目前可以获得的支持loongson的最新gxemul是0.4.3,并且仅仅支持loongson 2e,另外网络支持也不够好。下面我们逐步介绍如何在x86平台下的ubuntu系统上通过gxemul来模拟一个loongson的基本软件开发环境。
1、介绍
Loongson[1]作为国产的通用cpu,采用mips架构,是中国科学院计算所研发,由意法半导体公司制造的高性能、低功耗的处理器芯片。loongson一直在不断的发展中,从最初的一代到现在的二代,以及正在研制的三代,目前市场上的产品主要基于2e和2f序列。
而福龙迷你PC则是由中科龙梦公司采用loongson处理器制造的一款个人电脑,精致、小巧。
福龙迷你PC采用嵌入式系统常用的PMON作为其BIOS和Boot Loader,采用Debian作为其操作系统。
为了能够模拟一个loongson的基本开发环境,我们需要一个处理器以及基本外设的整套模拟器,qemu作为一款非常流行的开放源代码模拟器,支持mips架构,但是由于loongson有很多扩展的指令qemu不支持,其他的诸多mips模拟器也有类似的问题,所以我们这里介绍另外一款经过移植的,能够基本模拟loongson 2e的模拟器: GXemul[2]。
有了模拟器,我们就需要通过它来加载BIOS和BootLoader,并通过BootLoader来引导linux操作系统。由于福龙迷你PC等基于loongson的产品都采用PMON[3]作为其BIOS&BootLoader,所以我们也需要了解如何编译PMON,并在GXemul中加载它。
加载好PMON之后,就可以利用它来引导一个Debian[4]操作系统。这里将介绍如何引导一个现有的Debian操作系统和如何通过GXemul安装一个全新的Debian操作系统。
之后,我们介绍如何在安装好的Debian操作系统中安装基本的软件开发工具,并介绍一个汇编语言开发的实例。
2、使用GXemul
目前支持loongson2e的最新可用的版本是GXemul 0.4.3,可以从http://www.lemote.com/upfiles/下载到。
安装完以后,可以下载一个编译好的PMON.bin以及一个包含Debian基本文件系统的硬盘映像文件。
通过GXemul启动PMON.bin,通过PMON引导Debian系统。
$ gxemul -Xe bonito 0xbfc00000:/path/to/pmon.bin -d /path/to/hda |
启动以后会先进入PMON的命令行,我们需要手动加载内核,并执行。
// 从虚拟硬盘镜像文件中加载linux内核 PMON> load /dev/fs/ext2@wd0/boot/vmlinux // 给内核传递一个启动参数root,告知文件系统所在分区,并通过g命令引导linux PMON> g root=/dev/hda1 |
过一段时间就可以看到熟悉的linux登录提示,键入root就行,没有密码。
实际上,我们也可以直接通过GXemul引导那个Debian文件系统,而不用PMON.bin的引导,操作如下:
$ gxemul-0.4.3/gxemul -Xe bonito -d /path/to/hda -o "root=/dev/hda1" /path/to/vmlinux |
现在说明一下参数的作用:X指定要使用X11,e指定机器类型,这里的bonito是loongson2e的类型,-d指定加载某个文件作为磁盘映像,-o是指定一些传递给后面的可执行文件的参数,直接跟上的vmlinux则是一个可以在Gxemul上运行的二进制文件,前面的参数是传递给它的。
另外一个说明:在Intel(R) Core(TM)2 Duo CPU机器上使用gxemul 0.4.2 for loongson 2e无法正常工作,建议大家直接使用上面的0.4.3。
3、编译PMON
上面之所以要介绍通过PMON.bin来加载和引导Debian系统,是因为这样的话我们可以研究一下PMON。如果仅仅想通过Gxemul来学习loongson2e的汇编,你直接通过GXemul来启动那个Debian系统就行了。
下面介绍如何编译PMON。
下载PMON的源代码,如果没有svn,记得先把subversion安装上,如果没有git,也记得安装一下:
下载并安装mips交叉工具链(好老好老,呵呵,gcc才2.x,不过跟上面的代码配套,如果用最新的toolchain[6],反而没有办法编译上面的PMON)。
设置环境变量,把下面两行添加到/etc/profile中,并通过执行"source /etc/profile"生效。
export MKDEP=makedepend export PATH=/usr/local/comp/mips-elf/gcc-2.95.3/bin/:$PATH |
编译一下PMONCFG,这个工具用来分析配置文件,以便进行不同的编译动作,如果不安装会无法编译PMON。
$ cd tools/pmoncfg // 我没有办法直接编译,原因是新版本的gcc对类似loop:的标签比较“挑剔”[5],你得在后面加个空语句之类,如果遇到错误,自己根据提示修改吧。 $ make $ cp pmoncfg /usr/bin/ |
编译PMON(for loongson2e)。
$ cd zloader.2edev/ $ make cfg $ make tgt=rom $ make tgt=ram // 生成后的pmon $ ls pmon.bin.gz $ gunzip pmon.bin.gz |
现在就可以用你自己编译的PMON来引导Debian系统了。
说明:如果编译过程中遇到错误,请注意看错误提示,一般就是缺少什么头文件之类的,把对应的软件包安装上就行了。
4、在GXemul上安装一个全新的Debian操作系统
待续……
(还没有找到适合loong2e的安装程序,如果想了解基本的安装过程,请参考资料[7,8])
5、安装基本的开发环境工具
上面的硬盘镜像文件中的Debian基本系统启动后,不支持网络(有时间得先把这个解决),否则就可以直接通过网络安装我们需要的各种工具了(基本上把build-essential,cscope,ctags之类安装上就行)。不过该系统上,gcc之类的工具都已经有了,基本可以用(如果确实觉得不够,而且只想学习mips汇编,那么可以利用qemu来凑合一下,具体操作见我之前写的一篇blog[14])。
下面介绍如何往该硬盘镜像文件系统中添加文件。
这个硬盘镜像文件包含一个基本的文件系统,我们可以通过fdisk查看文件系统在该文件中的开始位置[10],然后把它挂载起来。
$ fdisk -l -u -C1 hda
Disk hda: 0 MB, 0 bytes 16 heads, 63 sectors/track, 1 cylinders, total 0 sectors Units = sectors of 1 * 512 = 512 bytes Disk identifier: 0x00000000
Device Boot Start End Blocks Id System hda1 63 1968623 984280+ 83 Linux Partition 1 has different physical/logical endings: phys=(1023, 15, 63) logical=(1952, 15, 63) |
可以看到,该文件中的hda1分区的起始位置是第63个扇区,而每个扇区是512bytes,这样,文件系统的偏移就是63*512=32256。下面挂载该分区。
$ mount -o, offset=32256 hda /mnt $ ls /mnt/ bin boot dev etc home initrd lib lost+found media mnt opt proc root sbin srv sys tmp usr var |
这样我们就可以往该文件系统中添加文件了。
6、开发实例
关于C语言开发,跟底层架构关系不大,但是汇编语言开发却有很大的不同。因为我在资料[13]中写了一个Hello World的例子,这里就不再介绍了,请大家直接参考资料[13],这个例子我在上面的Debian系统中也可以正确编译和执行。
本文参考了很多相关资料,大都列在后面,如果在阅读本文时遇到相关问题,请直接找对应的参考资料查看或者在后面回帖。
参考资料
[1] Loongson from wikipedia
http://en.wikipedia.org/wiki/Loongson
[2] GXemul
http://gavare.se/gxemul/
[3] PMON 2000
http://www.opsycon.se/
[4] Debian
http://www.debian.org/
[5] compilartion error : label at end of compound statement
http://www.linux-mips.org/archives/linux-mips/2006-03/msg00234.html
[6] loongson相关的git软件仓库
http://www.loongson.cn/support/cgi-bin/gitweb/gitweb.cgi?
http://www.loongson.cn/support/public/
[7] official GXemul document
http://gavare.se/gxemul/gxemul-stable/doc/guestoses.html
[8] gxemul_loongson安装NetBSD
http://www.lemote.com/bbs/viewthread.php?tid=12391&highlight=gxemul
[9] 比较稳定的龙芯gxemul-0.4.2
http://www.lemote.com/bbs/viewthread.php?tid=1957&extra=page%3D
[10] 磁盘完整映像的mount
http://www.anheng.com/news/html/net_admin_blog/dd_hda_mount_loop.html
[11] pmon编译方法
http://www.lemote.com/bbs/viewthread.php?tid=7448&
[12] 编译PMON指南
http://blog.csdn.net/caimouse/archive/2006/12/24/1458074.aspx
[13] MIPS汇编语言程序设计之Hello, World!
http://oss.lzu.edu.cn/blog/blog.php?/do_showone/tid_1674.html
[14] 在unbuntu8.04下通过qemu构建mips-linux开发环境
http://oss.lzu.edu.cn/blog/blog.php?/do_showone/tid_1646.html