目录

1 问题一:内核移植时MTD分区问题

2 问题二:uboot的MTDPARTS_DEFAULT定义的MTD分区,bootargs中的文件系统分区,内核的mtd_partition smdk_default_nand_part定义的分区,三者要对应起来

3 问题三:uboot不再传tag地址了,那内核怎么知道bootargs的

4 问题四:内核是怎么解析uboot传过来的tags地址或者设备树地址的

5 问题五:linux内核官网的疑问

6 下载内核源码

7 安装交叉编译工具链

8 修改顶层Makefile

9 修改时钟频率

10 修改MTD分区

11 关闭软件ECC校验

12 支持yaffs文件系统

13 支持设备树

14 配置内核

14.1 make s3c2410_defconfig

14.2 make menuconfig

15 编译内核和设备树文件

16 下载内核

17 end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b

18 编译4.0.1内核

18.1 error: 'struct file' has no member named 'f_dentry'

18.2 Warning: Neither atags nor dtb found

18.3 end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004


在移植linux内核之前,我先把韦老师的开发手册过了一遍,发现了好几个不太明白的问题,先把这些问题都弄明白再移植。

1 问题一:内核移植时MTD分区问题

Linux开发手册上,内核移植MTD分区那里,0地址保存的竟然是kernel,我记得之前0地址不都是保存的bootloader吗,

看到这里不理解,如果0地址保存的是kernel,那不是把bootloader覆盖了吗,搞不懂,一直没弄懂怎么回事,直到我往前翻,看到了uboot移植的介绍那里,我发现了这个

原来韦老师是把bootloader放到了norflash里面,怪不得nandflash的0就直接放kernel,因为我是先移植内核,先看的内核移植部分,所以没看到这里。 不过我移植内核的时候不会按老师这种方式做,我还是nandflash的0地址先放bootloader。

2 问题二:uboot的MTDPARTS_DEFAULT定义的MTD分区,bootargs中的文件系统分区,内核的mtd_partition smdk_default_nand_part定义的分区,三者要对应起来

这个是什么意思呢,就是uboot中有分区定义,如下

#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \"128k(device_tree)," \"128k(params)," \"4m(kernel)," \"-(root)"

这里uboot定义的是前面256k存放bootloader,然后接下来128k存放的是设备树,然后接下来128k存放的是参数,然后接下来4m保存的是内核,后面的是文件系统。

那么bootargs里面,root赋值就要是 root=/dev/mtdblock4

bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";

然后内核中 就要这么定义,

static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name    = "bootloader",.size    = SZ_256K,.offset   = 0,},[1] = {.name  = "device_tree",.offset = MTDPART_OFS_APPEND,.size  = SZ_128K,},[2] = {.name    = "params",.offset = MTDPART_OFS_APPEND,.size   = SZ_128K,},[3] = {.name    = "kernel",.offset = MTDPART_OFS_APPEND,.size   = SZ_4M,},[4] = {.name  = "rootfs",.offset  = MTDPART_OFS_APPEND,.size  = MTDPART_SIZ_FULL,}};

3 问题三:uboot不再传tag地址了,那内核怎么知道bootargs的

我看了韦老师的设备树里面用的uboot,他那里的uboot在调用theKernel的时候,第三个参数传进来的是设备树文件的地址,并没有传启动参数的保存地址也就是tag地址,那么内核怎么得到bootargs那些参数呢,这个问题也没想明白,在技术群里问了下,他们说可能是启动参数直接放设备树里面了,于是我去看了下设备树,在设备树中找到了下面一行,

    chosen {bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";};

原来是把启动参数放到设备树里面了。

但是,看了下新版的uboot源码,其实新版里面是可以传tag,也可以传设备树文件地址。新版源码如下图,

而韦老师是因为用的老版的uboot,但是又想在老板uboot里面支持设备树,所以韦老师修改如下

    theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);+    /* 100ask for device tree, no initrd image used */
