日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

【移植Linux 3.4.2内核第三步】从0制作支持新内核的文件系统

發(fā)布時(shí)間:2023/12/10 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【移植Linux 3.4.2内核第三步】从0制作支持新内核的文件系统 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(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目錄:

cp /work/tools/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -d (-d代表原來(lái)是鏈接文件,拷貝過(guò)來(lái)之后還是鏈接文件)

還有一個(gè)庫(kù)需要添加:
在/work/nfs_root/fs_mini_mdev_new/usr目錄下創(chuàng)建一個(gè)lib目錄,然后把編譯器中的usr/lib目錄下的庫(kù)拷貝過(guò)來(lái):

cp /work/tools/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /work/nfs_root/fs_mini_mdev_new/usr/lib -d

庫(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)容如下:

# /etc/inittab ::sysinit:/etc/init.d/rcS console::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r

3.2創(chuàng)建etc/init.d/rcS文件
這是一個(gè)腳本問(wèn)價(jià),可以在里面添加想自動(dòng)執(zhí)行的命令。以下命令配置IP地址、掛接/etc/fstab指定的文件系統(tǒng)。

#!/bin/sh ifconfig eth0 192.168.1.104 mount -a

其中:
第一行表示這是一個(gè)腳本文件,運(yùn)行時(shí)使用/bin/sh解析。
第三行掛接/etc/fstab文件指定的所有文件系統(tǒng)。
最后還要更改它的屬性,使它能夠執(zhí)行:

chmod +x etc/init.d/rcS

3.3、創(chuàng)建etc/fstab文件
內(nèi)容如下,表示執(zhí)行“mount -a”命令后將掛接proc、tmpfs文件系統(tǒng)

# device mount-point type options dump fsck orderproc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 /etc/fstab 文件被用來(lái)定義文件系統(tǒng)的“靜態(tài)信息”,這些信息被用來(lái)控制mount命令的行為(詳細(xì)信息參考《嵌入Linux應(yīng)用開(kāi)發(fā)完全手冊(cè)》,這里不做詳細(xì)解釋)。

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的修改:

# device mount-point type options dump fsck orderproc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tempfs /dev tempfs defaults 0 0

*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 3

5.構(gòu)建其他目錄
其他目錄可以是空目錄,如下:

mkdir proc mnt sys root

現(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。