linux4.10.8 內核移植(二)---初步裁剪、分區修改和文件系統
一、初步裁剪
在內核根目錄下 執行: make menuconfig
1.1 system type裁剪
選擇 SAMSUNG S3C24XX SoCs Support 進入其中,這裏是配置我們的單板,取消與2440無關的配置:
1.2 文件系統裁剪
以模塊加入的可以保留,其他的看情況進行裁剪。
1.3 device driver裁剪
裏面有些驅動不是我們所需要的,我們的目標板根本不支持那些的功能就可以裁剪掉:
1.3.1 Network device support
USB適配器我們並不支持,去掉。
進入 Ethernet driver support:
裏面除了DM9000的支持,基本上全都可以去掉:
網絡設備驅動基本上完了
1.3.2 Sound card support
聲卡支持。
設備上沒有聲卡,全部去掉
1.3.3 HID bus support
這個應該是鼠標鍵盤之類的,而且單板上也沒有HID總線,改成模塊加入。
基本上就先改動這些,燒寫一遍,查看下,然後根據打印的信息進行裁剪配置。
二、分區修改
裁剪出來的差不多2M左右
裝入板子中,發現了很多錯
首先就是磁盤分區問題,磁盤分區和在u-boot中的分區不一致。
這個分區雖然也是256M的總大小,但是和我們在u-boot中的分區差別很打。
由這裏看出,我們的磁盤分區是有問題的,
搜索 u-boot,定位代碼:
Mach-mini2440.c (arch\arm\mach-s3c24xx)
修改代碼的 mtd_partiton 結構:
1 static struct mtd_partition mini2440_default_nand_part[] __initdata = {
2 [0] = {
3 .name = "u-boot",
4 .size = SZ_256K,
5 .offset = 0,
6 },
7 [1] = {
8 .name = "params",
9 .size = SZ_128K,
10 .offset = MTDPART_OFS_APPEND,
11 },
12 [2] = {
13 .name = "kernel",
14 /* 5 megabytes, for a kernel with no modules
15 * or a uImage with a ramdisk attached */
16 .size = SZ_2M,
17 .offset = MTDPART_OFS_APPEND,
18 },
19 [3] = {
20 .name = "rootfs",
21 .offset = MTDPART_OFS_APPEND,
22 .size = MTDPART_SIZ_FULL,
23 },
24 };
編譯內核,燒寫測試:
nand分區已經改過來了。
三、文件系統
燒錄進去的內核系統還有如下錯誤:
1 VFS: Cannot open root device "dev/mtdblock3" or unknown-block(0,0): error -6
2 Please append a correct "root=" boot option; here are the available partitions:
3 0100 4096 ram0
4 (driver?)
5 0101 4096 ram1
6 (driver?)
7 0102 4096 ram2
8 (driver?)
9 0103 4096 ram3
10 (driver?)
11 0104 4096 ram4
12 (driver?)
13 0105 4096 ram5
14 (driver?)
15 0106 4096 ram6
16 (driver?)
17 0107 4096 ram7
18 (driver?)
19 0108 4096 ram8
20 (driver?)
21 0109 4096 ram9
22 (driver?)
23 010a 4096 ram10
24 (driver?)
25 010b 4096 ram11
26 (driver?)
27 010c 4096 ram12
28 (driver?)
29 010d 4096 ram13
30 (driver?)
31 010e 4096 ram14
32 (driver?)
33 010f 4096 ram15
34 (driver?)
35 1f00 256 mtdblock0
36 (driver?)
37 1f01 128 mtdblock1
38 (driver?)
39 1f02 2048 mtdblock2
40 (driver?)
41 1f03 256640 mtdblock3
42 (driver?)
43 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
原先在u-boot移植中,裏面燒錄的是yaffs文件系統,可以查看.config文件,看看是否支持 yaffs,搜索不到此項。但是支持jffs2文件系統:
3.1 移植jffs2 文件系統
jffs2文件系統的制作如下:http://www.cnblogs.com/kele-dad/p/7096273.html
燒錄進去之後,有提示錯誤:init 進程被殺死。
定位代碼到 exit.c(kernel/) 函數中
此條打印是在函數:find_child_reaper 中。
1 do_exit(code)
2 exit_notify(tsk, group_dead);
3 forget_original_parent(tsk, &dead);
4 reaper = find_new_reaper(father, reaper);
層層調用,最頂上的是 do_exit,搜索此調用:
我們的內核打印的是殺死init進程,錯誤碼為 4
我們可以通過 SIGKILL 查找到 4號錯誤碼是SIGILL。
致命信號4(SIGILL):執行了非法指令. 通常是因為可執行文件本身出現錯誤, 或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號。
我們使用的 編譯器後綴為 gnueabi,使用的是eabi接口。內核也要支持此接口。
make menuconfig
然後在 kernel feature 中選上下面的選項:
保存,退出,編譯內核,燒寫文件系統和內核:
內核已經正常啟動了。
3.2 移植yaffs 文件系統
linux 4.10.8 並不支持yaffs文件系統,要去 yaffs的官網去下載yaffs的源碼
獲取源碼:git clone git://www.aleph1.co.uk/yaffs2
yaffs2就是源碼。
在源碼的 README-linux-patch 文件中已經說明了,如何將 yaffs安裝進linux 內核中去
執行打補丁命令:
進入內核,查看fs 目錄下的文件:
yaffs2已經安裝進去
執行 make menuconfig 命令,搜索yaffs 可以看到yaffs 配置在哪裏。
進入選項中進行配置:
選上。然後選擇默認配置即可。
編譯調試:
有一個提醒,result 未初始化。
查看源碼可以知道,result 並未賦值,想取消這個提醒,可以初始化一下result,設置result 量,不過首先要知道 YAFFS_OK 配置的值是多少。搜索一下 YAFFS_OK。
可以看到 YAFFS_OK 定義為1,那麽我們可以定義 result = 0。改變後,再次編譯。
已經沒有任何錯誤了。
然後制作yaffs 文件系統:http://www.cnblogs.com/kele-dad/p/7105075.html
第一次制作有點小問題,因為使用的是u-boot 2016 ,所以當初的修改沒完善,要修改u-boot。
修改636行,加入換色部分的代碼。
至此文件系統修改完成。
linux4.10.8 內核移植(二)---初步裁剪、分區修改和文件系統