+   if (argc == 4) {
+       of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16);
+
+       if  (be32_to_cpu(*(ulong *)of_flat_tree) == OF_DT_HEADER) {
+           printf ("\nStarting kernel with device tree at 0x%x...\n\n", of_flat_tree);
+
+           cleanup_before_linux ();
+           theKernel (0, bd->bi_arch_number, of_flat_tree);
+
+       } else {
+           printf("Bad magic of device tree at 0x%x!\n\n", of_flat_tree);
+       }
+
+   }
+

如果参数等于4就把设备树地址传给内核,这是因为使用设备树时候,我们输入的bootm命令是4个参数。

bootm <uImage_addr>                            // 无设备树,bootm 0x30007FC0
bootm <uImage_addr> <initrd_addr> <dtb_addr>   // 有设备树

另外还一个问题就是在使用设备树的时候,如果也还是传输过来了bootargs,那么bootargs的优先级更高,

从设备树(dtb格式数据)中解析出bootargs_dts bootargs_正在起飞的蜗牛的博客-CSDN博客

(1)内核启动参数bootargs保存在设备树的chosen节点的bootargs属性;
(2)bootargs数据可以是在dts源文件中定义,也可以是uboot启动内核时传递给内核;
(3)优先级:uboot传递的bootargs参数优先级高于dts中定义的bootargs;
(4)如果是uboot传递的bootargs,在内核解压缩阶段就会调用atags_to_fdt()函数将tag中的bootargs参数转换成dtb的格式,写进dtb数据中;

这时候内核用的应该是zImage-dtb格式:vmlinuz/vmlinux、Image、zImage与uImage的区别_vmlinux和uimage_正在起飞的蜗牛的博客-CSDN博客

4 问题四:内核是怎么解析uboot传过来的tags地址或者设备树地址的

之前老的uboot里面,调用theKernel函数的时候,第三参数是tag地址也就是bootargs的那些地址,但是,新版的uboot里面,调用theKernel函数启动内核的时候,第三个参数可能是tags地址,也可能是设备树地址,那么内核肯定是两种方式都支持,那么是怎么支持的,这个我去看了下这一块的内核源码,先不看head.S了,直接去看start_kernel函数,

asmlinkage __visible void __init start_kernel(void)
{char *command_line;char *after_dashes;set_task_stack_end_magic(&init_task);smp_setup_processor_id();debug_objects_early_init();cgroup_init_early();local_irq_disable();early_boot_irqs_disabled = true;/** Interrupts are still disabled. Do necessary setups, then* enable them.*/boot_cpu_init();page_address_init();pr_notice("%s", linux_banner);setup_arch(&command_line);........//其他代码

然后看这里面的setup_arch函数,在arch/arm/kernel/setup.c里面,

void __init setup_arch(char **cmdline_p)
{const struct machine_desc *mdesc;setup_processor();/*这个__atags_pointer就是uboot穿进来的第三个参数,也就是tag地址或者设备树地址,然后这个setup_machine_fdt里面是对设备树是否有效,*/mdesc = setup_machine_fdt(__atags_pointer);if (!mdesc)mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);//上面判断设备树无效,那说明穿进来的就是tag地址了。那么解析tag。if (!mdesc) {early_print("\nError: invalid dtb and unrecognized/unsupported machine ID\n");early_print("  r1=0x%08x, r2=0x%08x\n", __machine_arch_type,__atags_pointer);if (__atags_pointer)early_print("  r2[]=%*ph\n", 16,phys_to_virt(__atags_pointer));dump_machine_table();}machine_desc = mdesc;

这里面首先是setup_machine_fdt函数,在这个setup_machine_fdt函数里面调用early_init_dt_verify函数判断是否是有效的设备树,然后再解析设备树。

/*** setup_machine_fdt - Machine setup when an dtb was passed to the kernel* @dt_phys: physical address of dt blob** If a dtb was passed to the kernel in r2, then use it to choose the* correct machine_desc and to setup the system.*/
const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
{const struct machine_desc *mdesc, *mdesc_best = NULL;#if defined(CONFIG_ARCH_MULTIPLATFORM) || defined(CONFIG_ARM_SINGLE_ARMV7M)DT_MACHINE_START(GENERIC_DT, "Generic DT based system").l2c_aux_val = 0x0,.l2c_aux_mask = ~0x0,MACHINE_ENDmdesc_best = &__mach_desc_GENERIC_DT;
#endifif (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys)))//判断是否有效的dtbreturn NULL;mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);if (!mdesc) {const char *prop;int size;unsigned long dt_root;early_print("\nError: unrecognized/unsupported ""device tree compatible list:\n[ ");dt_root = of_get_flat_dt_root();prop = of_get_flat_dt_prop(dt_root, "compatible", &size);while (size > 0) {early_print("'%s' ", prop);size -= strlen(prop) + 1;prop += strlen(prop) + 1;}early_print("]\n\n");dump_machine_table(); /* does not return */}/* We really don't want to do this, but sometimes firmware provides buggy data */if (mdesc->dt_fixup)mdesc->dt_fixup();early_init_dt_scan_nodes();

如果early_init_dt_verify函数判断不是有效的设备树,那么就调用setup_machine_tags函数,把第三个参数当成tag地址来解析,总结一下就是

setup_arch        setup_machine_fdtif (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys)))//判断是否有效的dtbearly_init_dt_scan_nodes();mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);前面的没成立,那么说明传进来的不是设备树文件地址,而是启动参数的tag地址,那么这里是直接解析tag参数了,

