2009年11月10日

pxa300 mkrootfs.sh 閱讀筆記

(300\src\preview-kit\busybox\busybox-1.01\examples\bootfloppy\mkrootfs.sh)


#!/bin/bash
#
# mkrootfs.sh - creates a root file system


此檔為建立file system的腳本

# TODO: need to add checks here to verify that busybox, uClibc and bzImage
# exist


# command-line settable variables
設定busybox和uclibc的目錄夾
BUSYBOX_DIR=..
UCLIBC_DIR=../../uClibc
TARGET_DIR=./loop
FSSIZE=4000
CLEANUP=1
MKFS='mkfs.ext2 -F'

# don't-touch variables
BASE_DIR=`pwd`


while getopts 'b:u:s:t:Cm' opt
do
case $opt in
b) BUSYBOX_DIR=$OPTARG ;;
u) UCLIBC_DIR=$OPTARG ;;
t) TARGET_DIR=$OPTARG ;;
s) FSSIZE=$OPTARG ;;
C) CLEANUP=0 ;;
m) MKFS='mkfs.minix' ;;
*)
echo "usage: `basename $0` [-bu]"
echo " -b DIR path to busybox direcory (default ..)"
echo " -u DIR path to uClibc direcory (default ../../uClibc)"
echo " -t DIR path to target direcory (default ./loop)"
echo " -s SIZE size of root filesystem in Kbytes (default 4000)"
echo " -C don't perform cleanup (umount target dir, gzip rootfs, etc.)"
echo " (this allows you to 'chroot loop/ /bin/sh' to test it)"
echo " -m use minix filesystem (default is ext2)"
exit 1
;;
esac
done




# clean up from any previous work
清除了之前殘留的檔案
mount | grep -q loop
[ $? -eq 0 ] && umount $TARGET_DIR
[ -d $TARGET_DIR ] && rm -rf $TARGET_DIR/
[ -f rootfs ] && rm -f rootfs
[ -f rootfs.gz ] && rm -f rootfs.gz


# prepare root file system and mount as loopback
準備loopback??
dd if=/dev/zero of=rootfs bs=1k count=$FSSIZE
$MKFS -i 2000 rootfs
mkdir $TARGET_DIR
mount -o loop,exec rootfs $TARGET_DIR # must be root


# install uClibc
安裝uClibc和複製一些.so檔
mkdir -p $TARGET_DIR/lib
cd $UCLIBC_DIR
make INSTALL_DIR=
cp -a libc.so* $BASE_DIR/$TARGET_DIR/lib
cp -a uClibc*.so $BASE_DIR/$TARGET_DIR/lib
cp -a ld.so-1/d-link/ld-linux-uclibc.so* $BASE_DIR/$TARGET_DIR/lib
cp -a ld.so-1/libdl/libdl.so* $BASE_DIR/$TARGET_DIR/lib
cp -a crypt/libcrypt.so* $BASE_DIR/$TARGET_DIR/lib
cd $BASE_DIR


# install busybox and components
安裝busybox和元件
cd $BUSYBOX_DIR
make distclean
make CC=$BASE_DIR/$UCLIBC_DIR/extra/gcc-uClibc/i386-uclibc-gcc
make PREFIX=$BASE_DIR/$TARGET_DIR install
cd $BASE_DIR


# make files in /dev
mkdir $TARGET_DIR/dev
./mkdevs.sh $TARGET_DIR/dev


# make files in /etc
cp -a etc $TARGET_DIR
ln -s /proc/mounts $TARGET_DIR/etc/mtab


# other miscellaneous setup
建立initrd和proc目錄
mkdir $TARGET_DIR/initrd
mkdir $TARGET_DIR/proc


# Done. Maybe do cleanup.
if [ $CLEANUP -eq 1 ]
then
umount $TARGET_DIR
rmdir $TARGET_DIR
gzip -9 rootfs
fi


為了瞭解什麼是.so檔(share object)

預備知識:
1.程式Compile流程
http://www.prudentman.idv.tw/2008/05/compile.html

2.Chapter 4. GNU Compiler Collection(此篇很難...看不太懂)
http://www.study-area.org/cyril/opentools/opentools/gcc.html

其中比較明確的解釋為:


1.preprocess 先處理那些#ifdef #define這些東西並做一些巨集代換

2.compile 做語意分析,翻譯成組合語言(assembly language)

3.assemble 翻成機器碼與OS有關的格式,做成relocatable obj檔。

4.link 找到symbol(函式,變數名)與程式庫(shared obj)中的副程式 ,做成可執行obj檔(executable obj)。


shared obj函式庫裡的程式碼為Position Independent Code (PIC), 也就是它的位址可能會隨著不同process而有不同


另外還對gcc參數做了一下功課:
-S
只進行到compiler便停止,因此輸出為一組合語
言檔,在內定的輸出檔名為輸入檔名去除.c或.i
等字尾之後加上.s而成。

-c
只 compile或assemble輸入檔案,而不作連結,
因此輸出為一目的檔(object file), 內定的檔
名為去除.c、.i或是.s等之後加上.o而成。

-o FILE
不管在那一階段結束動作,都可用此參數將內定
的輸出檔名改成"FILE"
;若是沒用此參數,最後
產生的可執行檔檔名內定為 "a.out",在各階段
結束的輸出內定檔名請看上列參數。




沒有留言:

張貼留言

NO-CARRIER 網卡無法啟動

 工作時,由於想要啟動linux OS的網卡, 發現某張新設定的網卡一直無法啟動,就算下指令UP了,但是也沒有順利啟動 所以爬文後,想要確認該網卡的status, 發現某行為: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu...