新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > uclinux啟動過程詳細分析

        uclinux啟動過程詳細分析

        作者: 時間:2018-08-31 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201808/388126.htm

        **************************************************************************

        RamDisk有三種實現方式。

        在Linux中可以將一部分內存mount為分區來使用,通常稱之為RamDisk,分為:

        Ramdisk, ramfs, tmpfs。

        ① 第一種就是傳統意義上的,可以格式化,然后加載。這在Linux內核2.0/2.2就已經支持,其不足之處是大小固定,之后不能改變。為了能夠使用 Ramdisk,我們在編譯內核時須將block device中的Ramdisk支持選上,它下面還有兩個選項,一個是設定Ramdisk的大小,默認是4096k;另一個是initrd的支持。

        如果對Ramdisk的支持已經編譯進內核,我們就可以使用它了:首先查看一下可用的RamDisk,使用 ls /dev/ram*;首先創建一個目錄,比如test,運行 mkdir /mnt/test;然后對/dev/ram0 創建文件系統,運行 mke2fs /dev/ram0;最后掛載/dev/ram0,運行mount /dev/ram /mnt/test,就可以象對普通硬盤一樣對它進行操作了。

        ② 另兩種則是內核2.4才支持的,通過Ramfs或者Tmpfs來實現:它們不需經過格式化,用起來靈活,其大小隨所需要的空間而增加或減少。

        Ramfs顧名思義是內存文件系統,它處于虛擬文件系統(VFS)層,而不像ramdisk那樣基于虛擬在內存中的其他文件系統(ex2fs)。因而,它無需格式化,可以創建多個,只要內存足夠,在創建時可以指定其最大能使用的內存大小。

        如果你的Linux已經將Ramfs編譯進內核,你就可以很容易地使用Ramfs了。創建一個目錄,加載Ramfs到該目錄即可:

        # mkdir /testRam # mount -t ramfs none /testRAM缺省情況下,Ramfs被限制最多可使用內存大小的一半。可以通過maxsize(以kbyte為單位)選項來改變。

        # mount -t ramfs none /testRAM -o maxsize=2000 (創建了一個限定最大使用內存為2M的ramdisk)③ Tmpfs是一個虛擬內存文件系統,它不同于傳統的用塊設備形式來實現的Ramdisk,也不同于針對物理內存的Ramfs。

        Tmpfs 可以使用物理內存,也可以使用交換分區。在Linux內核中,虛擬內存資源由物理內存(RAM)和交換分區組成,這些資源是由內核中的虛擬內存子系統來負 責分配和管理。Tmpfs向虛擬內存子系統請求頁來存儲文件,它同Linux的其它請求頁的部分一樣,不知道分配給自己的頁是在內存中還是在交換分區中。同Ramfs一樣,其大小也不是固定的,而是隨著所需要的空間而動態的增減。

        使用tmpfs,首先你編譯內核時得選擇“虛擬內存文件系統支持(Virtual memory filesystem support)”。然后就可以加載tmpfs文件系統了:

        # mkdir -p /mnt/tmpfs

        # mount tmpfs /mnt/tmpfs -t tmpfs

        同樣可以在加載時指定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文件系統時,讀MS-DOS文件系統的superblock,函數fat_read_super中輸出的上面的信息。

        UMSDOS: msdos_read_super failed, mount aborted.

        UMSDOS:一種文件系統,特點容量大 但相對而言不大穩定。是Linux 使用的擴展了的DOS文件系統。它在 DOS 文件系統下增加了長文件名、 UID/GID、POSIX 權限和特殊文件 (設備、命名管道等)功能,而不犧牲對 DOS 的兼容性。允許一個普通的msdos文件系統用于Linux,而且無須為它建立單獨的分區,特別適合早期的硬盤空間不足的硬件條件。

        VFS: Mounted root (romfs filesystem) readonly

        虛擬文件系統VFS(Virtual Filesystem Switch)的輸出信息。

        再 次強調一下一個概念。VFS 是一種軟件機制,也可稱它為 Linux 的文件系統管理者,它是用來管理實際文件系統的掛載點,目的是為了能支持多種文件系統。kernel會先在內存中建立一顆 VFS 目錄樹,是內存中的一個數據對象,然后在其下掛載rootfs文件系統,還可以掛載其他類型的文件系統到某個子目錄上。

        Mounted devfs on /dev

        加載devfs設備管理文件系統到dev安裝點上。/dev是我們經常會用到的一個目錄。在2.4的kernel中才有使用到。每次啟動時內核會自動掛載devfs。

        devfs 提供了訪問內核設備的命名空間。它并不是建立或更改設備節點,devfs只是為你的特別文件系統進行維護。一般我們可以手工mknod創件設備節點。 /dev目錄最初是空的,里面特定的文件是在系統啟動時、或是加載模組后驅動程序載入時建立的。當模組和驅動程序卸載時,文件就消失了。

        Freeing init memory: 72K

        釋放1號用戶進程init所占用的內存

        *************************************************************

        第三節:加載linux內核完畢,轉入_idle進程

        系統啟動過程中進程情況:

        ① init進程

        一 般來說, 系統在跑完 kernel bootstrapping 內核引導自舉后(被裝入內存、已經開始運行、已經初始化了所有的設備驅動程序和數據結構等等), 就去運行 init『萬process之父』, 有了它, 才能開始跑其他的進程,因此,init進程,它是內核啟動的第一個用戶級進程,它的進程號總是1。你可以用進程查看命令來驗證:

        # 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 有兩個 kernel 類的 process 也開始跑了起來,一個是 kflushd/bdflush,另一個是 kswapd。只有這個init 是完全屬于 user 類的進程, 后兩者是 kernel假借 process 進程之名掛在進程上。

        init 有許多很重要的任務,比如象啟動getty(用于用戶登錄)、實現運行級別、以及處理孤立進程。init 一開始就去讀 /etc/inittab (init初始化表),初始化表是按一定格式排列的關于進程運行時的有關信息的。init程序需要讀取/etc/inittab文件作為其行為指針。這個 inittab 中對于各個runlevel運行級別要跑哪些 rc 或 spawn 生出什么有很清楚的設定。



        關鍵詞: uClinux cpu 控制器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 石嘴山市| 额济纳旗| 临沧市| 东兰县| 额尔古纳市| 阜阳市| 永宁县| 砀山县| 浮梁县| 阜南县| 禹州市| 保康县| 青川县| 监利县| 惠东县| 彭泽县| 靖安县| 阿拉善右旗| 鄱阳县| 容城县| 措勤县| 东明县| 武邑县| 台南市| 衡南县| 巴林左旗| 武平县| 延安市| 巴彦县| 隆林| 台前县| 南郑县| 柳林县| 兴山县| 莎车县| 吉木乃县| 明水县| 谷城县| 灌阳县| 营山县| 邻水|