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行,加入换色部分的代码。

  至此文件系统修改完成。

  

  

 

  

 

转载于:https://www.cnblogs.com/kele-dad/p/7086929.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习 Linux 内核移植裁剪需要具备一定的 Linux 系统和 C 语言编程的基础。以下是一些学习 Linux 内核移植裁剪的步骤和建议: 1.了解 Linux 内核的基础知识:了解 Linux 内核的基本概念、架构、驱动模型、系统调用等,可以参考《深入理解 Linux 内核》等书籍。 2.熟悉交叉编译工具链:由于嵌入式设备的处理器架构和主机 PC 的处理器架构不一致,需要使用交叉编译工具链来生成针对目标平台的可执行文件和内核映像。 3.学会配置内核:掌握内核配置的基本方法,包括使用 make menuconfig、make xconfig、make defconfig 等命令进行内核配置,了解各个配置选项的含义和作用。 4.学习设备树(Device Tree):设备树是一种描述硬件信息的数据结构,用于在 Linux 内核中描述嵌入式设备的硬件信息,学习设备树可以帮助我们更好地理解和移植 Linux 内核。 5.掌握内核编译和调试方法:学习内核编译和调试方法,包括编译内核、生成内核映像、烧写内核映像到设备、使用 GDB 调试等。 6.了解裁剪方法:学习如何利用内核配置选项和设备树进行内核裁剪,去掉不需要的功能,减小内核映像的大小。 7.实践和调试:最后需要通过实践和调试来加深对 Linux 内核移植裁剪的理解,可以通过移植内核到一些嵌入式开发板或者虚拟机中进行练习。 总之,学习 Linux 内核移植裁剪需要进行理论和实践相结合的学习方法,需要花费一定的时间和精力,但是掌握了这些技能后,可以更好地适应不同的嵌入式开发场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值