[改造計畫][求助] 關於CHT最新ATUR-R型號 TECOM 4013B改造



贊助商連結


頁 : [1] 2

purk
2004-06-21, 12:58 PM
http://www.pczone.com.tw/showthread.php?t=125120
http://www.pczone.com.tw/showthread.php?t=125677
http://www.pczone.com.tw/showthread.php?t=123588

上面這幾篇 是我的小小試玩心得

也因為試玩 我發現這一台 是使用LINUX KERNEL2.4的核心 的小型遷入式系統 但是由於他硬體的限制 有許多功能被移除了

我先介紹一下 這台的主要元件

1.包含CPU跟ADSL連接用的CHIP ----BCM96335
雖說TELNET的時候式顯示BCM96345但是實際上他是使用BCM96335搭配修改過本來是給BCM96345使用的LINUX

2.主要存放OS的地方 FLASHRAM__大小2MB http://mail.apol.com.tw/~if2/m1.jpg

3.OS核心解壓後執行跟TEMP存放處 ___RAM一顆6MB http://mail.apol.com.tw/~if2/m2.jpg

由於這台有一台兄弟機 使用BCM96345晶片

我昨天找到後也發現到該兄弟機的最新BIN檔(就是把整個OS都全部

更新並加入新的功能)也就拿來用看看,但是更新後ATU_R就掛了

也因為如此 我想到了 既然有新的BIN 也就是說這個可以自己想 然後

想辦法更新 並且加入新的功能

這台的原有功能還算強大 他有辦法MOUNT 也有好用的IPTABLES可

以用 可惜記憶體上的限制 它開機完成到執行已經耗用5MB多的記憶




所以我想 把他的記憶體換成32B的 FLASHRAM部分改成4MB的

但是以下有幾個麻煩 想問一下 有經驗開發過遷入(EM)式系統的 各位

高手


1.我知道他是BCM96335 但是不知道他裡面包含的CPU是啥款的 因

為他可以說是SOC 那我該如何偵測出核心 打造出專用的KERNEL

2.它使用BusyBox V6版作他的SHELL 但是很多功能移除 如果說不

能達成第一項目的 那我有辦法只更新他的 BusyBox 版本嗎


3.如果1跟2都可以完成 這台的硬體又可以提升 那合併頻寬應該是可

以的 我剛剛測試了一下 他可以多次撥接上去 甚至 只要VCI通道有開

多的 他也可以使用 也就是我可以做到小小的機器就可以合併頻寬

另外或許可以外加上SAMBA伺服器 當PDC伺服器使用



我到GOOGLE 找了一下 應該是找到CPU的型號了
The embedded MIPS32 CPU, with Broadcom-supplied software, controls the ADSL modem, performs high-performance bridging and routing between the ADSL WAN interface and various LAN interfaces, and allows for customer application development with industry-standard EJTAG/Ethernet tool chains and development environments.


請問該如何 下面的動作

我手邊有已經變成BIN檔的這台ATU_R的OS 我該如何打開

THX


煩請各位高手給予指教




THX

贊助商連結


purk
2004-06-21, 08:36 PM
關於embedded MIPS32 CPU

http://www.google.com.tw/search?q=linux+support+embedded+MIPS32+CPU&ie=UTF-8&hl=zh-TW&lr=

TimeSys Linux software development kit (SDK) for its MIPS32-based EnCore M3 module.

ttwwyy
2004-06-21, 09:11 PM
最初由 purk 發表
http://www.pczone.com.tw/showthread.php?t=125120
http://www.pczone.com.tw/showthread.php?t=125677
http://www.pczone.com.tw/showthread.php?t=123588

上面這幾篇 是我的小小試玩心得

也因為試玩 我發現這一台 是使用LINUX KERNEL2.4的核心 的小型遷入式系統 但是由於他硬體的限制 有許多功能被移除了

我先介紹一下 這台的主要元件

1.包含CPU跟ADSL連接用的CHIP ----BCM96335
雖說TELNET的時候式顯示BCM96345但是實際上他是使用BCM96335搭配修改過本來是給BCM96345使用的LINUX

2.主要存放OS的地方 FLASHRAM__大小2MB http://mail.apol.com.tw/~if2/m1.jpg

3.OS核心解壓後執行跟TEMP存放處 ___RAM一顆6MB http://mail.apol.com.tw/~if2/m2.jpg

