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