【教學】打造你自己的4013B的核心__2



贊助商連結


purk
2005-04-25, 03:11 AM
使用mips32的模擬器

1.抓下ximulator 位置如下 http://www.xiptech.com/download/ximulator.zip

2.抓下uclinux的映象檔
位置如下http://www.xiptech.com/download/uclinux.bin.tar.gz

3.將ximulator解壓,將檔案解壓到c:\xiptech內

4.將uclinux.bin.tar.gz解壓,把檔案放入c:\xiptech內

5.C:\xiptech\辦豎源宒 jit.exe

6.螢幕顯示2個視窗,都不能關閉一個是模擬情況一個是 模擬器開機的訊息畫面

7.開始-->執行--->輸入 telnet 127.0.0.1 100001 ---->按確定

8.等一下,可以看到一個linux的shell,就可以執行簡單的mips的cpu模擬



uclinux 移植到MIPS系列CPU上的技巧 與 實作

網路上找到的


Porting ucLinux to MIPS

This document describes how to porting ucLinux to MIPS platform. And also describes how
to porting GNU toolchain and uclibc on that platform. The last version of this document can
always be found at www.xiptech.com.

1.About this document
1.1 What this document tells and doesn't tell
1.2 Copyright notice
1.3 The last version of this document

2. General information of uclinux
2.1 Introduction of uclinux
2.2 How about the GNU toolchain and c lib

3. MIPS
3.1 Introduction of MIPS
3.2 MIPS without MMU

4. Porting ucLinux
4.1 ucLinux kernel structure
4.2 Kernel mode and user mode check
4.3 Memory accessing check
4.4 Fork and vfork
4.5 binfmt_flat.c
4.6 Reserve instruction and linux
4.7 Memory page fault handle

5. Porting GNU toolchain
5.1 GNU toolchain and uclinux
5.2 Porting ELF2FLT
5.3 Reserve instructions and toolchain
5.4 Soft floating

6. Porting uclibc
6.1 Introduction of uclibc
6.2 Stack align to 8 bytes
6.3 Pthread
6.4 float-point instruction

7. JIT Simulator
7.1 Introduction
7.2 How to use it?
7.3 Where can I get it?

8. Other issue
8.1 Share lib on uclinux
8.2 PIC or NO-PIC ?

9. Get and build packages

_______________________________________________________________________________



1.About this document
1.1 What this document tells and doesn't tell

這份文檔描述了把uclinux、uclibc和GNU 工具鏈移植到MIPS平臺上時要注意的問題,
同時也簡要介紹了相關的資料,最後還介紹了一個由Xipos Tech. 提供的 MIPS Simulator。
文檔中沒有精確地列出我們修改了linux的哪個位置,因爲這在我們提供的patch可以
清楚地看到,而且每個版本的linux都有不同。文檔中也沒有詳細介紹MIPS、uclinux的知
識,因爲這些知識可以從很多其他文檔中得到。
我們假設讀者有MIPS和linux kernel的基礎,所以有些問題會說得比較簡短。不過很
希望讀者能夠告訴我們哪些地方講得過於簡陋了,哪些地方不清楚,哪些地方有錯,讓我們
可以在新的版本中更正。
爲了便於說明,我們以MIPSR3000 作爲例子:
希望這份文檔可以幫助讀者順利地把各個版本的uclinux移植到MIPS上。

1.2 Copyright notice
Copyright (c) 2002-2003
Qiu Liming ([email protected] )
Chang Xinlin ([email protected])
Xipos Technology. ( www.xiptech.com )

個人用戶可以免費地獲得和閱讀這份文檔。在未經許可的情況下請不要把它用於商業用
途。

1.3 The last version of this document

文檔的最新版本請從www.xiptech.com 獲取。


2. General information of uclinux
2.1 Introduction of uclinux

在沒有MMU(記憶體管理單元)的機器上,uclinux是最常用的OS之一。它在很大程度
上和標準的linux相容,但是把應用程式從linux移植到uclinux仍需小心,很容易出現make
很順利,而跑起來出錯的情況。因爲uclinux在fork、mmap、stack 大小等方面和linux不同,
會引起一些不易發現的問題。不過考慮到豐富的linux資源,uclinux仍然是 NO MMU 機器
上的最佳選擇。在 www.uclinux.org 上可得到 uclinux的最新版本。
Uclinux 已經被移植到很多平臺上,標準的發行版中包括了ARM和ColdFire兩個版本。
我們在一個專案中遇到了一款NO MMU的MIPS,發現雖然有些公司已經完成了uclinux向
MIPS的移植,但是我們沒有找到公開發佈的版本,至少沒有找到包括kernel、uclibc、toolchain
的完整的包,加上碰到一些特殊的問題,因此我們自己做了所有的移植工作並把它發佈出來。

