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

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

进入到arm文件夹中

Kconfig里面存放的是menuconfig配置信息,具体看下面Kconfig的解释
mach-exynos就是我这款三星fs4412的芯片架构

drivers

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

Makefile
存放编译语句,包括uImage dtbs menuconfig的编译选项
Kconfig
下图为主Kconfig

存放的是menuconfig的配置信息,menuconfig是图形化选配内核的Application
我们进入到drivers/char中去ls看一下,发现也有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.dtb和uImage到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)