由於這台有一台兄弟機 使用BCM96345晶片

我昨天找到後也發現到該兄弟機的最新BIN檔(就是把整個OS都全部

更新並加入新的功能)也就拿來用看看,但是更新後ATU_R就掛了

也因為如此 我想到了 既然有新的BIN 也就是說這個可以自己想 然後

想辦法更新 並且加入新的功能

這台的原有功能還算強大 他有辦法MOUNT 也有好用的IPTABLES可

以用 可惜記憶體上的限制 它開機完成到執行已經耗用5MB多的記憶




所以我想 把他的記憶體換成32B的 FLASHRAM部分改成4MB的

但是以下有幾個麻煩 想問一下 有經驗開發過遷入(EM)式系統的 各位

高手


1.我知道他是BCM96335 但是不知道他裡面包含的CPU是啥款的 因

為他可以說是SOC 那我該如何偵測出核心 打造出專用的KERNEL

=>MIPS

2.它使用BusyBox V6版作他的SHELL 但是很多功能移除 如果說不

能達成第一項目的 那我有辦法只更新他的 BusyBox 版本嗎


3.如果1跟2都可以完成 這台的硬體又可以提升 那合併頻寬應該是可

以的 我剛剛測試了一下 他可以多次撥接上去 甚至 只要VCI通道有開

多的 他也可以使用 也就是我可以做到小小的機器就可以合併頻寬

另外或許可以外加上SAMBA伺服器 當PDC伺服器使用



我到GOOGLE 找了一下 應該是找到CPU的型號了
The embedded MIPS32 CPU, with Broadcom-supplied software, controls the ADSL modem, performs high-performance bridging and routing between the ADSL WAN interface and various LAN interfaces, and allows for customer application development with industry-standard EJTAG/Ethernet tool chains and development environments.


請問該如何 下面的動作

我手邊有已經變成BIN檔的這台ATU_R的OS 我該如何打開

THX


煩請各位高手給予指教




THX

purk
2004-06-24, 07:27 AM
找到兄弟機的原始檔了
http://www.usr.com/support/s-gpl-code.asp

原來是用UCLINUX


他用的DHCP 是用這個 UDHCP


http://udhcp.busybox.net/

cheerx
2004-06-24, 09:41 AM
PURK兄真是認真,這麼快又有進度了!!

祝您成功 ^^

purk
2004-06-24, 10:17 AM
這篇是 修改機頂盒 的FLASHRAM裡面OS的 當作範例

http://webpal.bigbrd.com/index.html

http://www.viaarena.com/?PageID=379

http://hanel.csie.ncku.edu.tw/2004_winter/eros/Lab/LAB1.htm http://www.linuxbusinessweek.com/story/34300.htm

7.1 Ethernet over USB
At this writing, the Ethernet over USB HOWTO by Charles-Edouard Ruault is at version 1.12 and its details have become out of date. You might try a google search to ascertain whether there is a more current version. In any case, I will give more current information here and will assume you have a kernel as recent as 2.4.21. Further, I assume your LDW kernel has been configured to support USB. Nevertheless, you may need to reconfigure and recompile for certain options. It is assumed that you are familiar with reconfiguring and recompiling the kernel. Specifically, in the LDW kernel configuration process (you are in directory /usr/src/linux/ or equivalent as root and have entered something like 'make menuconfig'), select these additional options:


Under "Code maturity level options", select "Prompt for development and/or incomplete code/drivers"
Under "USB support", subsection "USB Network adaptors", select "USB-to-USB Networking cables, Linux PDAs, ... (EXPERIMENTAL) "
Then, after the remaining recompilation steps and subsequent, reboot the LDW into the new kernel.


Ensure that the LDW and Z are connected by the USB cable from the Z's cradle to the LDW. With both LDW and Z booted and operational, enter '/sbin/ifconfig -a' on the LDW console. You should see a new interface for a usb device (e.g. usb0). If not, you might push the sync button on the Z cradle and retry. Upon success, this new interface can now be configured with these commands, entered as root on the LDW console:


/sbin/ifconfig usb0 192.168.129.1 netmask 255.255.255.255 up
/sbin/route add -host 192.168.129.201 usb0

You'll be doing this routinely, so you might make this an executable script.


Finally, test your result by pinging the Z from the LDW:


ping 192.168.129.201