2.2 How about the GNU toolchain and uclibc
uclibc 是 uclinux上的標準c lib,可以在 www.uclib.org 取得。uclibc中已經有MIPS
相關的代碼,但是其中有些部分需要修改。
對於GNU toolchain 的“標準部分”,uclinux和linux都可以使用,toolchain中MIPS
相關的部分大體沒有問題。但是uclinux支援的flat文件格式需要一個elf2flt的工具來生成,
這個工具沒有考慮MIPS的情況,需要移植。

3. MIPS
3.1 Introduction of MIPS
MIPS 是一款通用的RISC CPU,詳細的資料可從 www.mips.com 取得。MIPS的其中
一些特點是:
軟體直接管理TLB
delay slot
訪問不對齊的地址會引發異常
除0不會産生異常
這些特點或多或少會影響OS和Compiler的設計。

3.2 MIPS without MMU
沒有MMU的MIPS在記憶體佈局上有點奇特:

(figure1.jpg)




從圖中可以看出,如果想kernel mode和user mode同時使用一塊連續的RAM,則應該把
RAM放在物理位址的0x40000000;假如RAM接在物理位址的0x00000000開始,則不能
運行user mode的程式,因爲user mode不能訪問到任何的RAM。本文以RAM放在
0x00000000的情況來說明,因爲這種情況要處理的特殊問題要多一些,而且大多數實際的
機器就是這樣安排RAM的。


4. Porting ucLinux
4.1 ucLinux kernel structure
這一小節簡要地描述一下uclinux kernel的目錄架構,以uclinux 2.4.19爲例。我們可以
在很多地方取得標準的linux kernel的源代碼,通常是一個linux-2.4.19.tar.gz的文件,然後
在 www.uclinux.org 中取得相應版本的patch,uclinux-2.4.19-patch.tar.gz。展開
linux-2.4.19.tar.gz後把uclinux的patch打進去,得到的就是uclinux了。目錄中比原來的linux
多了幾個目錄
mmnommu
arch/armnommu
arch/m68knommu
include/asm-armnommu
include/asm-m68knommu

這些目錄存放了NO MMU的特殊代碼,對應的MMU 版本的目錄在uclinux中就不會起作
用了。另外爲了支援flat格式,還增加了fs/binfmt_flat.c。
我們把include/asm-mips複製到include/asm-mipnommu,把arch/mips複製到
arch/mipsnommu,並且修改Makefile相關的部分,接下來就可以開始porting uclinux to MIPS
的旅程了。

4.2 Kernel mode and user mode (scall_o32.c bug?)
linux中有嚴格的kernel mode和user mode之分,兩種mode對資源的訪問許可權是大不
一樣的。但是在uclinux中這種分別就模糊了很多,主要是因爲uclinux中沒有了對記憶體訪問
的限制,user mode的程式甚至可以直接操作映射到記憶體空間的IO埠,控制外設。
MIPS的情況更有趣,CPU根本不能進入user mode運行程式(原因見3.2)。但是
linux/uclinux的架構要求有“user mode”,因爲signal和schedule都發生在kernel mode返回
user mode的時候。在CPU不進user mode的情況下,OS要有user mode,這看起來有點怪,
是嗎?其實OS的user mode和kernel mode只是一種抽象,並不一定要求CPU就一定是兩
種mode,Intel x86有4種mode,在linux奡N抽象成兩種了。所以,我們要讓MIPS一直
運行在kernel mode,同時設法在uclinux區分兩種mode。
以下爲了避免誤解,我們把CPU的模式稱爲user level和kernel level。
Uclinux執行user mode的程式時會經過一系列操作,關鍵點是 start_thread 這個macro
(include/asm-mipsnommu/processor.h),
#define start_thread(regs, new_pc, new_sp) do { \
/* New thread loses kernel and FPU privileges. */ \
regs->cp0_status = (regs->cp0_status & ~(ST0_CU0|ST0_KSU|ST0_CU1));\
regs->cp0_status = (regs->cp0_status & ~(ST0_CU0|ST0_KSU|ST0_CU1)) | KU_USER;\
regs->cp0_epc = new_pc; \
regs->regs[29] = new_sp; \
current->thread.current_ds = USER_DS; \
} while (0)

