欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Exynos4412移植LinuxKernel5.15过程记录(二)——解决U-Boot启动内核卡在Startingkernel的问题,DM9000网卡驱动

时间:2023-07-22
Exynos4412 移植Linux Kernel 5.15过程记录(二)

一、Linux Kernel编译的准备工作

0、内核make原理分析1、内核make流程2、什么是make exynos_defconfig3、什么是make menuconfig4、什么是Kconfig5、什么是Kbulid6、Kconfig语法 二、为Exynos4412移植内核

1、修改arch/arm/tools/mach-types.h2、编译设备树3.menuconfig图形化界面配置4、编译、烧写内核 三、解决U-Boot启动内核,卡在Starting kernel

1、正确设置下载地址,加载地址,入口地址2、设置串口0是debug终端3、打开printk4、修改uboot bootargs5、检查设备树的bootargs和机器码 一、Linux Kernel编译的准备工作

此篇博文是在Exynos4412 Linux Kernel移植过程记录(一)1的基础上,继续移植Linux Kernel。

0、内核make原理分析

参考书籍是《构建嵌入式Linux核心软件系统实战》2。

1、内核make流程

有必要认识2个命令和3个文件:make %config命令、make menuconfig 命令、.config文件、Makefile文件、Kconfig文件。内核的make编译流程就是由它们组成的,它们也是组成Kbuild机制的成员。我们需要像学习shell命令一样,明白它们如何使用,以便在制作完整的Linux内核过程中不会有障碍,
下图是内核编译的流程及其各环节关系:

2、什么是make exynos_defconfig

执行make exynos_defconfig是为了生成一个与开发板相关的.config文件。此时的.config文件是初始的,不能完全与自己的开发板相匹配。本质上是执行的make %config。

3、什么是make menuconfig

make menuconfig生成一个图形菜单。通过修改菜单把需要的配置写入到.config文件中。

4、什么是Kconfig

CONFIG_xxx变量是保存在.config中,而.config是有make menuconfig生成的,而运行make menuconfig时需要读取Kconfig。

5、什么是Kbulid

从编译过程来看,每一个被编译的目录下都会生成一个build-in.o文件,它们都是由自己目录下的源代码编译生成,所有目录下的build-in.o文件最终链接生成vnlinux文件,最后由内核压缩程序加工vmlinux生成内核压缩镜像文件zlmage。
从原理来看,Kbuild机制只会把obj-y的值编译进内核。每一个Makefile文件中都有这个变量,只不过obj后面一般都跟着一个变量,这个变量的值来自于.config。例如:

obj-$(CONFIG_EXYNOS_MCPM)+= mcpm-exynos.oCFLAGS_mcpm-exynos.o+= -march=armv7-a

变量CONFIG_EXYNOS_MCPM就来自于.config。如果该变量=y,mcpm-exynos.o就会编译进内核。这个是与U-Boot的移植是一样的。
所以,移植内核驱动,关键要给正确的宏定义赋值为y、或者m。方法就是修改Kconfig定义宏,配置menuconfig给宏定义赋值。

6、Kconfig语法