5 问题五:linux内核官网的疑问

The Linux Kernel Archives

当我登录linux内核官网后,这里tarball是下载源码,然后后面我发现了两个东西patch和inc.patch,然后我鼠标放到patch提示Download patch to previous mainline,然后鼠标放到inc.patch提示Download incremental patch,搞不懂这两个有什么区别,然后我下载inc.patch发现名字是这样的patch-5.10.169-170.xz,那么这个应该是说5.10.169到5.10.170的补丁,但是patch是啥,在技术交流群里问了下,别人跟我说linux的主版本号,我还是不懂,然后我去查了下linux版本号问题,例如5.10.170.21吧,5.10是主版本好,170是次版本号,然后21是扩展版本号,所以这里的patch:Download patch to previous mainline意思是5.10.170针对5.10增加的补丁文件,好,懂了。

然后还一个就是官网主页只显示了几个内核版本,其他版本在上面的那个Http:Index of /pub/

6 下载内核源码

我去The Linux Kernel Archives

这里不下载最新的了,就用4.19.275吧,下载完之后用下面的命令解压。

xz -d linux-4.19.275.tar.xz
tar -xavf linux-4.19.275.tar

7 安装交叉编译工具链

这里用gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz,直接解压,然后设置环境变量就可以了,安装完之后我想看一下是否安装成功了,发现如下错误:

arm-linux-gcc --version
/usr/local/arm/4.3.2/bin/arm-linux-gcc: line 3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: No such file or directory

网上搜了下,这是因为操作系统是64位的,而交叉编译工具链是32位的,所以需要安装下面的包兼容32位。

sudo apt-get install lib32z1

8 修改顶层Makefile

这里修改交叉编译工具链

#ARCH      ?= $(SUBARCH)ARCH       ?= arm
CROSS_COMPILE   ?= arm-linux-gnueabi-

9 修改时钟频率

arch/arm/mach-s3c24xx/mach-smdk2440.c中将时钟频率修改为12M,

static void __init smdk2440_init_time(void)
{//s3c2440_init_clocks(16934400);s3c2440_init_clocks(12000000);samsung_timer_init();
}

10 修改MTD分区

arch/arm/mach-s3c24xx/common-smdk.c文件中,将代码