start_thread中設置了KU_USER,這就決定了執行每個新的應用程式都會把CPU切換到user
level,只要把這個bit去掉就可以保證MIPS一直工作在kernel level了。
接下來要解決uclinux如何區分兩種mode的問題。也就是說當異常發生時,要看看當
前是否在user mode,是則要換堆疊;當異常返回時,看看是否返回到user mode,是則處理
signal和schedule。原來的MIPS linux中用兩種方式來判斷這一點,一是用CP0_STATUS中
的CU0,二是用CP0_STATUS中的KU_USER。第一種方式在uclinux中可以正常工作,但
第二種就不行了。所以要找出所有利用KU_USER進行判斷的地方,統一改成用CU0。具
體涉及到以下文件:
arch/mipsnommu/kernel/entry.S
arch/mipsnommu/kernel/scall_o32.S
include/arch/mipnommu/stackframe.h
include/arch/mipsnommu/ptrace.h

本節最後一個話題是scall_o32.S,這個文件處理system call,並且獨立處理異常進入、
返回。但是在異常返回時並沒有檢查是否返回到user mode就直接處理signal和schedule,
看來作者認爲system call一定來自於user mode。如果在kernel mode中system call,是否會
有問題呢?


4.3 Memory accessing check
爲了避免user mode的程式在系統調用中傳下來不合法的指標,kernel會在使用指標之
前檢查它的合法性。其實也就是看看指標是否指向kernel mode的地址,如果是則不合法,
這是保證OS的安全性和健壯性的最基本手段。
在uclinux中,很難區分kernel mode和user mode的位址,因此上述的合法性檢查需要
去掉,否則系統就跑不下去了。
首先要修改的是 include/asm-mipsnommu/uaccess.h 中的 __access_ok,絕大多數的合法
性檢查都是由它完成的。另外有一些用 assembly 寫的函數會直接檢查指標,例如
__strncpy_from_user_asm,這些函數就需要單獨修改。


4.4 Fork and Vfork
uclinux的一個特點是只支援vfork而不支援fork。 MIPS linux 埵連ys_fork和
sys_clone,可以通過sys_clone來實現vfork。爲了避免user mode不小心調用了fork,我們
應該把_sys_fork 也改成vfork。這只要修改傳給 do_fork的參數就可以實現了。


4.5 binfmt_flat.c
uClinux 使用獨特的flat執行文件格式, 載入該種格式的代碼在 binfmt_flat.c 中,在
kernel 源代碼上打好 uClinux 的 patch 後,可在代碼樹的fs/下找到該文件。uClinux 發行
版只支援 ARM和68k, 對於mips, 我們還要對 flat 格式文件的連接和載入作一些調整,詳
見下面對 elf2flt 的介紹。


4.6 Reserve instruction and linux
MIPS I中有lwr/lwl,swr/swr這種處理不對齊位址的讀寫的指令,但是並不是每個MIPS
CPU産品都包含它們,當碰到這種指令時CPU會産生Reserve Instruction 異常 。通常的解
決方法是在kernel 中的 do_ri 堨攳u執行指令,但是這並不是最好的方法,先不談由此帶
來的SMP等問題,至少在效率上就是很差的。例如memcpy這個函數堙A很可能就包含了
這種指令,如果每條指令都由do_ri來處理,系統的性能就會急劇下降。因此我們必須針對
這些部分作修改。
如果lwl/lwr 指令是在組合語言堛蔣筐洏峈滿]絕大多數是這種情況),那麽直接修改代碼
就可以了。但是有些“非法指令”是由 gcc 産生的,那就必須修改 gcc了。事實上有些方
案提供者並沒有把gcc一併修改,這便給系統留下了一些性能隱患。


4.7 Memory page fault handle
當缺頁異常發生時,linux會嘗試去查找相應的VMA,並把頁補上。這在uclinux中是
不必要的,因此我們可以把這部分代碼去掉。



5. Porting GNU toolchain
5.1 GNU toolchain and uclinux (ELF2FLT!!)
如前所述,GNU toolchain 基本可以直接用於uclinux,主要的工作是移植elf2flt,並且
針對目的機器作一些調整。
Erik Andersen ([email protected]) 爲編譯基於 uClibc 的GNU toolchain 編寫了兩個
Makefile, 分別支援2.95和3.2 兩個版本的gcc,可以完成source code download、配置、
編譯和安裝一系列工作,非常方便,該Makefile 可以從 www.uclibc.org 下載。我們的移植
工作也是在此基礎上進行的。

5.2 Porting ELF2FLT
uClinux 使用的flat 執行文件格式,GNU bfd 庫並不支援,在uClinux 的應用程式編譯過
程中,GNU 工具鏈以ELF 爲目標文件格式,最終由程式 elf2flt 轉換爲 flat 格式。
首先簡單介紹一下 flat 格式文件的連接和載入機制。
一個flat 格式文件由五部分組成,分別爲 文件頭,text 段,data 段,bss 段,重定位表。
文件頭紀錄該flat 文件的基本資訊,供Loader 使用,主要包括:text、data、bss和重
定位表的大小以及在文件中的位置,執行入口位置,資料壓縮方式等等。
text data bass 段爲程式的代碼和資料,由ld 按照腳本 elf2flt.ld 進行連接得到。
重定位表包含若干32bit 重定位項,與 linux 不同,沒有MMU 的 uClinux 不能保證
把程式載入到連接地址上,作重定位是必須的。重定位表只需包括32bit重定位類型。
此外,腳本elf2flt.ld 在 data 段的開始處放置 got 表,這是由於elf2flt 借用了share
library 的浮動代碼(PIC)機制,這樣可以避免在代碼段作重定位,簡化了載入過程。Got 表以
一個32bit 的-1 項表示結束。
編譯並install elf2flt 後,GNU 工具鏈中的ld 被腳本ld-elf2flt替代,原ld 改名爲
mipsel-uclibc-ld.read。可以這樣build 出一個flat 格式的執行文件:
mipsel-uclibc-gcc –Wl,-elf2flt foo.c –o foo
gcc 在編譯foo.c 後,調用 ld 進行連接,此時腳本ld-elf2flt(已經改名爲 mipsel-uclibc-ld)
會調用兩次原來的 ld, 生成 foo.elf 和foo.gdb 兩個elf 格式的暫存檔案,不同之處是foo.elf
是目標文件(.o),包含重定位資訊,foo.gdb 是執行文件,包含 got 表。然後,ld-elf2flt 以
這兩個文件爲參數執行elf2flt。
elf2flt 將從foo.elf 中讀取重定位項,對foo.gdb 作重定位並記入重定位表,需要注意
的是由於GOT 表的存在,elf2flt 需要對重定位項的位址作一些調整,將其加上GOT 表的
大小,才能適合foo.gdb。
flat 格式文件的載入由 kernel 中fs/binfmty_flat.c 的代碼完成。在讀取文件並解壓資料
後,要根據載入地址分別對GOT 表項和重定位表項作重定位處理。

對於elf2flt 移植到mips, 只需增加對MIPS 體系的R_MIPS_32重定位的處理就可以了。
但目前的flat機制實現在mips 體系下暴露了一些問題,主要有:
got size 計算:elf2flt計算got size 以調整重定位地址,原始的計算方法只有在data 段所
有section 都對齊到4位元組時才能確保正確,在mips 體系下不能保證這一點,我們修改了
計算方法。
base address:elf2flt.ld 以0爲基址進行連接,爲了支援c++並避免在got 項中出現0值,
我們修改基址爲0x40000, 這需要elftflt.ld elf2flt.c 和binfmt_flat.c 同步改動。




5.3 Reserve instructions and toolchain
如4.6節所述,有的情況下我們需要修改 GNU toolchain 來配合特殊的系統。如果系統
只是缺了不對齊記憶體訪問指令,不改toolchain可能還可以勉強過得去,但是有些MIPS CPU
連 mul/div/mod 指令都沒有,這時修改toolchain就是必需的了。如何修改toolchain是個不
小的題目,只能在我們其他的文檔中再加以詳述了。大家也可以參考那篇著名的“GNU
Compiler Collection (GCC) Internals”。
針對不對齊記憶體訪問指令的情況,有個權宜之計,修改gas中的tc-mips.c,也可以避免
編譯出非法指令。這樣改産生的代碼效率不如改gcc高,但是已經比依靠異常處理好很多了。

