【移植Linux 3.4.2内核第三步】从0制作支持新内核的文件系统
學(xué)習(xí)交流加
- 個(gè)人qq:
1126137994 - 個(gè)人微信:
liu1126137994 - 學(xué)習(xí)交流資源分享qq群:
962535112
上一篇文章,我們修改了內(nèi)核代碼改了系統(tǒng)的分區(qū),但是最后啟動(dòng),發(fā)現(xiàn)雖然我們可以掛載之前的文件系統(tǒng),但是無(wú)法啟動(dòng)init進(jìn)程。說(shuō)明我們新移植的內(nèi)核不支持我們之前制作的老的文件系統(tǒng)(點(diǎn)擊查看上一篇文件:上一篇文章)。今天我們來(lái)制作新的文件系統(tǒng)。
我們用的是哪一個(gè)編譯器編譯的內(nèi)核,就用哪一個(gè)編譯器編譯文件系統(tǒng)的應(yīng)用程序:
1.編譯Busybox
獲取busybox源碼1.20.0版本的(下載地址:下載地址),把下載好的源碼拿到Linux系統(tǒng)解壓,進(jìn)入到源碼目錄:
然后直接:
make menuconfig (交叉編譯)
出現(xiàn)如下界面:
選擇:
Busybox Settings —>
Build Options —>
Cross Compiler prefix (NEW)
然后會(huì)出現(xiàn)可以輸入的橫條,在里面輸入我們的編譯器的前綴:
配置好后,退出保存保存配置。
然后直接輸入:
make (編譯)
編譯完成后,我們把它安裝到/work/nfs_root目錄下,進(jìn)入到這個(gè)目錄,建立一個(gè)目錄:
mkdir fs_mini_mdev_new (新的文件系統(tǒng)目錄)
然后切換到busybox目錄,進(jìn)行安裝(安裝命令可以查看README):
make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new
第一步已經(jīng)完成,busybox已經(jīng)安裝好,下一步是安裝庫(kù)。
2.安裝庫(kù)
我們查看到我們的編譯工具的路徑:
echo $PATH
得知編譯工具的路徑為:
/work/tools/usr/local/arm/4.3.2/bin
進(jìn)入到這個(gè)目錄
/work/tools/usr/local/arm/4.3.2
輸入find -name lib
找到很多庫(kù)如下:
用到的庫(kù)只有這兩個(gè):
./arm-none-linux-gnueabi/libc/armv4t/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/lib
我們只需要把這兩個(gè)庫(kù)拷貝過(guò)來(lái)就行:
先在fs_mini_mdev_new目錄下建立以lib目錄:
然后把/work/tools/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib目錄下的所有.so文件拷貝到fs_mini_mdev_new目錄下的lib目錄:
還有一個(gè)庫(kù)需要添加:
在/work/nfs_root/fs_mini_mdev_new/usr目錄下創(chuàng)建一個(gè)lib目錄,然后把編譯器中的usr/lib目錄下的庫(kù)拷貝過(guò)來(lái):
庫(kù)已經(jīng)添加完了,接下來(lái)是構(gòu)造一些其他目錄(etc,dev目錄等):
3.構(gòu)造etc目錄:
3.1創(chuàng)建etc/inittab文件
在/work/nfs_root/fs_mini_mdev_new目錄下,創(chuàng)建inittab文件,里面內(nèi)容如下:
3.2創(chuàng)建etc/init.d/rcS文件
這是一個(gè)腳本問(wèn)價(jià),可以在里面添加想自動(dòng)執(zhí)行的命令。以下命令配置IP地址、掛接/etc/fstab指定的文件系統(tǒng)。
其中:
第一行表示這是一個(gè)腳本文件,運(yùn)行時(shí)使用/bin/sh解析。
第三行掛接/etc/fstab文件指定的所有文件系統(tǒng)。
最后還要更改它的屬性,使它能夠執(zhí)行:
3.3、創(chuàng)建etc/fstab文件
內(nèi)容如下,表示執(zhí)行“mount -a”命令后將掛接proc、tmpfs文件系統(tǒng)
4.構(gòu)建dev目錄
該目錄下存放的是設(shè)備文件。設(shè)備文件是Linux系統(tǒng)中特有的文件類(lèi)型,在Linux系統(tǒng)下,以文件的方式訪問(wèn)各種外設(shè),即通過(guò)讀寫(xiě)某個(gè)設(shè)備文件來(lái)操作某個(gè)具體硬件。比如通過(guò)“/dev/ttySAC0”文件可以操作串口0,通過(guò)“/dev/mtdblock1”可以訪問(wèn)MTD設(shè)備(NAND Flash、NOR Flash等)的第二個(gè)分區(qū)。
/dev的創(chuàng)建有3種方法。
(1)手動(dòng)創(chuàng)建
在制作根文件系統(tǒng)的時(shí)候,就在/dev目錄下創(chuàng)建需要操作的設(shè)備文件比如ttySAC0等。系統(tǒng)掛接根文件系統(tǒng)后,就可以使用/dev目錄下的設(shè)備文件了。
(2)使用devfs文件系統(tǒng):這種方法已經(jīng)過(guò)時(shí)
(3)使用udev
udev是一個(gè)用戶(hù)程序,它能夠根據(jù)系統(tǒng)中硬件設(shè)別的狀態(tài)更新設(shè)備文件,包括設(shè)備文件的創(chuàng)建、刪除等。
使用udev機(jī)制也不需要在/dev目錄下創(chuàng)建設(shè)備節(jié)點(diǎn),它需要一些用戶(hù)程序的支持,并且內(nèi)核要支持sysfs文件系統(tǒng)。它的操作比較復(fù)雜,但是靈活性比較高。
在busybox中,有一個(gè)mdev命令,它是udev命令的簡(jiǎn)化版。
那么我們就使用mdev來(lái)創(chuàng)建設(shè)備文件
要在內(nèi)核啟動(dòng)時(shí)自動(dòng)運(yùn)行mdev,需要修改etc/fstab文件來(lái)自動(dòng)掛載文件系統(tǒng)、修改etc/init.d/rcS文件加入要自動(dòng)運(yùn)行的命令。
*etc/fstab的修改:
*etcinit.d/rcS的修改:
#!/bin/sh ifconfig eth0 192.168.1.104 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s另外,mdev是通過(guò)init進(jìn)程來(lái)啟動(dòng)的,在使用mdev構(gòu)造/dev目錄之前,init進(jìn)程至少要用到的設(shè)備文件為/dev/console和/dev/null,所以要建立這兩個(gè)文件:
mkdir dev cd dev sudo mknod console c 5 1 sudo mknod null c 1 35.構(gòu)建其他目錄
其他目錄可以是空目錄,如下:
現(xiàn)在我們的/work/nfs_root/fs_mini_mdev_new目錄下就是一個(gè)非常小的根文件系統(tǒng)。開(kāi)發(fā)板可以將它作為網(wǎng)絡(luò)根文件系統(tǒng)直接啟動(dòng)。如果要燒寫(xiě)進(jìn)開(kāi)發(fā)板,還要將它制作為一個(gè)文件,稱(chēng)為映像文件。
6.制作文件系統(tǒng)映像文件
接下來(lái),我們來(lái)制作文件系統(tǒng)的映像文件:
6.1首先需要編譯制作jffs2映像文件的工具(具體源碼可以自行下載,也可以加我q1126137994問(wèn)起要)
在我的Linux系統(tǒng)目錄/work/tools/mtd-utils-05.07.23.tar.bz2是MTD設(shè)備的工具包,編譯它生成mkfs.jffs2工具,用它來(lái)將一個(gè)目錄制作成jffs2文件系統(tǒng)映像文件。
這個(gè)工具包需要zlib壓縮包,先安裝zlib。在我的目錄/work/GUI/xwindow/X/deps下有zlib源碼zlib-1.2.3.tar.gz,執(zhí)行以下命令進(jìn)行安裝:
cd /work/GUI/xwindow/X/deps
tar xzf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --shared --prefix=/usr
make
sudo make install
然后編譯mkfs.jffs2
cd /work/tools
tar xjf mtd-utils-05.07.23.tar.bz2
cd mtd-utils-05.07.23/util
make
sudo make install
6.2制作jffs2映像文件
使用如下命令:
cd /work/nfs_root/fs_mini_dev_new (這是我自己的目錄,根據(jù)個(gè)人的不同進(jìn)入到不同的目錄)
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_newlyy.jffs2
上面-n 表示不要在每個(gè)擦除塊上都加上清楚標(biāo)志,-s 2018 表示我們的NAND Flash的一頁(yè)的大小為2048字節(jié),-e 128KiB 表示一個(gè)擦除快大小為128KiB ,-d 表示根文件系統(tǒng)的目錄,-o表示輸出的文件。
好了,文件系統(tǒng)制作完畢了。下面我們來(lái)燒寫(xiě)系統(tǒng):
nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev_newlyy.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new
bootm 32000000
串口打印,可以正常啟動(dòng)了,整個(gè)系統(tǒng)終于跑起來(lái)了,哈哈哈:
完美!!!費(fèi)了這么大的功夫,終于搞定了這個(gè)文件系統(tǒng)的制作,還好沒(méi)有出現(xiàn)什問(wèn)題。
注釋:
在視頻教程中,出現(xiàn)了錯(cuò)誤:Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000200。
分析這個(gè)錯(cuò)誤:在內(nèi)核中搜索字符串:exitcode,通過(guò)函數(shù)層層調(diào)用的分析,最終找到:do_exit(SIGKILL);執(zhí)行了這個(gè)調(diào)用,才出現(xiàn)錯(cuò)誤代碼4,原因是編譯內(nèi)核用的編譯工具是eabi接口的,我們需要重新配置內(nèi)核使用EABI接口:
在內(nèi)核目錄下輸入:
make meniconfig
然后依次選擇:
Kernel Features —>
[*] Use the ARM EABI to compile the kernel
這下應(yīng)該就完全沒(méi)有問(wèn)題了,內(nèi)核配置好后,重新編譯燒寫(xiě)啟動(dòng),就OK啦!!!!
想一起探討以及獲得各種學(xué)習(xí)資源加我(有我博客中寫(xiě)的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關(guān)于嵌入式,操作系統(tǒng),C++語(yǔ)言,C語(yǔ)言,數(shù)據(jù)結(jié)構(gòu)等技術(shù)問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的【移植Linux 3.4.2内核第三步】从0制作支持新内核的文件系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 028_adblock
- 下一篇: Springboot拼接实体类里面的UR