1.核心怎樣啟動第乙個應用程式
(1)開啟乙個裝置
open("/dev/console");
sys_dup(0);
sys_dup(0);
注釋:open函式開啟乙個檔案(第乙個檔案標號為0),sys_dup(0)表示複製第乙個檔案,所以printf,scanf,err三個都指向終端/dev/console。
(2)通過run_init_process來啟動程式,這個函式如果傳入的命令死迴圈命令,這個函式將不會返回,系統中這個優先執行init=***x,也就是命令列傳入的引數(是uboot傳給核心的),如果沒有傳入引數,則還有幾個預設的命令,依次往下執行,直到有乙個成功。
2.通過securecrt連線開發板之後,使用者可以在電腦上輸入命令和開發板進行互動,這是因為在開發板的linux系統上執行著乙個shell程式,即終端程式。
3.busybox:是眾多命令的集合,集合了linux系統中基本的命令,ls命令等其實是乙個鏈結指向busybox,執行ls命令的時候其實就是執行busybox(等同於執行busybox ls)。在busybox的源**中就包含了ls.c,copy.c等等。
4.init程式(也就是0號程序)應該去讀取乙個配置檔案,然後解析配置檔案,最後根據配置檔案執行使用者程式。這樣可以達到不同的系統系統啟動之後能夠實現不同的功能。
5.呼叫關係
busybox-->init_main
parse_inittab(解析init)
file=fopen(inittab, "r");//開啟配置檔案/etc/inittab
new_init_action //(1)建立乙個init_action結構,並填充
//(2)把這個結構放入init_action_list鍊錶
run_actions(sysinit);
waitfor(a,0); //執行應用程式,等待它執行完畢
run(a); //建立process子程序
waitpid(runpid,&status,0); //等待結束
delete_init_action(a); //在init_action_list鍊錶中刪除
run_actions(wait);
waitfor(a,0); //執行應用程式,等待它執行完畢
run(a); //建立process子程序
waitpid(runpid,&status,0); //等待結束
delete_init_action(a); //在init_action_list鍊錶中刪除
run_actions(once);
run(a); //建立process子程序
delete_init_action(a); //在init_action_list鍊錶中刪除
while(1)
run_actions(askfirst);
if(a->pid == 0)
wpid = wait(null); //等待子程序退出
while(wpid > 0)
}new_init_action(askfirst,bb_default_login_shell,vc_2);
||new_init_action(askfirst,"-/bin/sh","/dev/tty2");
static void new_init_action(int action, const char*command, const char *cons)
預設的配置要執行的操作:
格式::::
::ctrlaltdel:reboot
::shutdown:umount -a -r
::restart:init
::asdfirst:-/bin/sh
tty2::asdfirst:-/bin/sh
tty3::asdfirst:-/bin/sh
tty4::asdfirst:-/bin/sh
::sysinit:/etc/init.d/rcs
inittab配置檔案的格式:
:::id=>/dev/id,用做終端:stdin,stdout,stderr:printf,scanf,err
runlevels:忽略掉
action:指示何時執行:包括sysinit,respawn,askfirst,wait,once,restart,ctrlaledel,and shutdown.
process:應用程式或指令碼
6.最小根檔案系統
(1)/dev/console以及/dev/null
(2)init應用程式=>busybox
(3)/etc/inittab
(4)配置指定的應用程式
(5)c庫
7.busybox資料夾中的install檔案有如何編譯的教程
編譯器需要在makefile中指定
最後不能直接在pc上安裝!需要使用:
make conifg_prefix=/usr/myfs install
這個命令執行之後,在myfs資料夾中就有了bin、usr之類的資料夾。
8.建立裝置檔案
# mkdir dev
# sudo mknod console c 5 1
# sudo mknod null 1 3
9.構造inittab
# mkdir etc
# vi etc/inittab
conosle::askfirst:-/bin/sh
解析:這是乙個最簡單的配置檔案
10.c庫安裝
拷貝c庫的時候加-d引數,是讓系統將鏈結檔案拷貝為鏈結檔案,而不要拷貝為實際的檔案。
# mkdir /lib
# cp *.so* /usr/lib -d
11.製作映像檔案
yaffs1是針對小頁的nand flash,每一頁512位元組,每頁2kb的nand flash要使用yaffs2。
製作yaffs2檔案系統可以使用工具:yaffs_source_util_larger_small_page_nand.tar.bz2
# mkyaffs2image myfs my_fs.yaffs2
將生成的檔案系統燒寫到nand flash中。
12.這樣製作好的檔案系統是不能使用ps命令的,修改方法
# mkdir proc
# mount -t proc none /proc
13.12點是針對手動加上的,可以在修改配置檔案中
配置檔案中加入
::sysinit:/etc/init.d/rcs
# mkdir etc/init.d
# vi etc/init.d/rcs
mount -t proc none /proc
chmod +x etc/init.d/rcs
14.在13中也可以將mount -t proc none /proc替換為mount -a,mount -a這個命令會依賴乙個檔案etc/fstab
fstab的格式:
device mount-point type options dump fsck order
所以在fstab中寫入:
proc /proc proc defaults 0 0
vi編輯儲存後,使用cat命令列印出來檢查一下:
# cat etc/init.d/rcs
注釋:mount -a會去讀取fstab這個檔案,根據檔案的指示去掛載相應的檔案系統。
15.# cat /proc/mounts
檢視當前掛載了那些系統
16.dev目錄下應該有很多裝置的驅動,如果每乙個驅動都手動去建立,將會非常麻煩,所以linux提供了udev機制來解決這個問題。udev用來自動建立/dev/裝置節點,busybox裡面有乙個mdev,是udev的簡化版本。
mdev -s:表示將已有的裝置節點先建立出來
在linux中,很多程式都必須先配置,然後才能編譯
# ./configure --shared --prefix=/usr
--shared:表示會編譯出動態庫
--prefix:表示安裝在usr目錄下
17.nfs檔案系統
(1)伺服器允許某個目錄被掛接:/etc/exports中定義這個目錄
# sudo vi etc/exports
加入:/usr/myfs *(rw_sync_no_root_squash)
# sudo /etc/init.d/nfs-kernel-server restart
# sudo mount -t nfs 192.168.1.4:
/usr/myfs /mnt
檢查能否自己掛載(pc機)
(2)開發板去掛接
# mkdir /mnt
# mount -t nfs -o nolock 192.168.1.19:/usr/myfs /mnt
18.nfs掛載啟動
(1)伺服器ip、目錄
(2)開發板的ip
NFS檔案系統製作
在前面的一章中已經實現了initramfs檔案系統,但是由於開發的需要,nfs檔案系統更加適合,因此,需要使用nfs檔案系統。那需要怎麼做呢?1 配置linux核心以支援nfs檔案系統,同時需要將initramfs的選項去掉 make menuconfig general setup initial...
檔案系統製作
1 建立目錄 mkdir rootfs cd rootfs mkdir bin dev etc lib proc sbin sys usr mnt var mkdir usr bin usr lib usr sbin lib modules 2 建立裝置檔案 cd rootfs dev mknod ...
檔案系統製作步驟
magicarm270 開發平台上cramfs 根檔案系統的製作 1 將光碟附帶的rootfs.cramfs linux linux images 目錄下 拷貝到任意目錄下 2 在該目錄下建立兩個檔案 mkdir temp 建立目錄 temp mkdir cramfs 建立目錄 cramfs 3 將...