static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name    = "Boot Agent",.size    = SZ_16K,.offset    = 0,},[1] = {.name  = "S3C2410 flash partition 1",.offset = 0,.size = SZ_2M,},[2] = {.name  = "S3C2410 flash partition 2",.offset = SZ_4M,.size = SZ_4M,},[3] = {.name  = "S3C2410 flash partition 3",.offset   = SZ_8M,.size   = SZ_2M,},[4] = {.name  = "S3C2410 flash partition 4",.offset = SZ_1M * 10,.size    = SZ_4M,},[5] = {.name  = "S3C2410 flash partition 5",.offset   = SZ_1M * 14,.size  = SZ_1M * 10,},[6] = {.name = "S3C2410 flash partition 6",.offset   = SZ_1M * 24,.size  = SZ_1M * 24,},[7] = {.name = "S3C2410 flash partition 7",.offset = SZ_1M * 48,.size    = MTDPART_SIZ_FULL,}
};

修改为下面的代码

static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name    = "bootloader",.size    = SZ_256K,.offset   = 0,},[1] = {.name  = "device_tree",.offset = MTDPART_OFS_APPEND,.size  = SZ_128K,},[2] = {.name    = "params",.offset = MTDPART_OFS_APPEND,.size   = SZ_128K,},[3] = {.name    = "kernel",.offset = MTDPART_OFS_APPEND,.size   = SZ_4M,},[4] = {.name  = "rootfs",.offset  = MTDPART_OFS_APPEND,.size  = MTDPART_SIZ_FULL,}};

11 关闭软件ECC校验

修改arch/arm/mach-s3c24xx/common-smdk.c文件:

12 支持yaffs文件系统

Get Yaffs | Yaffs - A Flash File System for embedded use

yaffs官网上让用下面的命令下载

git clone git://www.aleph1.co.uk/yaffs2

然后需要运行文件系统里面的patch-ker.sh脚本文件,先./patch-ker.sh看一下使用说明

./patch-ker.sh
usage:  ./patch-ker.sh  c/l m/s kernelpathif c/l is c, then copy. If l then linkif m/s is m, then use multi version code. If s then use single version code

所以这里

13 支持设备树

这里移植内核的时候想把设备树也用上,然后参考了韦东山老师的设备树教程以及彭东林老师的这个博客:https://www.cnblogs.com/pengdonglin137/p/6241895.html

使用下面的设备树文件

// SPDX-License-Identifier: GPL-2.0
/** SAMSUNG SMDK2440 board device tree source** Copyright (c) 2018 weidongshan@qq.com* dtc -I dtb -O dts -o jz2440.dts jz2440.dtb*/#define S3C2410_GPA(_nr) ((0<<16) + (_nr))
#define S3C2410_GPB(_nr)    ((1<<16) + (_nr))
#define S3C2410_GPC(_nr)    ((2<<16) + (_nr))
#define S3C2410_GPD(_nr)    ((3<<16) + (_nr))
#define S3C2410_GPE(_nr)    ((4<<16) + (_nr))
#define S3C2410_GPF(_nr)    ((5<<16) + (_nr))
#define S3C2410_GPG(_nr)    ((6<<16) + (_nr))
#define S3C2410_GPH(_nr)    ((7<<16) + (_nr))
#define S3C2410_GPJ(_nr)    ((8<<16) + (_nr))
#define S3C2410_GPK(_nr)    ((9<<16) + (_nr))
#define S3C2410_GPL(_nr)    ((10<<16) + (_nr))
#define S3C2410_GPM(_nr)    ((11<<16) + (_nr))/dts-v1/;/ {model = "SMDK24440";compatible = "samsung,smdk2440";#address-cells = <1>;#size-cells = <1>;memory@30000000 {device_type = "memory";reg =  <0x30000000 0x4000000>;};
/*cpus {cpu {compatible = "arm,arm926ej-s";};};
*/  chosen {bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";};led {compatible = "jz2440_led";reg = <S3C2410_GPF(5) 1>;};
};

将上述文件命名为jz2440.dts,放到arm/boot/dts/jz2440.dts

那同时要修改设备树里面的Makefile,增加 dtb-$(CONFIG_ARCH_S3C2440) += jz2440.dtb

前面设备树文件中compatible = "samsung,smdk2440";

那么在内核arch/arm/mach-s3c24xx/mach-smdk2440.c文件中首先增加如下定义

14 配置内核

14.1 make s3c2410_defconfig

我们首先使用make s3c2410_defconfig生成.config,然后再用make  menuconfig图形化界面上微调。

make s3c2410_defconfig

然后发现报错

  HOSTCC  scripts/basic/fixdepHOSTCC  scripts/kconfig/conf.oYACC    scripts/kconfig/zconf.tab.c
/bin/sh: 1: bison: not found
scripts/Makefile.lib:196: recipe for target 'scripts/kconfig/zconf.tab.c' failed
make[1]: *** [scripts/kconfig/zconf.tab.c] Error 127
Makefile:557: recipe for target 's3c2410_defconfig' failed
make: *** [s3c2410_defconfig] Error 2

网上搜索发现用如下方法解决

sudo apt install bison flex

然后重新执行make s3c2410_defconfig,发现生成了.config,我们执行 make s3c2410_defconfig时所有配置项都被写到.config文件里面去了。

  YACC    scripts/kconfig/zconf.tab.cLEX     scripts/kconfig/zconf.lex.cHOSTCC  scripts/kconfig/zconf.tab.oHOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

14.2 make menuconfig

然后我们执行make menuconfig,make menuconfig其实会去读上面生成的.config文件,然后会出现一个菜单供我们选择。

make menuconfig

这里加一个菜单使用说明:改菜单截图自https://www.cnblogs.com/lifexy/p/7342031.html

这里首先要配置支持yaff2文件系统。

File systems  ---> [*] Miscellaneous filesystems  ---><*> yaffs2 file system support

然后再Boot options里面发现设备树默认是选上的。

15 编译内核和设备树文件

配置完成之后用下面命令编译

make uImage -j8

报错

  CALL    scripts/checksyscalls.shCHK     include/generated/compile.hKernel: arch/arm/boot/Image is readyKernel: arch/arm/boot/zImage is readyUIMAGE  arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
arch/arm/boot/Makefile:90: recipe for target 'arch/arm/boot/uImage' failed
make[1]: *** [arch/arm/boot/uImage] Error 1
arch/arm/Makefile:336: recipe for target 'uImage' failed
make: *** [uImage] Error 2

说明缺少 mkimage ,有两种解决办法:

  • 利用uboot生成mkimage工具,然后拷贝到/usr/bin 目录下
  • 输入 sudo apt-get install u-boot-tools 命令在线安装;

这里直接用

sudo apt-get install u-boot-tools

然后编译生成了uImage

  CALL    scripts/checksyscalls.shCHK     include/generated/compile.hKernel: arch/arm/boot/Image is readyKernel: arch/arm/boot/zImage is readyUIMAGE  arch/arm/boot/uImage
Image Name:   Linux-4.19.275
Created:      Thu Mar  9 13:45:42 2023
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    3661464 Bytes = 3575.65 KiB = 3.49 MiB
Load Address: 30108000
Entry Point:  30108000Kernel: arch/arm/boot/uImage is ready

然后还要编译设备树文件:

make dtbs

生成arch/arm/boot/dts/jz2440.dtb。

16 下载内核

然后把uImage下载到开发板中,启动,发现卡住了。。。。。


NAND read: device 0 offset 0x40000, size 0x20000Reading data from 0x5f800 -- 100% complete.131072 bytes read: OK
## Booting image at 30007fc0 ...Image Name:   Linux-4.19.275Created:      2023-03-09   6:59:04 UTCImage Type:   ARM Linux Kernel Image (uncompressed)Data Size:    3660816 Bytes =  3.5 MBLoad Address: 30108000Entry Point:  30108000Verifying Checksum ... OK
OKStarting kernel with device tree at 0x32000000...

我也不知道错在哪里了,我去内核中的init/main.c中增加打印,

然后重新make uImage -j8,把内核下载进去,然后启动发现能打印出来

这说明内核已经到了start_kernel函数了,那我再加打印试试,

这样打印也看不出来啥问题,网上其他人在2440上移植内核的时候,看着都很顺利,不过他们没移植设备树,那我得问题很可能是移植设备树,然后有个什么地方我没弄好,我又回去去看了韦老师和彭东林老师的教程和博客。然后我发现了韦老师内核中有个这样的修改,

