uclinux啟動(dòng)過程詳細(xì)分析
**************************************************************************
RamDisk有三種實(shí)現(xiàn)方式。
在Linux中可以將一部分內(nèi)存mount為分區(qū)來使用,通常稱之為RamDisk,分為:
Ramdisk, ramfs, tmpfs。
① 第一種就是傳統(tǒng)意義上的,可以格式化,然后加載。這在Linux內(nèi)核2.0/2.2就已經(jīng)支持,其不足之處是大小固定,之后不能改變。為了能夠使用 Ramdisk,我們?cè)诰幾g內(nèi)核時(shí)須將block device中的Ramdisk支持選上,它下面還有兩個(gè)選項(xiàng),一個(gè)是設(shè)定Ramdisk的大小,默認(rèn)是4096k;另一個(gè)是initrd的支持。
如果對(duì)Ramdisk的支持已經(jīng)編譯進(jìn)內(nèi)核,我們就可以使用它了:首先查看一下可用的RamDisk,使用 ls /dev/ram*;首先創(chuàng)建一個(gè)目錄,比如test,運(yùn)行 mkdir /mnt/test;然后對(duì)/dev/ram0 創(chuàng)建文件系統(tǒng),運(yùn)行 mke2fs /dev/ram0;最后掛載/dev/ram0,運(yùn)行mount /dev/ram /mnt/test,就可以象對(duì)普通硬盤一樣對(duì)它進(jìn)行操作了。
② 另兩種則是內(nèi)核2.4才支持的,通過Ramfs或者Tmpfs來實(shí)現(xiàn):它們不需經(jīng)過格式化,用起來靈活,其大小隨所需要的空間而增加或減少。
Ramfs顧名思義是內(nèi)存文件系統(tǒng),它處于虛擬文件系統(tǒng)(VFS)層,而不像ramdisk那樣基于虛擬在內(nèi)存中的其他文件系統(tǒng)(ex2fs)。因而,它無需格式化,可以創(chuàng)建多個(gè),只要內(nèi)存足夠,在創(chuàng)建時(shí)可以指定其最大能使用的內(nèi)存大小。
如果你的Linux已經(jīng)將Ramfs編譯進(jìn)內(nèi)核,你就可以很容易地使用Ramfs了。創(chuàng)建一個(gè)目錄,加載Ramfs到該目錄即可:
# mkdir /testRam # mount -t ramfs none /testRAM缺省情況下,Ramfs被限制最多可使用內(nèi)存大小的一半??梢酝ㄟ^maxsize(以kbyte為單位)選項(xiàng)來改變。
# mount -t ramfs none /testRAM -o maxsize=2000 (創(chuàng)建了一個(gè)限定最大使用內(nèi)存為2M的ramdisk)③ Tmpfs是一個(gè)虛擬內(nèi)存文件系統(tǒng),它不同于傳統(tǒng)的用塊設(shè)備形式來實(shí)現(xiàn)的Ramdisk,也不同于針對(duì)物理內(nèi)存的Ramfs。
Tmpfs 可以使用物理內(nèi)存,也可以使用交換分區(qū)。在Linux內(nèi)核中,虛擬內(nèi)存資源由物理內(nèi)存(RAM)和交換分區(qū)組成,這些資源是由內(nèi)核中的虛擬內(nèi)存子系統(tǒng)來負(fù) 責(zé)分配和管理。Tmpfs向虛擬內(nèi)存子系統(tǒng)請(qǐng)求頁來存儲(chǔ)文件,它同Linux的其它請(qǐng)求頁的部分一樣,不知道分配給自己的頁是在內(nèi)存中還是在交換分區(qū)中。同Ramfs一樣,其大小也不是固定的,而是隨著所需要的空間而動(dòng)態(tài)的增減。
使用tmpfs,首先你編譯內(nèi)核時(shí)得選擇“虛擬內(nèi)存文件系統(tǒng)支持(Virtual memory filesystem support)”。然后就可以加載tmpfs文件系統(tǒng)了:
# mkdir -p /mnt/tmpfs
# mount tmpfs /mnt/tmpfs -t tmpfs
同樣可以在加載時(shí)指定tmpfs文件系統(tǒng)大小的最大限制:
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m
FAT: bogus logical sector size 21072
具體的文件系統(tǒng)FAT格式。虛擬邏輯扇區(qū)大小為20K,linux-2.4.22/fs/fat/Inode.c。
在初始化MS-DOS文件系統(tǒng)時(shí),讀MS-DOS文件系統(tǒng)的superblock,函數(shù)fat_read_super中輸出的上面的信息。
UMSDOS: msdos_read_super failed, mount aborted.
UMSDOS:一種文件系統(tǒng),特點(diǎn)容量大 但相對(duì)而言不大穩(wěn)定。是Linux 使用的擴(kuò)展了的DOS文件系統(tǒng)。它在 DOS 文件系統(tǒng)下增加了長(zhǎng)文件名、 UID/GID、POSIX 權(quán)限和特殊文件 (設(shè)備、命名管道等)功能,而不犧牲對(duì) DOS 的兼容性。允許一個(gè)普通的msdos文件系統(tǒng)用于Linux,而且無須為它建立單獨(dú)的分區(qū),特別適合早期的硬盤空間不足的硬件條件。
VFS: Mounted root (romfs filesystem) readonly
虛擬文件系統(tǒng)VFS(Virtual Filesystem Switch)的輸出信息。
再 次強(qiáng)調(diào)一下一個(gè)概念。VFS 是一種軟件機(jī)制,也可稱它為 Linux 的文件系統(tǒng)管理者,它是用來管理實(shí)際文件系統(tǒng)的掛載點(diǎn),目的是為了能支持多種文件系統(tǒng)。kernel會(huì)先在內(nèi)存中建立一顆 VFS 目錄樹,是內(nèi)存中的一個(gè)數(shù)據(jù)對(duì)象,然后在其下掛載rootfs文件系統(tǒng),還可以掛載其他類型的文件系統(tǒng)到某個(gè)子目錄上。
Mounted devfs on /dev
加載devfs設(shè)備管理文件系統(tǒng)到dev安裝點(diǎn)上。/dev是我們經(jīng)常會(huì)用到的一個(gè)目錄。在2.4的kernel中才有使用到。每次啟動(dòng)時(shí)內(nèi)核會(huì)自動(dòng)掛載devfs。
devfs 提供了訪問內(nèi)核設(shè)備的命名空間。它并不是建立或更改設(shè)備節(jié)點(diǎn),devfs只是為你的特別文件系統(tǒng)進(jìn)行維護(hù)。一般我們可以手工mknod創(chuàng)件設(shè)備節(jié)點(diǎn)。 /dev目錄最初是空的,里面特定的文件是在系統(tǒng)啟動(dòng)時(shí)、或是加載模組后驅(qū)動(dòng)程序載入時(shí)建立的。當(dāng)模組和驅(qū)動(dòng)程序卸載時(shí),文件就消失了。
Freeing init memory: 72K
釋放1號(hào)用戶進(jìn)程init所占用的內(nèi)存
*************************************************************
第三節(jié):加載linux內(nèi)核完畢,轉(zhuǎn)入cpu_idle進(jìn)程
系統(tǒng)啟動(dòng)過程中進(jìn)程情況:
① init進(jìn)程
一 般來說, 系統(tǒng)在跑完 kernel bootstrapping 內(nèi)核引導(dǎo)自舉后(被裝入內(nèi)存、已經(jīng)開始運(yùn)行、已經(jīng)初始化了所有的設(shè)備驅(qū)動(dòng)程序和數(shù)據(jù)結(jié)構(gòu)等等), 就去運(yùn)行 init『萬process之父』, 有了它, 才能開始跑其他的進(jìn)程,因此,init進(jìn)程,它是內(nèi)核啟動(dòng)的第一個(gè)用戶級(jí)進(jìn)程,它的進(jìn)程號(hào)總是1。你可以用進(jìn)程查看命令來驗(yàn)證:
# ps aux
PID Uid VmSize Stat Command
1 0 SW init
2 0 SW [keventd]
3 0 SWN [ksoftirqd_CPU0]
4 0 SW [kswapd]
5 0 SW [bdflush]
6 0 SW [kupdated]
7 0 SW [rbwdg]
9 0 SW [mtdblockd]
10 0 SW [khubd]
80 0 SW [loop0]
另外 Linux 有兩個(gè) kernel 類的 process 也開始跑了起來,一個(gè)是 kflushd/bdflush,另一個(gè)是 kswapd。只有這個(gè)init 是完全屬于 user 類的進(jìn)程, 后兩者是 kernel假借 process 進(jìn)程之名掛在進(jìn)程上。
init 有許多很重要的任務(wù),比如象啟動(dòng)getty(用于用戶登錄)、實(shí)現(xiàn)運(yùn)行級(jí)別、以及處理孤立進(jìn)程。init 一開始就去讀 /etc/inittab (init初始化表),初始化表是按一定格式排列的關(guān)于進(jìn)程運(yùn)行時(shí)的有關(guān)信息的。init程序需要讀取/etc/inittab文件作為其行為指針。這個(gè) inittab 中對(duì)于各個(gè)runlevel運(yùn)行級(jí)別要跑哪些 rc 或 spawn 生出什么有很清楚的設(shè)定。
評(píng)論