(1)Kconfig文件的基本要素:config条目(entry)。
上面的Kconfig片段中config为菜单中的一个选择条目,各个部分的含义是:
●ARM为变量名,将在.config中以CONFIG_ARM=y或n的形式出现。
●bool为变量取值的类型,可为y或n。
●prompt后边是出现在配置菜单中的对应于一个配置选项的文字,没有prompt条目,将使得用户不能在配置界面中显示并配置该配置选项。
●default为变量缺省值,可被用户设置值覆盖。
●depends on ARM表示该变量必须在ARM被设置的情况下才能进行设置,否则取值为n,即使default为y。
●select表示它将影响到变量RTC_LIB,使得RTC_LIB至少应该配置为y或m(如果它最终取值为y或m)。
●help中的文字将作为配置界面中的帮助信息。
附加说明:
●无depends on,default为y:默认为y。一般用于必须要设置的选项,此时不要设置prompt。
●有depends on,default为y:所依赖的条目已设置,则默认为y;所依赖的条目未设置,则为n。
●有 depends on,default为n:所依赖的条目已设置,则默认为n;所依赖的条目未设置,则为n。
●无depends on,default为n:默认为n.在未设置prompt的情况下,此选项想要被设置,需要由其他选项来select它。
(2)Kconfig中变量的取值类型总共有5种。其中最常见的是tistate和bool,分别对应于make menuconfig配置界面中<>和[]选项。
● tristate:可取y、n、m。
●bool(其为tristate的变体):可取y.n。
● string:取值为字符串,如:CONFIG_CMDLINE=“root=/dev/hdal ro init=/bin/bash console=ttySACo”。
●hex(其为string的变体):取值为十六进制数据字符串,如:CONFIG_VECTORS_base=0xffff0000.
●int(其为string的变体):取值为十进制数据字符串,如:CONFIG_SPLIT_PTLOCK_CPUS=4096。
(3)Kconfig文件的要素:menu。
在menu和endmenu中间可配置若干config条目;
体现在配置菜单上为 System type一>,按下该条目后,将出现各个config条目。
(4)Kconfig文件的要素:choice。
在choice和endchoice之间可定义若干config条目。
体现在配置菜单上为ARM system type—>,按下该条目后,将出现各个con-fig条目。
choice中的config条目变量只能有2种类型:bool或 tristate,且不能同时有这2种类型的变量。对于bool型变量只能在多个选择中选择1个为y;对于tristate型变量要么将多个(当然也可以是1个)设为m,要么仅将1个设为y,其余为n。这好比一个硬件有多个驱动,要么选择1个编入内核,要么把多个全编为模块。
(5)Kconfig文件的要素:comment。
用于定义帮助信息,将出现在配置界面的第一行;并且还会出现在配置文件。config中(作为注释)。
(6)Kconfig文件的要素:source。
由于内核源代码中大多数目录下都有各自的Kconfig文件,因此需要一种手段将所有的Kconfig文件组织为一个整体。这就是source的功能,它用于引入另一个Kconfig文件,有点类似于C语言中的#include。
config文件说明:
make menuconfig 配置完成退出时,选择保存,则用户所做的选择将保存在内核源代码顶层目录的.config文件中。

二、为Exynos4412移植内核 1、修改arch/arm/tools/mach-types.h

u-boot的机器码和linux内核的要一致。网上大多数都是修改的linux内核的机器码,在arch/arm/tools/mach-types.h中。我在移植U-Boot时,配置CONFIG_MACH_TYPE为MACH_TYPE_EXYNOS4412。U-Boot的移植方法可参见我的另一篇博文为Exynos4412移植2022版U-Boot的步骤及其原理分析第三部分3。

查找U-Boot中arch/arm/include/asm/mach-types.h,存在
#define MACH_TYPE_TINY4412 4608
#define MACH_TYPE_EXYNOS4412 5030
所以,在内核源码的arch/arm/tools/mach-types.h中仿照origen添加exynos4412对应的机器码。如下:

origenMACH_ORIGENORIGEN3455exynos4412MACH_EXYNOS4412EXYNOS44125030

2、编译设备树

(1)将内核源文件中的设备树文件/arch/arm/boot/dts/exynos4412-origen.dts拷贝一份,改文件名为exynos4412-cbt4412.dts并修改

cp ./arch/arm/boot/dts/exynos4412-origen.dts ./arch/arm/boot/dts/exynos4412-cbt4412.dtsgedit ./arch/arm/boot/dts/exynos4412-cbt4412.dts

保留串口、内存、时钟等配置,添加网卡的基本配置:

// SPDX-License-Identifier: GPL-2.0/dts-v1/;#include "exynos4412.dtsi"#include "exynos4412-pinctrl.dtsi"#include #include #include #include "exynos-mfc-reserved-memory.dtsi"/ {model = "CBt4412 board based on Exynos4412";compatible = "samsung,exynos4412";chosen {stdout-path = &serial_0;};memory-controller@12570000 {#address-cells = <2>;#size-cells = <1>;ranges = <0 0 0x04000000 0x20000 // Bank0 1 0 0x05000000 0x20000 // Bank1 2 0 0x06000000 0x20000 // Bank2 3 0 0x07000000 0x20000>; // Bank3ethernet@1,0{compatible = "davicom,dm9000";reg = <1 0 0x2 1 4 0x2>;interrupt-parent = <&gpx0>;interrupts = <7 4>;samsung,srom-page-mode = <1>;// normal(1data)page mode configurationsamsung,srom-timing = <9 12 1 5 1 1>;davicom,no-eeprom;mac-address = [00 11 22 33 44 55];};};memory@40000000 {device_type = "memory";reg = <0x40000000 0x40000000>;};fixed-rate-clocks {xxti {compatible = "samsung,clock-xxti";clock-frequency = <27000000>;};xusbxti {compatible = "samsung,clock-xusbxti";clock-frequency = <24000000>;};};};&pinctrl_1 {Xm0DATA: Xm0DATA {samsung,pins = "gpy5-0", "gpy5-1", "gpy5-2","gpy5-3", "gpy5-4", "gpy5-5", "gpy5-6","gpy5-7","gpy6-0", "gpy6-1", "gpy6-2","gpy6-3", "gpy6-4", "gpy6-5", "gpy6-6","gpy6-7";samsung,pin-function = ;samsung,pin-pud = ;samsung,pin-drv = ;};Xm0ADDR2: Xm0ADDR2 {samsung,pins = "gpy3-2";samsung,pin-function = ;samsung,pin-pud = ;samsung,pin-drv = ;};Xm0OEn: Xm0OEn {samsung,pins = "gpy0-4";samsung,pin-function = ;samsung,pin-pud = ;samsung,pin-drv = ;};Xm0WEn: Xm0WEn {samsung,pins = "gpy0-5";samsung,pin-function = ;samsung,pin-pud = ;samsung,pin-drv = ;};Xm0CSn1: Xm0CSn1 {samsung,pins = "gpy0-1";samsung,pin-function = ;samsung,pin-pud = ;samsung,pin-drv = ;};};&cpu_thermal {cooling-maps {cooling_map0: map0 {cooling-device = <&cpu0 7 7>, <&cpu1 7 7>, <&cpu2 7 7>, <&cpu3 7 7>;};cooling_map1: map1 {cooling-device = <&cpu0 13 13>, <&cpu1 13 13>, <&cpu2 13 13>, <&cpu3 13 13>;};};};&rtc {status = "okay";clocks = <&clock CLK_RTC>, <&pmic_ap_clk>;clock-names = "rtc", "rtc_src";};&mshc_0 {pinctrl-0 = <&sd4_clk &sd4_cmd &sd4_bus4 &sd4_bus8>;pinctrl-names = "default";status = "okay";broken-cd;card-detect-delay = <200>;samsung,dw-mshc-ciu-div = <3>;samsung,dw-mshc-sdr-timing = <2 3>;samsung,dw-mshc-ddr-timing = <1 2>;bus-width = <8>;cap-mmc-highspeed;};&sdhci_2 {bus-width = <4>;pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;pinctrl-names = "default";status = "okay";};&serial_0 {status = "okay";};&serial_1 {status = "okay";};&serial_2 {status = "okay";};&serial_3 {status = "okay";};

(2)修改/arch/arm/boot/dts/Makefile文件,添加上我们新创的设备树文件exynos4412-cbt4412.dts

dtb-$(CONFIG_ARCH_EXYNOS4) += exynos4210-i9100.dtb exynos4210-origen.dtb exynos4210-smdkv310.dtb exynos4210-trats.dtb exynos4210-universal_c210.dtb exynos4412-i9300.dtb exynos4412-i9305.dtb exynos4412-itop-elite.dtb exynos4412-n710x.dtb exynos4412-odroidu3.dtb exynos4412-odroidx.dtb exynos4412-odroidx2.dtb exynos4412-origen.dtb exynos4412-cbt4412.dtb

(3)编译设备树

$ make dtbs DTC arch/arm/boot/dts/exynos4412-cbt4412.dtb

此时,在arch/arm/boot/dts/目录中生成exynos4412-cbt4412.dtb。

3.menuconfig图形化界面配置

(1)打开图形化配置界面

make menuconfig

(2) Boot options —>

以下为另一篇博文对Boot options启动设置的配置3。