上面那段英文注释翻译过来是:目前有两种驱动程序可以为三星soc提供GPIO支持。对于支持设备树的平台,使用了新的pinctrl-samsung驱动程序,提供了GPIO和引脚控制接口。对于遗留(非dt)平台,使用这个驱动程序。

因为韦老师用了设备树文件,所以不注释掉的话,检测到设备树文件后,下面的那些初始化直接就不做了,但是韦老师的设备树文件又非常简单不完整,所以应该是内核少做了很多初始化工作,我把我的内核源码中这一块也注释掉,果然内核起来了。

内核起来了,但是还有个错误

17 end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b

我在网上搜这个错误,看到这篇文章: ARM下Kernel panic - not syncing: Attempted to kill init!错误分析_chuanzhilong的博客-CSDN博客

他这里是构建根文件系统时用的交叉编译工具链版本问题,然后我这里同一个根文件系统,然后我下载韦老师的内核,就能启动,可见我这里不是根文件系统问题,而是我的内核编译的有点问题,那我要不更换个交叉编译工具链版本,重新编译内核试试,于是我用了之前编译瑞芯微rv1126程序的gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin交叉编译工具链,编译内核,下载,发现

然后发现报这种错误,我以为是网卡驱动的问题,因为内核移植的过程中确实没有修改网卡驱动,那我移植下网卡驱动看看,这里不自己写驱动,直接移植,修改/drivers/net/ethernet/davicom/目录下的dm9000的头文件和库文件,然后重新编译内核,下载。然后还是报下面的错误

然后那这个交叉编译工具链也不行,

然后去Downloads | GNU-A Downloads – Arm Developer

下载了gcc-arm-10.3-2021.07-x86_64-arm-none-eabi.tar.xz

解压,更改环境变量,重新编译内核,下载测试,还是同样的错误。

18 编译4.0.1内核

经过上面的操作,问题还是没解决,问题应该就是出在内核版本,文件系统版本,交叉编译工具链版本,由于我busybox用的是老版本,我想会不会我用的内核相对比busybox有点新,于是我下载个稍微老一点的版本4.0.1,下载完之后还是按照上面的修改分区,时钟频率,支持设备树,支持yaff2,反正就上面的一系列操作,然后编译,报错

18.1 error: 'struct file' has no member named 'f_dentry'

