by falcon <wuzhangjin@gmail.com>
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