选项说明-*- Flattened Device Tree support支持设备树。[*] Support for the traditional ATAGS boot data passing支持传统的ATAGS启动数据传递。除非仅依赖设备树,否则建议选择。

ATAGS是传统的linux内核接收参数的方式,另一种是DTB。设备启动时,BOOT向内核传递三个参数,其中R0寄存器内容为一个“0”,R1是机器码(与内核匹配),R3为ATAGS或者DTB传递的地址。

选项说明(0x0) Compressed ROM boot loader base addressdefault “0” 。存放基地址,对zImage压缩镜像启动很重要。(0x0) Compressed ROM boot loader BSS addressdefault “0”。引导的BSS地址。[*] Use appended device tree blob to zImage (EXPERIMENTAL)将附加的设备树blob用于zImage(实验)。

With this option, the boot code will look for a device tree binary (DTB) appended to zImage (e.g、cat zImage .dtb > zImage_w_dtb).This is meant as a backward compatibility convenience for those systems with a bootloader that can’t be upgraded to accommodate the documented boot protocol using a device tree、Beware that there is very little in terms of protection against this option being confused by leftover garbage in memory that might look like a DTB header after a reboot if no actual DTB is appended to Image、Do not leave this option active in a production kernel if you don’t intend to always append a DTB.

Proper passing of the location into r2 of a bootloader provided DTB is always preferable to this option.

选项说明[*] Supplement the appended DTB with traditional ATAG information用传统的ATAG信息补充附加的DTB

Some old bootloaders can’t be updated to a DTB capable one, yet they provide ATAGs with memory configuration, the ramdisk address, the kernel cmdline string, etc.Such information is dynamically provided by the bootloader and can’t always be stored in a static DTB、To allow a device tree enabled kernel to be used with such bootloaders, this option allows zImage to extract the information from the ATAG list and store it at run time into the appended DTB.

选项说明[C] Kernel command line type内核命令行类型。[X] Use bootloader kernel arguments if available优先使用bootloader(uboot)参数,如果没有就使用DTB ARGS。[N] Extend with bootloader kernel arguments使用DTB ARGS,bootloader提供的追加在其之后。(N) Default kernel command string默认的内核命令行字符串。

因为通过uboot修改环境变量比修改内核容易得多,因此使用bootloader更方便。造成的问题是内核配置的变量可能被覆盖。

4、编译、烧写内核

1、编译内核

make uImage

拷贝内核和设备树文件到/tftpboot目录下

cp arch/arm/boot/uImage /CBT-SuperIOT/tftpboot/cp arch/arm/boot/dts/exynos4412-cbt4412.dtb /CBT-SuperIOT/tftpboot/

2、如果仅仅是

tftp 41000000 uImage;bootm 41000000

那么会报错:FDT and ATAGS support not compiled in

[10:05:48:201] ## Booting kernel from Legacy Image at 40008000 ...␍␊[10:05:48:202] Image Name: Linux-5.15.14-CBT4412ARM␍␊[10:05:48:216] Image Type: ARM Linux Kernel Image (uncompressed)␍␊[10:05:48:216] Data Size: 6798528 Bytes = 6.5 MiB␍␊[10:05:48:216] Load Address: 40008000␍␊[10:05:48:216] Entry Point: 40008000␍␊[10:05:48:226] Verifying Checksum ..、OK␍␊[10:05:49:098] Loading Kernel Image␍␊[10:05:49:198] FDT and ATAGS support not compiled in␍␊

3、如果加上设备树,

tftp 41000000 uImage;tftp 42000000 exynos4412-cbt4412.dtb;bootm 41000000 - 42000000

那么会卡在 Starting kernel。

[10:57:04:816] CBT4412 #bootm 40008000 - 41000000␍␊[10:57:16:748] ## Booting kernel from Legacy Image at 40008000 ...␍␊[10:57:16:756] Image Name: Linux-5.15.14-CBT4412ARM␍␊[10:57:16:756] Image Type: ARM Linux Kernel Image (uncompressed)␍␊[10:57:16:766] Data Size: 6798528 Bytes = 6.5 MiB␍␊[10:57:16:766] Load Address: 40008000␍␊[10:57:16:774] Entry Point: 40008000␍␊[10:57:16:774] Verifying Checksum ..、OK␍␊[10:57:17:648] ## Flattened Device Tree blob at 41000000␍␊[10:57:17:663] Booting using the fdt blob at 0x41000000␍␊[10:57:17:663] Loading Kernel Image␍␊[10:57:17:830] Loading Device Tree to 7ae86000, end 7ae943af ..、OK␍␊[10:57:17:907] ␍␊[10:57:17:907] Starting kernel ...␍␊[10:57:17:907] ␍␊