fs/yaffs2/yaffs_vfs.c: In function ‘yaffs_readpage_nolock’:
fs/yaffs2/yaffs_vfs.c:260:29: error: ‘struct file’ has no member named ‘f_dentry’#define Y_GET_DENTRY(f) ((f)->f_dentry)^
fs/yaffs2/yaffs_vfs.c:218:39: note: in definition of macro ‘yaffs_inode_to_obj_lv’#define yaffs_inode_to_obj_lv(iptr) ((iptr)->i_private)^
fs/yaffs2/yaffs_vfs.c:225:35: note: in expansion of macro ‘yaffs_inode_to_obj’#define yaffs_dentry_to_obj(dptr) yaffs_inode_to_obj((dptr)->d_inode)^
fs/yaffs2/yaffs_vfs.c:309:8: note: in expansion of macro ‘yaffs_dentry_to_obj’obj = yaffs_dentry_to_obj(Y_GET_DENTRY(f));^
fs/yaffs2/yaffs_vfs.c:309:28: note: in expansion of macro ‘Y_GET_DENTRY’obj = yaffs_dentry_to_obj(Y_GET_DENTRY(f));^
fs/yaffs2/yaffs_vfs.c: In function ‘yaffs_hold_space’:
fs/yaffs2/yaffs_vfs.c:260:29: error: ‘struct file’ has no member named ‘f_dentry’#define Y_GET_DENTRY(f) ((f)->f_dentry)^
fs/yaffs2/yaffs_vfs.c:218:39: note: in definition of macro ‘yaffs_inode_to_obj_lv’#define yaffs_inode_to_obj_lv(iptr) ((iptr)->i_private)^
fs/yaffs2/yaffs_vfs.c:225:35: note: in expansion of macro ‘yaffs_inode_to_obj’#define yaffs_dentry_to_obj(dptr) yaffs_inode_to_obj((dptr)->d_inode)^
fs/yaffs2/yaffs_vfs.c:507:8: note: in expansion of macro ‘yaffs_dentry_to_obj’obj = yaffs_dentry_to_obj(Y_GET_DENTRY(f));^
fs/yaffs2/yaffs_vfs.c:507:28: note: in expansion of macro ‘Y_GET_DENTRY’obj = yaffs_dentry_to_obj(Y_GET_DENTRY(f));^
fs/yaffs2/yaffs_vfs.c: In function ‘yaffs_release_space’:
fs/yaffs2/yaffs_vfs.c:260:29: error: ‘struct file’ has no member named ‘f_dentry’#define Y_GET_DENTRY(f) ((f)->f_dentry)^
fs/yaffs2/yaffs_vfs.c:218:39: note: in definition of macro ‘yaffs_inode_to_obj_lv’#define yaffs_inode_to_obj_lv(iptr) ((iptr)->i_private)^
fs/yaffs2/yaffs_vfs.c:225:35: note: in expansion of macro ‘yaffs_inode_to_obj’#define yaffs_dentry_to_obj(dptr) yaffs_inode_to_obj((dptr)->d_inode)^
fs/yaffs2/yaffs_vfs.c:525:8: note: in expansion of macro ‘yaffs_dentry_to_obj’obj = yaffs_dentry_to_obj(Y_GET_DENTRY(f));^
fs/yaffs2/yaffs_vfs.c:525:28: note: in expansion of macro ‘Y_GET_DENTRY’obj = yaffs_dentry_to_obj(Y_GET_DENTRY(f));^
fs/yaffs2/yaffs_vfs.c: In function ‘yaffs_file_write’:
fs/yaffs2/yaffs_vfs.c:260:29: error: ‘struct file’ has no member named ‘f_dentry’#define Y_GET_DENTRY(f) ((f)->f_dentry)

根据下面的文章,修改

https://www.cnblogs.com/ningci/p/5524473.html

然后内核编译通过,下载进去内核报错,

18.2 Warning: Neither atags nor dtb found

Warning: Neither atags nor dtb found

我还以为是没有设备树文件,然后make dtbs,发现并没有生成dtb文件,然后我看了下dtb文件的makefile

我在.config文件中搜到了CONFIG_ARCH_S3C2440,但是没搜到CONFIG_OF,于是make menuconfig中搜索看到确实没打开,怪不得没编译dtb文件。

于是把这一项选上

18.3 end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

然后重新编译内核,下载进去看到:end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

还是报错,并且错误返回码和之前不一样了,之前是0x0000000b,现在是0x00000004.

然后继续:启动新内核出现:Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004_Alen.Wang的博客-CSDN博客

然后重新编译内核下载进去,

终于起来了,吐血。。。。。。

参考文献

TQ2440(S3C2440)移植Linux-4.0.1内核全过程_觉皇不秃头的博客-CSDN博客

讓TQ2440也用上設備樹(1)

S3C2440 移植最新5.2linux内核

Linux设备树学习(三)uboot和Linux中的设备树移植

JZ2440支持设备树(1)-添加设备树之后kernel的启动参数跟dts里面不一致

Mini2440之linux内核移植

启动新内核出现:Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004_Alen.Wang的博客-CSDN博客