5.4 Soft floating
無需作其他工作,配置後的gcc 支援軟浮點,使用的是gcc 自帶的浮點庫
(config/fp-bit.c)。編譯時只須帶 –msoft-float 參數即可, 如: mipsel-uclibc-gcc –msoft-float –c
test.c –o test.o



6. Porting uclibc
6.1 Introduction of uclibc
uClibc(www.uclibc.org) 是爲嵌入式系統開發的標準C 庫,與glibc 高度相容,uClibc 專門考
慮了對無MMU 系統的支援,在uClinux 上是當然的選擇。uClibc 已經相當成熟,配置和編譯也很
容易,只需作很少的調整,即可運行在 mips 體系上。

6.2 Stack align to 8 bytes
gcc 工作在mips 體系上時,如果棧指標沒有對齊在 8位元組邊界,va_arg巨集將不能正確拆
解出 8位元組長的參數。由於我們的移植支援64bits 浮點數,因此在uClibc 的啓動代碼中,
我們在調用 __uClibc_main() 之前調整了棧指標。

6.3 Pthread
出於效率的考慮,uClibc 在pthread 的同步支援函數testandset()中使用了MIPS ISA 2
指令進行原子操作,對於嵌入式系統常用的一些 MIPS ISA1 的MPU, 必須修改此處代碼。
我們完成了sysmips(MIPS_ATOMIC_SET…) 系統調用並用其實現 testandset()。

6.4 float-point instruction
uClibc (version 0.9.15) 在 setjmp() & longjmp() 的mips實現中,無條件地對浮點寄存器
進行了保存/恢復操作,嵌入式處理器常常沒有浮點處理器,應當去除這些指令,編輯文件
libc/linux/mips/__longjmp.c 和 libc/linux/mips/setjmp_aux.c,刪除相關代碼即可。

7. JIT Simulator
7.1 Introduction
如果你希望熟悉uclinux,或者希望多點瞭解MIPS,其中一個好辦法是親自做一遍移植
的全過程。把kernel、uclibc、GNU toolchain都建立起來,然後加上 busybox和GUI (例
如micro window)。最好把網路相關的東西也放到系統中,pppd、httpd … 總之把一些基本
的東西做一遍,這樣就可以初步掌握uclinux和MIPS了。
但是不是每個人都能擁有一塊開發板來做試驗,即使有,每次download、燒錄的過程
可能也很麻煩。我們爲大家提供了一個模擬器(或者說虛擬機)可以解決這個問題。 類比
器仿真了一個MIPS的CPU,還有週邊的中斷控制器、flash rom、串口、RTC、LCD等設備,
可以直接運行MIPS GCC生成的binary code,包括linux kernel和所有應用程式。 和其他的
模擬器相比,我們的模擬器最大的特點就是速度快,MIPS CPU的仿真速度在一台P3 650
的PC上可以達到50 mips 以上。我們在模擬器中採用了JIT compile的技術,把MIPS的代
碼編譯成 x86代碼來運行。在高速的PC機上執行模擬器可以流暢地運行flash player這類
動畫軟體。
我們的模擬器可以用於開發、調試、培訓、演示産品等等,但是這次提供的版本只是爲
了讓有需要的個人學習uclinux和MIPS,所以很多功能並不包含在其中,例如高級調試、
外設擴展等等。而且未經許可請不要將之用於商業活動。


7.2 How to use it?
我們這次提供的版本可以運行在MS windows 98/Me/2000/XP 上(如需linux的版本請
和我們聯繫)。下載模擬器的包展開後會看到一份詳細的使用說明。簡單來說,使用者需要
自己建立一個OS kernel image,然後交給模擬器運行就可以了,就像使用開發板一樣。
我們提供的uclinux patch中有一個目錄,arch/mipsnommu/mach-xipos,堶悼]含了類比
器仿真的週邊設備的驅動程式。週邊設備基本上是以Toshiba 的tx3911爲基礎的,模擬器
的文檔堨]含了這方面的資訊。


7.3 Where can I get it?
www.xiptech.com