注意:tftp服务器已经在Exynos4412 Linux Kernel移植过程记录(一)1中配置完成了。

三、解决U-Boot启动内核,卡在Starting kernel 1、正确设置下载地址,加载地址,入口地址

下载地址是烧写内核的地址;加载地址是U-Boot复制zImage的地址;入口地址是内核启动的地址。博文《下载地址,加载地址,入口地址的修改》4分析得很清楚。

编号条件加载地址入口地址1下载地址 = 加载地址加载地址复制的是uImage(加了头的镜像文件)必须=加载地址+64byte2下载地址 != 加载地址加载地址复制的是zImage(去掉了头结构体)必须=加载地址

由于我的uImage信息为

Image Name: Linux-5.15.14-CBT4412ARMCreated: Sun Jan 16 10:03:01 2022Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 6798528 Bytes = 6639.19 KiB = 6.48 MiBLoad Address: 40008000Entry Point: 40008000 Kernel: arch/arm/boot/uImage is ready

Load Address(加载地址)与Entry Point(入口地址)是相同的。所以,下载地址不能为0x40008000。可以把下载地址设置为0x41000000。
所以,启动参数改为

tftp 41000000 uImage;tftp 42000000 exynos4412-cbt4412.dtb;bootm 41000000 - 42000000

重新烧写启动,仍然卡在Starting kernel。虽然如此,但是我觉得更改地址参数是必须的。

2、设置串口0是debug终端

console控制台信息执行到Starting Kernel就卡住不动了,这句打印信息是uboot的最后一条打印信息,也就是我们确定不了内核到底有没有被启动。
一般内核启动失败常见的原因大多是因为传参不正确导致的,即r0-r2寄存器的值。可将machid和tag传参地址通过uboot打印出来,
排除内核传参错误后,将问题锁定到内核,TI的早期处理器大多默认使用Uart2作为console控制台,因为我们使用的是Uart0,所以需要修改内核代码。

在menuconfig的主菜单界面中,输入/,可以进入搜索界面。然后搜索UART0,可以找到Symbol: DEBUG_S3C_UART2 的Kconfig选项。如下:

│ Symbol: DEBUG_S3C_UART0 [=y] │ Type : bool │ Defined at arch/arm/Kconfig.debug:1017 │ prompt: Use Samsung S3C UART 0 for low-level debug │ Depends on: && (PLAT_SAMSUNG [=n] || ARCH_S5PV210 [=n] || ARCH_EXYNOS [=y]) │ Location: │ -> Kernel hacking │ -> arm Debugging │ -> Kernel low-level debugging functions (read help!) (DEBUG_LL [=y]) │ (4) -> Kernel low-level debugging port ( [=y]) │ Selects: DEBUG_EXYNOS_UART [=y] && DEBUG_S3C24XX_UART [=n] && DEBUG_S3C64XX_UART [=n] && DEBUG_S5PV210_UART [=n]

可以看出,在 -> Kernel hacking -------> arm Debugging 处,可以设置串口0是debug终端。
另外,以下配置可能需要:
│ General setup —>
│ [*] Printk indexing debugfs interface

3、打开printk

有一篇博文提出了一个问题描述: 挂在Uncompress done… booting the kernel。这个与本文的卡在Starting kernel的问题是一样的。此博文提出解决方法是: 打开early_printk。具体步骤如下:
(a)、make menuconfig进入menu界面,在Kernel hacking 里配置EARLY_PRINTK
│ Symbol: EARLY_PRINTK [=y]
│ Type : bool
│ Defined at arch/arm/Kconfig.debug:1897
│ prompt: Early printk
│ Depends on: DEBUG_LL [=y]
│ Location:
│ -> Kernel hacking
│ (1) -> arm Debugging

