龙芯软件开发:使用龙芯2e的模拟器GXemul

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/下载到。

$ wget -c http://www.lemote.com/upfiles/gxemul-0.4.3.godson.tar.gz
$ tar zxf gxemul-0.4.3.godson.tar.gz
$ cd gxemul-0.4.3
$ dpkg-buildpackage
$ dpkg -i gxemul_0.4.3-1_i386.deb

 



    安装完以后,可以下载一个编译好的PMON.bin以及一个包含Debian基本文件系统的硬盘映像文件。

$ wget -c http://www.lemote.com/upfiles/emulator.tar.gz
$ tar zxf emulator.tar.gz
//编译好的pmon.bin,这个是Loongson的BIOS&BootLoader
$ ls emulator/pmon.bin
//这个是loongson的linux内核
$ ls emulator/vmlinux
$ wget -c http://www.lemote.com/upfiles/virtual-disk.tar.bz2
$ tar jxf virtual-disk.tar.bz2
//这个是基本的Debian系统
$ ls hda

 



    通过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,也记得安装一下:

// 这个貌似已经停止更新,不过还是可以玩的
$ svn co http://www.loongson.cn/svn/pmon-loongson/
// 如果想使用最新的版本,建议用git仓库(见资料[6]的官方说明),后面都以这个为例
$ git-clone http://www.loongson.cn/support/git/project/pmon

 



    下载并安装mips交叉工具链(好老好老,呵呵,gcc才2.x,不过跟上面的代码配套,如果用最新的toolchain[6],反而没有办法编译上面的PMON)。

$ wget http://www.loongson.cn/svn/pmon-loongson/toolchain/toolchain-pmon.tgz
$ tar -C / -zxvf toolchain-pmon.tgz

 



    设置环境变量,把下面两行添加到/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

你可能感兴趣的:(软件开发)