8. Other issue
8.1 Share lib on uclinux
用是否有process independend data來區分,share lib可以分成兩種:yes or no。像linux、
Windows 95等OS的share lib的data都是進程獨立的,例如errno就是每個進程一個,互不
干擾。而像windows 3.1的share lib中的資料,就是share的。在沒有mmu的機器上,實現
後者(share data)是很容易並且自然的,而要實現前者就要花一些功夫了。uclinux就是因
爲這個原因而長期沒有share lib。不幸的是如果要想利用現有的open source資源,必須實現
process independend data。前一段時間有兩家公司分別實現了arm和coldfire下的uclinux的
share lib,還在國外的論壇上引起了很大的回響,雖說用起來有些限制,但好歹也算是有了。
我們爲MIPS uclinux 實現了share lib,其中涉及到 gcc、ld、uclinux kernel 的等方面的
修改。但是由於我們剛剛才實現這個功能,未經過測試,因此沒有包含在這次發佈的patch
中。

8.2 PIC or NO-PIC ?
標準linux中是一定使用PIC code的,因爲這是share lib的基礎。但是在uclinux卻可
以考慮使用 NO PIC code,帶來的好處是顯然的:運行速度加快。據我們的測試,NO PIC code
大概比PIC code快 30%左右。但是NO PIC code也帶來兩個缺點:可執行文件變大和載入
可執行文件的速度變慢。原因是顯然的,PIC code只需要針對GOT table和init data作重定
位,而NO PIC code要做的重定位的項數則要多得多。在實際中,我們可以根據需要來決定
用哪一種。
順便一提,我們提供的elf2flt中暫時還沒有處理NO PIC code的情況。

9. Get and build packages
Build 工具鏈
首先你要聯接到 Internet,.從 www.xipos.com 下載 toolchain.tar.gz. 解壓縮後 make 即可,
Make 過程download 需要的源代碼並配置編譯.
缺省情況下,工具鏈安裝在 /opt/toolchain, 使用時需要:
export PATH=/opt/toolchain/bin:$PATH
如果要更改這個路徑, 在 make 之前編輯 Makefile, 修改其中的TARGET_PATH.

Make 過程中download 下來的 uClibc 可能需要作一些改動,如去除浮點指令等。這可
以在編譯完工具鏈後隨時進行。完成對源代碼修改後,
make uclibc
即可,make 過程會安裝重新編譯後的uClibc.
或者,你也可以從 www.xiptech.com 下載 uClibc 0.9.15 的patch, 然後:
cd build/uClibc-uClibc-0.9.15
patch -p1 < <path>/uClibc-0.9.15-mipsnommu.patch
cd ../..
make uclibc


toolchain.tar.gz 是 Erik Andersen 爲方便配置基於uClibc的開發環境寫的,我們只對其中
的Makefile 作了少許修改,並使用了我們爲mips 修改過的elf2flt。 這個包本身還在不斷
更新。訪問 www.uclibc.org 可以得到最新版本。


Build uclinux

下載源代碼:
下載 linux-2.4.19.tar.bz2
http://www.kernel.org/pub/linux/ker...-2.4.19.tar.bz2

下載 uClinux-2.4.19-uc1.diff.gz
http://www.uclinux.org/pub/uClinux/....19-uc1.diff.gz

下載 uClinux-2.4.19-uc1-mips.diff.gz
http://www.xiptech.com/download/uCl...c1-mips.diff.gz

下載 Romfs 文件
http://www.xiptech.com/download/romfs.tar.gz

解開源代碼:
mkdir mips-uclinux
cd mips-uclinux
bunzip2 < ../linux-2.4.19.tar.gz2 | tar xvf -
gunzip ../uClinux-2.4.19-uc1.diff.gz
gunzip ../uClinux-2.4.19-uc1-mips.diff.gz
tar zxvf ../romfs.tar.gz

cd linux-2.4.19
patch -p1 < ../uClinux-2.4.19-uc1.diff
patch -p1 < ../uClinux-2.4.19-uc1-mips.diff

編譯 Kernel
make mrproper
cp xipos.config .config
make menuconfig
make dep
make

Kernel 編譯後,生成文件 uclinux.bin,其中包含Kernel 二進位碼和作爲root 的romfs 映射,
使用模擬器運行uclinux.bin.