4、修改uboot bootargs

uboot bootargs 添加earlyprintk:

setenv bootargs console=ttySAC0,115200n8 earlyprintk

5、检查设备树的bootargs和机器码

在启动内核的时候,经常会遇到在串口输入以下内容就停止了,这是由于参数传递失败或是机器码配置不正确导致的。
u-boot的机器码和linux内核的要一致。网上大多数都是修改的linux内核的机器码,在linux内核源码的arch/arm/tools/mach-types中。查找U-Boot中arch/arm/include/asm/mach-types.h,我检查了机器码是正确的。

然后检查设备树的bootargs有问题,更改正确以后,再编译、烧写dtb文件,就可以启动内核了。
启动信息如下。虽然不再卡在Starting kernel,但是仍然没有启动成功。一个原因是设备树不正确。从启动信息中可以看出,sclk_apll = 0, sclk_mpll = 0,sclk_epll = 0, sclk_vpll = 0, arm_clk = 0四个关键PLL时钟都为0。第二个原因是没有挂载根文件系统。

[21:40:10:805] ## Booting kernel from Legacy Image at 41000000 ...␍␊[21:40:10:805] Image Name: Linux-5.15.14-CBT4412ARM␍␊[21:40:10:805] Image Type: ARM Linux Kernel Image (uncompressed)␍␊[21:40:10:835] Data Size: 7038440 Bytes = 6.7 MiB␍␊[21:40:10:835] Load Address: 40008000␍␊[21:40:10:835] Entry Point: 40008000␍␊[21:40:10:835] Verifying Checksum ..、OK␍␊[21:40:11:724] ## Flattened Device Tree blob at 42000000␍␊[21:40:11:730] Booting using the fdt blob at 0x42000000␍␊[21:40:11:730] Loading Kernel Image␍␊[21:40:11:916] Loading Device Tree to 7ae86000, end 7ae943a7 ..、OK␍␊[21:40:11:993] ␍␊[21:40:11:993] Starting kernel ...␍␊[21:40:11:993] ␍␊[21:40:12:426] [ 0.000000] Booting Linux on physical CPU 0xa00␍␊[21:40:12:429] [ 0.000000] Linux version 5.15.14-CBT4412ARM (exynos4412@exynos4412) (arm-none-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 2.36.1.20210621) #7 SMP PREEMPT Sun Jan 16 16:16:21 CST 2022␍␊[21:40:12:466] [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d␍␊[21:40:12:466] [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache␍␊[21:40:12:477] [ 0.000000] OF: fdt: Machine model: CBt4412 board based on Exynos4412␍␊[21:40:12:490] [ 0.000000] printk: bootconsole [earlycon0] enabled␍␊[21:40:12:490] [ 0.000000] Memory policy: Data cache writealloc␍␊[21:40:12:517] [ 0.000000] Reserved memory: created DMA memory pool at 0x7f800000, size 8 MiB␍␊[21:40:12:517] [ 0.000000] OF: reserved mem: initialized node region-mfc-right, compatible id shared-dma-pool␍␊[21:40:12:517] [ 0.000000] Reserved memory: created DMA memory pool at 0x7d400000, size 36 MiB␍␊[21:40:12:517] [ 0.000000] OF: reserved mem: initialized node region-mfc-left, compatible id shared-dma-pool␍␊[21:40:12:533] [ 0.000000] Samsung CPU ID: 0xe4412011␍␊[21:40:12:533] [ 0.000000] Zone ranges:␍␊[21:40:12:533] [ 0.000000] Normal [mem 0x0000000040000000-0x000000006fffffff]␍␊[21:40:12:548] [ 0.000000] HighMem [mem 0x0000000070000000-0x000000007fffffff]␍␊[21:40:12:548] [ 0.000000] Movable zone start for each node␍␊[21:40:12:548] [ 0.000000] Early memory node ranges␍␊[21:40:12:548] [ 0.000000] node 0: [mem 0x0000000040000000-0x000000007d3fffff]␍␊[21:40:12:564] [ 0.000000] node 0: [mem 0x000000007d400000-0x000000007fffffff]␍␊[21:40:12:564] [ 0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x000000007fffffff]␍␊[21:40:12:585] [ 0.000000] percpu: Embedded 16 pages/cpu s33740 r8192 d23604 u65536␍␊[21:40:12:592] [ 0.000000] Built 1 zonelists, mobility grouping on、 Total pages: 260608␍␊[21:40:12:601] [ 0.000000] Kernel command line: console=ttySAC0,115200n8 earlyprintk␍␊[21:40:12:608] [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear)␍␊[21:40:12:617] [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear)␍␊[21:40:12:627] [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off␍␊[21:40:12:687] [ 0.000000] Memory: 976224K/1048576K available (10240K kernel code, 1175K rwdata, 4060K rodata, 1024K init, 278K bss, 72352K reserved, 0K cma-reserved, 217040K highmem)␍␊[21:40:12:700] [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1␍␊[21:40:12:715] [ 0.000000] trace event string verifier disabled␍␊[21:40:12:715] [ 0.000000] rcu: Preemptible hierarchical RCU implementation.␍␊[21:40:12:720] [ 0.000000] ⇥Trampoline variant of Tasks RCU enabled.␍␊[21:40:12:751] [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.␍␊[21:40:12:751] [ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16␍␊[21:40:12:751] [ 0.000000] L2C: platform modifies aux control register: 0x02070000 -> 0x0a470000␍␊[21:40:12:751] [ 0.000000] L2C: DT/platform modifies aux control register: 0x02070000 -> 0x3a470000␍␊[21:40:12:767] [ 0.000000] L2C-310 erratum 769419 enabled␍␊[21:40:12:767] [ 0.000000] L2C-310 enabling early BRESP for Cortex-A9␍␊[21:40:12:767] [ 0.000000] L2C-310 full line of zeros enabled for Cortex-A9␍␊[21:40:12:778] [ 0.000000] L2C-310 ID prefetch enabled, offset 8 lines␍␊[21:40:12:778] [ 0.000000] L2C-310 dynamic clock gating enabled, standby mode enabled␍␊[21:40:12:792] [ 0.000000] L2C-310 cache controller enabled, 16 ways, 1024 kB␍␊[21:40:12:792] [ 0.000000] L2C-310: CACHE_ID 0x4100c4c8, AUX_CTRL 0x7e470001␍␊[21:40:12:871] [ 0.000000] random: get_random_bytes called from start_kernel+0x50c/0x6b8 with crng_init=0␍␊[21:40:12:877] [ 0.000000] Exynos4x12 clocks: sclk_apll = 0, sclk_mpll = 0␍␊[21:40:12:884] [ 0.000000] ⇥sclk_epll = 0, sclk_vpll = 0, arm_clk = 0␍␊[21:40:12:896] [ 0.000000] Division by zero in kernel.␍␊[21:40:12:896] [ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.15.14-CBT4412ARM #7␍␊[21:40:12:906] [ 0.000000] Hardware name: Samsung Exynos (Flattened Device Tree)␍␊[21:40:12:906] [ 0.000000] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)␍␊[21:40:12:921] [ 0.000000] [] (show_stack) from [] (dump_stack_lvl+0x40/0x4c)␍␊[21:40:12:933] [ 0.000000] [] (dump_stack_lvl) from [] (Ldiv0+0x8/0x10)␍␊[21:40:12:933] [ 0.000000] [] (Ldiv0) from [] (clockevents_config.part.0+0x20/0x7c)␍␊[21:40:12:947] [ 0.000000] [] (clockevents_config.part.0) from [] (clockevents_config_and_register+0x20/0x2c)␍␊[21:40:12:947] [ 0.000000] [] (clockevents_config_and_register) from [] (exynos4_mct_starting_cpu+0xfc/0x11c)␍␊[21:40:12:959] [ 0.000000] [] (exynos4_mct_starting_cpu) from [] (cpuhp_invoke_callback+0x158/0x888)␍␊[21:40:12:974] [ 0.000000] [] (cpuhp_invoke_callback) from [] (cpuhp_issue_call+0x154/0x1b0)␍␊[21:40:12:990] [ 0.000000] [] (cpuhp_issue_call) from [] (__cpuhp_setup_state_cpuslocked+0x108/0x294)␍␊[21:40:12:990] [ 0.000000] [] (__cpuhp_setup_state_cpuslocked) from [] (__cpuhp_setup_state+0x98/0x190)␍␊[21:40:13:002] [ 0.000000] [] (__cpuhp_setup_state) from [] (mct_init_dt+0x260/0x3dc)␍␊[21:40:13:002] [ 0.000000] [] (mct_init_dt) from [] (timer_probe+0x74/0xe4)␍␊[21:40:13:016] [ 0.000000] [] (timer_probe) from [] (time_init+0x28/0x30)␍␊[21:40:13:031] [ 0.000000] [] (time_init) from [] (start_kernel+0x540/0x6b8)␍␊[21:40:13:031] [ 0.000000] [] (start_kernel) from [<00000000>] (0x0)␍␊[21:40:13:031] [ 0.000000] ------------[ cut here ]------------␍␊[21:40:13:041] [ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/time/clockevents.c:38 cev_delta2ns+0x11c/0x140␍␊[21:40:13:054] [ 0.000000] Modules linked in:␍␊[21:40:13:054] [ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.15.14-CBT4412ARM #7␍␊[21:40:13:066] [ 0.000000] Hardware name: Samsung Exynos (Flattened Device Tree)␍␊[21:40:13:066] [ 0.000000] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)␍␊[21:40:13:081] [ 0.000000] [] (show_stack) from [] (dump_stack_lvl+0x40/0x4c)␍␊[21:40:13:081] [ 0.000000] [] (dump_stack_lvl) from [] (__warn+0xec/0x148)␍␊[21:40:13:092] [ 0.000000] [] (__warn) from [] (warn_slowpath_fmt+0x64/0xbc)␍␊[21:40:13:105] [ 0.000000] [] (warn_slowpath_fmt) from [] (cev_delta2ns+0x11c/0x140)␍␊[21:40:13:105] [ 0.000000] [] (cev_delta2ns) from [] (clockevents_config.part.0+0x54/0x7c)␍␊[21:40:13:116] [ 0.000000] [] (clockevents_config.part.0) from [] (clockevents_config_and_register+0x20/0x2c)␍␊[21:40:13:116] [ 0.000000] [] (clockevents_config_and_register) from [] (exynos4_mct_starting_cpu+0xfc/0x11c)␍␊[21:40:13:128] [ 0.000000] [] (exynos4_mct_starting_cpu) from [] (cpuhp_invoke_callback+0x158/0x888)␍␊[21:40:13:141] [ 0.000000] [] (cpuhp_invoke_callback) from [] (cpuhp_issue_call+0x154/0x1b0)␍␊[21:40:13:153] [ 0.000000] [] (cpuhp_issue_call) from [] (__cpuhp_setup_state_cpuslocked+0x108/0x294)␍␊[21:40:13:166] [ 0.000000] [] (__cpuhp_setup_state_cpuslocked) from [] (__cpuhp_setup_state+0x98/0x190)␍␊[21:40:13:166] [ 0.000000] [] (__cpuhp_setup_state) from [] (mct_init_dt+0x260/0x3dc)␍␊[21:40:13:177] [ 0.000000] [] (mct_init_dt) from [] (timer_probe+0x74/0xe4)␍␊[21:40:13:190] [ 0.000000] [] (timer_probe) from [] (time_init+0x28/0x30)␍␊[21:40:13:190] [ 0.000000] [] (time_init) from [] (start_kernel+0x540/0x6b8)␍␊[21:40:13:201] [ 0.000000] [] (start_kernel) from [<00000000>] (0x0)␍␊[21:40:13:217] [ 0.000000] ---[ end trace e39a1885fa9bcc5f ]---␍␊

2022.2.5更新:挂载SD卡根文件,内核启动成功。


Exynos4412 Linux Kernel移植过程记录(一) ↩︎ ↩︎

杨铸,等、构建嵌入式Linux核心软件系统实战.北京航空航天大学出版社,2013, ↩︎

linux内核配置重置,linux内核配置–Boot options ↩︎ ↩︎

下载地址,加载地址,入口地址的修改 ↩︎

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。