thereby assuring connectivity.




http://www.chupa.nl/forum/showthread.php?t=305 http://www.chupa.nl/forum/showthread.php?p=1947#post1947

purk
2004-06-25, 03:17 AM
busybox的選擇編譯

http://ytw.jp/linux/rootfs1.html

purk
2004-06-26, 02:42 AM
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/kernel/v2.4/linux-2.4.19.tar.bz2

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

下載 uClinux-2.4.19-uc1-mips.diff.gz
http://www.xiptech.com/download/uClinux-2.4.19-uc1-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.
































1. Why Linux?
2. Architecture of System
3. Design Methodology
4. Host-Target Development
5. Tool Chain
6. Kernel & HAL
7. Root File System
8. Boot Loader
9. Booting & Running
10. Network Security
11. Debugging
12. Sample AP

purk
2004-06-26, 05:58 AM
目前尚 市面可以 改成LINUX的 ROUTER 包含ADSL 連接用ROUTER


http://hri.sourceforge.net/

轉貼


___
要平平地玩 Embedded Linux 有好多方法。而家市面上已經有很多電腦產品是用 Embedded Linux 作為操作系統,大家熟悉的有

Linksys Wireless Router WRT54G 用 PowerPC 4M/16M (ROM/RAM)
Asus Wireless Router WL500G 用 PowerPC 有 USB 1.1
Bufflo Wireless Router WBRG54 用 PowerPC
Netgear Wireless Router WGT624
Gigabyte 第一代 Wireless Router
Level One WBR 系列 Wireless Router

歐美等地已經有很多 Embedded Linux 同好成功在 x86 建立 cross development platform 并發放加強功能 firmware. 其中以 Linksys WRT54G 有最多不同的群體在開發。 Linksys 亦有如 GPL 所要求,發放已修改的源碼。

用以上產品的好處為價錢平!一般 54M Wireless Router 賣HK$600 左近,已經有最少3個 LAN PORTS (WAN/LAN/WIRELESS),RAM / FLASH ROM, CPU 及有部份有 USB PORT。例如 ASUS WL500G,外國已經有人成功在 FIRMWARE 上加上 TELNET/SSH/FTP/NTP 及連接 USB HARDDISK, Kernel 及 Tools 甚至可以放在 USB HARDDISK 的 ext2 PARTITION 上,打破了 FLASH ROM 的容量限制!

而現時最令我心動的是 Buffalo 的 HD-HGLAN 系列 NAS,可參巧﹕
http://buffalo.melcoinc.co.jp/products/catalog/item/h/hd-hglan/index.html

因為它有 Gigabit LAN,USB 2.0 x2,IDE PORT,用 PowerPC CPU,體積非常輕巧,大約同一般 Buffalo Router 一樣大,連 120GB HARDDISK 價錢為港幣二千多元,日本仔已經有很多人 Develop FIRMWARE 在此 Platform 上,仲有一個新 Distro (跟 Buffalo 無關的﹞叫 Vine. 最衰此產品沒有在香港發售!但有一個大陸網站話有得賣!
http://www.pbs.org/cringely/pulpit/pulpit20040527.html

purk
2004-06-26, 06:00 AM
1. 我在以上 mention 過的 routers 及 NAS, 全部已經使用 Linux. 大部份原廠 firmware 用 2.4 kernel.

2. 基本上將以上裝置當 embedded linux 用,有兩個方案﹕
*在原廠 firmware 上找個破口,第一要成功取得 shell prompt, 然後加其他有用的 tools, 例如 ssh, ftp, ntp, samba, etc.
*在 x86 環境內使用 cross development tools, 重新寫及編譯 firmware, 其實不太難,最難是要學不同廠的 flash rom layout 及 firmware 格式,因為第一次 bootstrap 還是要用原廠的 firmware update function 才可將 linux system 寫入 flash rom 內。

3. 好,來來來﹕
Linksys WRT54G Router:
http://www.sveasoft.com/modules/phpBB2/viewforum.php?f=6
http://openwrt.ksilebo.net/
http://www.portless.net/ewrt/index.html
http://www.seattlewireless.net/index.cgi/LinksysWrt54g

Asus WL500G Router:
http://www.chupa.nl/forum/forumdisplay.php?f=8

Buffalo HD-HG NAS:
http://www.yamasita.jp/linkstation/