linux-3.14-fs4412内核解析以及编译

内核目录

ls Linux内核

主要部分

arch

存放的是linux-3.14支持的CPU架构,包括arm arm64 mips x86等等

linux-3.14支持的架构

进入到arm文件夹中

arm文件夹的内容

Kconfig里面存放的是menuconfig配置信息,具体看下面Kconfig的解释

mach-exynos就是我这款三星fs4412的芯片架构

exynos文件夹的内容

drivers

linux中的drivers的内容

里面存放的是内核驱动的信息,包括常见的bus clk gpio gpu i2c memory net pwm usb char 等等

include

存放头文件信息

linux中的include的内容

Makefile

存放编译语句,包括uImage dtbs menuconfig的编译选项

Kconfig

下图为主Kconfig

linux-3.14下的Kconfig

存放的是menuconfig的配置信息,menuconfig是图形化选配内核的Application

我们进入到drivers/char中去ls看一下,发现也有Kconfig文件

linux-3.14/drivers/char/ 下的Kconfig

menu:为该菜单的名字

source:为引入其他Kconfig的文件,它允许将其他Kconfig文件包含到当前的配置文件中,以便在同一个配置系统中共享和重用配置选项。

config:为一个菜单选项,通常对应一个设置。

config LED下,

bool 为布尔类型,可以选择是否启用或禁用某个功能或驱动。当选择"y"时,表示启用该功能或驱动;选择"n"时,表示禁用该功能或驱动。

tristate类型表示一个三态值,即可以是"y"、“m"或"n”。可以选择是否启用某个功能或驱动,并且可以选择是编译为静态链接到内核的一部分(“y”),还是编译为可加载模块(“m”),或者禁用该功能或驱动(“n”)。选择"y"表示静态链接,选择"m"表示模块化,选择"n"表示禁用。

default 默认值

help 说明

编译内核

make uImage

“mkimage” command not found

提示没有mkimage,sudo apt-get install uboot-mkimage再次执行make uImage

安装不了的,也可以访问电子资源,我上传了mkimage,可以下载,然后上传到ubuntu中,拷贝到/bin下。

第一次编译很慢,估计几分钟到10几甚至更久。

编译内核

注意几个点:

​ 最开始编译生成的是Image,然后经过compress,生成zImage,然后经过mkImage,给zImage加上u-boot的信息,以便u-boot可以识别,最终生成uImage

make dtbs

执行后,会生成一堆.dtb的文件,我们找到我们型号的设备树,这里的路径为arch/arm/boot/dts/exynos4412-fs4412.dtb,然后复制exynos4412-fs4412.dtbuImage到tftp文件夹,然后板子上电启动。

板子启动步骤

上电启动bootloader

硬件基本初始化

自搬移到内存

搬移内核到内存

传递内核启动参数(parmer_struct 或taglist)

加载内核

​ a. 自解压内核 decompess /arch/arm/boot/compressed/head.S

​ b. 运行内核汇编部分 head.S 入口stext /arch/arm/kernel/head.S

检测合法性(CPU 版本类型,机器类型)

​ c. 运行内核C部分 start_kernel /init/main.c

CPU,机器参数的安装 setup_arch

中断,定时,终端,内存等最基本的初始化

创建核心进程 kernel_init运行,启动多任务调度,原父进程空转cpu_ide

挂载rootfs (mount_root)

运行应用程序 //第一个应用程序是init (由u-boot的bootargs里的init=/linuxrc来指定)

​ a. 运行启动脚本run_init_process("/etc/init.d/rcS")//由init来解析脚本执行

​ b. 其它应用程序 //一般添加在脚本的最后(如在rcS末尾加 ./app)