作者: bob_zhang2004@163.com
潤飾: Richman
作嵌入式系統,一定要學會裁減
嵌入式系統最典型的就是沒有掛硬碟(NAS 產品除外),通常只有 flash memory,基於 cost down 理由,一般用到 8MB。
所以擺在面前首要問題,就是軟體都移植上板子了,但全部都要放進去卻放不下怎麼辦?那產品就必然缺少某種功能。
裁減: 四條路
1. strip
strip 可以將執行檔中沒有用到的除錯資訊給拿掉,這對程式在執行是沒有影響的。
對於我們的 jk2410 就是 arm-9tdmi-linux-gnu-strip。
比如 sshd, 可以這樣做
arm-9tdmi-linux-gnu-strip sshd
也可以加萬用符號
arm-9tdmi-linux-gnu-strip *
2. 一個一個往板子放
初學者總是
./configure --prefix=/work/bob ...一堆交叉編譯參數 && make && make install
結果,有用沒有用的,通通 copy 到 /work/bob/下面來了。這顯然不是嵌入式之道,如果都這麼玩,板子的 flash 再大,也是放不下的。
要考慮哪些是有用的,哪些是沒有用的,舉個最簡單的例子,man 這個目錄肯定沒有用,你 copy到板子上去幹嘛呢?
我的思路就是一個一個的往板子裡面放,「需要的一個不少, 不需要的一個不多」。
下面的例子,可能我的記性有誤,但差不多就這個意思吧!
先執行 mysqld , 系統提示少了某些 *.so 文件, 我就 copy 到板子(也可以用 nfs)
再執行發現少了 /sbin/xx 文件,再 copy 過來
再執行,提示必須建立某些資料庫,然後我把相關腳本 copy 到板子上去。
又發現 hostname 好像不對,再設置 hostname。
再執行,發現/tmp/權限不夠,再 chmod -R 777 /tmp/
再執行,mysqld --user=root , 然後 ps ,怎麼還是看不到 mysqld,
最後使出殺手鐧(絕對必殺):strace
strace -f -F -o bob.log mysqld --user=root
發現好像說是沒有/dev/urandom,好傢伙,那就 mknod 做一個給它好了。
最後終於跑起來了。在上面的過程中,發現好多東西都沒有用,我記錄下來,重新修改 Makefile,make install的時候, 只 copy 剛才需要的 file 。而且一定要先 strip 過。
3. 改 code
這步,就比較高級一些了。如果上面兩條都做過了。size 還是太大,沒有辦法,只能改 code 了。 把我們用不到的功能相對應的 code通通剛除掉!
比如 mysql,有些功能我們就不需要,乾脆刪掉好了。編譯之後,空間又小了很多。
看看 kernel 就是個典型的例子, 400多MB 的 code,編譯出來的 uImage 才 1M,奇蹟!
4. 換大點的 flash
My God! 經過上面三條,size 還是太大,仍然放不下,沒有辦法了,找老闆:「老闆,我的 flash 太小了,放不下某個功能的 binary,強烈要求換一個大點的 flash」。
所以擺在面前首要問題,就是軟體都移植上板子了,但全部都要放進去卻放不下怎麼辦?那產品就必然缺少某種功能。
裁減: 四條路
1. strip
strip 可以將執行檔中沒有用到的除錯資訊給拿掉,這對程式在執行是沒有影響的。
對於我們的 jk2410 就是 arm-9tdmi-linux-gnu-strip。
比如 sshd, 可以這樣做
arm-9tdmi-linux-gnu-strip sshd
也可以加萬用符號
arm-9tdmi-linux-gnu-strip *
2. 一個一個往板子放
初學者總是
./configure --prefix=/work/bob ...一堆交叉編譯參數 && make && make install
結果,有用沒有用的,通通 copy 到 /work/bob/下面來了。這顯然不是嵌入式之道,如果都這麼玩,板子的 flash 再大,也是放不下的。
要考慮哪些是有用的,哪些是沒有用的,舉個最簡單的例子,man 這個目錄肯定沒有用,你 copy到板子上去幹嘛呢?
我的思路就是一個一個的往板子裡面放,「需要的一個不少, 不需要的一個不多」。
下面的例子,可能我的記性有誤,但差不多就這個意思吧!
先執行 mysqld , 系統提示少了某些 *.so 文件, 我就 copy 到板子(也可以用 nfs)
再執行發現少了 /sbin/xx 文件,再 copy 過來
再執行,提示必須建立某些資料庫,然後我把相關腳本 copy 到板子上去。
又發現 hostname 好像不對,再設置 hostname。
再執行,發現/tmp/權限不夠,再 chmod -R 777 /tmp/
再執行,mysqld --user=root , 然後 ps ,怎麼還是看不到 mysqld,
最後使出殺手鐧(絕對必殺):strace
strace -f -F -o bob.log mysqld --user=root
發現好像說是沒有/dev/urandom,好傢伙,那就 mknod 做一個給它好了。
最後終於跑起來了。在上面的過程中,發現好多東西都沒有用,我記錄下來,重新修改 Makefile,make install的時候, 只 copy 剛才需要的 file 。而且一定要先 strip 過。
3. 改 code
這步,就比較高級一些了。如果上面兩條都做過了。size 還是太大,沒有辦法,只能改 code 了。 把我們用不到的功能相對應的 code通通剛除掉!
比如 mysql,有些功能我們就不需要,乾脆刪掉好了。編譯之後,空間又小了很多。
看看 kernel 就是個典型的例子, 400多MB 的 code,編譯出來的 uImage 才 1M,奇蹟!
4. 換大點的 flash
My God! 經過上面三條,size 還是太大,仍然放不下,沒有辦法了,找老闆:「老闆,我的 flash 太小了,放不下某個功能的 binary,強烈要求換一個大點的 flash」。
沒有留言:
張貼留言