這裡純粹紀錄做過的事情,不保證一定成功。 環境準備:   首先,先Google STLinux 下載2.3的ISO,另外我的電腦是跑Ubuntu,必須使用更新的install script。把下載的ISO解開複製到某個目錄內,把install用剛剛下載的新版檔案蓋掉。   先用apt-get安裝rpm套件,再切換到superuser啟動 install script。安裝後的內容會放在 /opt/STM/STLinux-2.3 裡面。   先到 host/bin 內執行 stmyum update 升級安裝,這樣就會取得最新的 kernel 2.6.23.17 source 與更新後的套件,由於網樂通剛好用相同版號的kernel,剛好省下了自己找kernel的麻煩。 設定環境:   將適當的PATH加入環境變數中,這樣make才找得到STLinux的toolchain。   然後,複製STLinux的source tree到自己的working directory,就可以開始工作了。 Start working:   我們要先找出正確的平台組態,所以先看看目前的 kernel支援哪些平台:   make ARCH=sh CROSS_COMPILE=sh4-linux- help   在Architecture specific targets中,找到了符合網樂通平台的pdk7105,所以直接下pdk7105_defconfig就可以產生可用的.config文件:   make ARCH=sh CROSS_COMPILE=sh4-linux- pdk7105_defconfig   接下來,就可以修改核心選項,加入我要的RT73無線網卡Driver(跟一堆東西):   make ARCH=sh CROSS_COMPILE=sh4-linux- menuconfig   然後編譯kernel:   make ARCH=sh CROSS_COMPILE=sh4-linux- vmlinux   有四核心的電腦,下編譯指令時加上 -j4可以節省編譯時間。 開機測試:   首先,我們要先確定網樂通的硬體配置為何,這可以很簡單的透過u-boot輸出訊息取得: ## Booting image at 80000000 ... Image Name: Linux 2.6 Image Type: SuperH Linux Kernel Image (gzip compressed) Data Size: 2459057 Bytes = 2.3 MiB Load Address: 80800000 Entry Point: 80801000 Verifying Checksum ... OK Uncompressing Kernel Image ... OK CMDLen=169 There is "hwaddr" keywords! Position=95 Read MacAddr=24cf21b0ab14 [iptv_kernel]:Starting kernel console=ttyAS0,115200 root=8:2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:24:cf:21:b0:ab:14 phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048 - 0x00000000 - 0 ...   其中,Load Address跟Execute Address(即Entry Point)要記下來,等下會用到。   另外,也可以下pri指令,就可以發現u-boot其實是讀入隨身碟的第二磁區根目錄內的vmlinux.ub來開機。 PDK7105> pri bootdelay=0 baudrate=115200 ethaddr=DE:EA:FF:FF:01:01 board=pdk7105 monitor_base=0xA4000000 monitor_len=0x00040000 monitor_sec=1:0-1 load_addr=0x80000000 ipaddr=192.9.150.61 serverip=192.9.150.67 bootdelay=0 update_uboot=usb start;fatload usb 0 80000000 u-boot.bin;update_spi_uboot unprot=protect off $monitor_sec update=erase $monitor_sec;cp.b $load_addr $monitor_base $monitor_len;protect on $monitor_sec ethaddr=12:34:56:78:06:BD stdin=serial stdout=serial stderr=serial bootargs=console=ttyAS0,115200 root=8:2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:10:08:E2:12:06:BD phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048 bootcmd=ext2load usb 0:2 80000000 vmlinux.ub; bootm 80000000 Environment size: 715/65532 bytes   所以如果要做一個相容核心的話,我們還要做一些指令,讓核心變成可以在網樂通上開機的vmlinux.ub:   sh4-linux-objcopy -O binary vmlinux vmlinux.bin   gzip --best --force vmlinux.bin   mkimage -A sh -O linux -T kernel -C gzip -a 0x80800000 -e 0x80801000 -n "Linux 2.6" -d vmlinux.bin.gz vmlinux.ub   其中,-a 跟 -e 後面的選項就是剛剛開機訊息裡面提到的Load Address跟Execute Address實際位址。   在不修改任何設定值的情況下,編譯好的kernel只有1.7MB,跟網樂通內附的kernel有很大差距。不過只要編譯過的kernel可以動就好,畢竟我的重點是編譯Wifi Driver Module。