S3C2440移植Linux4.19.275内核以及过程中遇到的问题相关推荐

  1. 【鸿蒙OS开发入门】06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 启动init进程

    [鸿蒙OS开发入门]06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 一.head.S 启动start_kernel() 1.1 start_kernel() ...

  2. S3C2440移植linux3.4.2内核之内核框架介绍及简单修改

    文章目录 uboot启动内核分析 简单配置内核 编译内核 设置机器ID 修改晶振 移植Linux3.4.2内核其他文章链接: S3C2440移植linux3.4.2内核之内核框架介绍及简单修改 S3C ...

  3. linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”

    内核启动流程相关的内容让很多热爱linux的小伙伴既爱又恨,因为这是了解linux系统基本构造的良好过程同时由于其本身复杂且底层,脑子中的脉络不是很清晰,本文就总结了一些优秀博文,以自己的理解来解构一 ...

  4. I.MX6开发板移植Linux4.1.15内核之TSC2007触摸屏设备树信息的添加

    之前写过一篇3.0.35内核移植关于TSC2007触摸屏驱动移植的文章.里面对TSC2007.c驱动程序的分析比较清晰,点击链接查看:点击链接查看 本篇文章,主要记录在4.1.15内核移植的过程中,对 ...

  5. IMX6移植Linux4.1.15内核时需要添加矩阵按键的设备树信息

    之前在Linux3.0.35内核移植过按键的信息,请点击链接查看:3.0.35内核移植 本篇文章记录在IMX6开发板移植4.1.15内核时,添加矩阵按键的设备树信息. 1.具体添加的设备树信息 下面是 ...

  6. linux 内核配置过程中遇到的问题

    大家都知道在修改内核需要两步 配置和编译 在配置过程中 用到的命令 make config.make menuconfig.make xconfig 前两个是文本界面 最后一个是图形界面 不建议用最后 ...

  7. linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改

    @[TOC] uboot启动内核分析 进入cmd_bootm.c,找到对应的bootm命令对应的do_bootm():int do_bootm(cmd_tbl_t *cmdtp, int flag, ...

  8. 瑞萨芯片程序移植到华大芯片,运行过程中出现HardFault

    记录一下遇见的大坑还没找到原因 如果有大佬遇见过同样问题可以唠唠T T 将原瑞萨芯片R5F100FG的程序移植到华大芯片HC32L176MATA上就移植底层的硬件初始化. 应用层逻辑不动,这样就不用自 ...

  9. Linux移植之内核启动过程引导阶段分析

    在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压.自解压完成之后内核代码从物理地址为0x30008000处开始运行.下面分析在 ...

最新文章

  1. ehcache怎么删除缓存_解释SpringBoot之Ehcache 2.x缓存
  2. Linux可执行文件如何装载进虚拟内存
  3. Android 启动分析 1
  4. python下载包管理器_Python包管理整理:setuptool管理python相关的包
  5. python程序生成exe_使用Python程序生成QR代码的Python程序
  6. 翁同龢后人向上海博物馆捐赠两件重要家藏
  7. MaxCompute客户端在windows命令行下查询中文乱码怎么办?
  8. shell脚本发邮件内容html,Shell发送邮件以HTML展示
  9. SSM(Spring+springMVC+MyBatis)框架-springMVC实现图片上传
  10. 用户故事与敏捷方法笔记---Scrum与用户故事
  11. 计算机编程和机器人编程有什么不同,编程和机器人编程的区别
  12. Multipy String | leetcode
  13. Visio导出矢量图转eps格式
  14. java微信开发页面清除缓存,h5清理微信浏览器网页缓存
  15. Shell中IF大于等于小于
  16. bag java_Bag.java · linbo/Bag_Queue_Stack_Java - Gitee.com
  17. 逆转三国攻略-各阶段关卡武将
  18. Java自由虾旅行平台菜单功能
  19. java中的Cipher类 (加密和解密)
  20. 《中华人民共和国数据安全法》解读(3)

热门文章

  1. 《软件开发本质论》读书笔记
  2. 基于单片机的二维高精度液晶显示电子指南针
  3. paddle报ValueError: (InvalidArgument) Pass tensorrt_subgraph_pass has not been registered
  4. 动态规划 冒泡排序 爱奇艺2018招聘
  5. hdu 1279 验证角谷猜想(简单的模拟)
  6. 令牌桶实现流量限速实例
  7. 项目环境搭建【BT Linux面板 7.8.0 】
  8. 叶梓老师人工智能培训之强化学习与深度强化学习提纲(强化学习讲师培训)
  9. 微信小程序-000-签到功能-013-二维码凭证-二维码
  10. AR的未来在哪 天猫AR“拜年”互动指明方向