复习
1. uboot 命令
reset
tftp
mmc dev
mmc info
mmc write
mmc read
mmc erase
uboot 配置交叉编译工具
Makefile
uboot 配置
make boardname_config
include/config.h
include/config.mk
uboot 编译
make / make all
make -j4 V=1
uboot 清除
make clean .o
make mrproper .o + 配置文件
make distclean .o + 配置文件 + .bak ..
芯片启动流程
***********************************
1. uboot启动流程详解
1. 连接脚本三个作用 u-boot.lds
1. 指定入口地址
2. 目标文件的连接顺序
3. 指定连接地址
2. 根据入口地址开始 _start 开始分许uboot启动流程
3. arch/arm/cpu/armv8/s5p6818/start.S
第一阶段: 汇编阶段
1. 设置SVC模式,
2. 关中断,关看门狗,设置中断向量表
3. 关cache, mmu
4. 初始化时钟,内存,
5. 完成自搬移
6. 初始化C语言运行环境 (栈sp,bss段)
第二阶段: C语言阶段
1. 完成大部分硬件初始化
串口,i2c, mmc, net,
等大部分硬件初始化
2. 进入 3 2 1 倒计时
3. 读取bootcmd环境变量,
进入自启动模式
2. uboot内存分布
3. 自定义uboot命令
1. 创建 cmd_aaa.c
$ touch common/cmd_aaa.c
2. 在中 common/cmd_aaa.c 输入如下代码
$ vi common/cmd_aaa.c
#include <common.h>
#include <command.h>
static int do_aaaa(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
printf("hello world\n");
return 1;
}
#define func(a) int a=1
func(b); //int b=1;
U_BOOT_CMD(
aaaa, // 命令的名字
2, // 命令参数个数
0, // 是否支持重复
do_aaaa, // 命令对应的函数
"simple display", // 简单的描述
// 详细描述信息
" - print brief description of all commands asdfafasdf\n"
);
3. 修改 Makfile 将 cmd_aaaa.c 编译进入 uboot
$ vi common/Makefile
添加 如下一行
obj-y += cmd_aaaa.o
4. 重新编译uboot
$ make
...
CC common/board_f.o
CC common/cmd_aaaa.o // 出现这一行 表示已经编译进入uboot
CC common/cmd_version.o
...
5. 烧写 win-uboot.bin 到 SD 卡
6. 用SD卡驱动 开发板
7. 进入uboot 交互模式 输入命令行
FS6818# aaaa
hello world // 出现这个表示成功
FS6818#
4. linux内核 和 Ubuntu的关系
Ubuntu的内核使用的是 linux kernel
Ubuntu 包括了 kernel内核,桌面管理,应用软件等
5. linux内核的特点
1. 支持多种平台和架构 ARM X86
2. linux内核的可移植性和可裁剪性
3. linux内核是开源
4. linux内核采用模块化的设计
5. linux内核采用了分层的思想
5. linux 内核的作用
1. 多任务调度功能
2. 网络协议
3. 文件系统管理
4. 内存管理
5. 硬件驱动管理
6. 如何获取linux内核
1. linux官网获取
https://mirrors.edge.kernel.org/pub/linux/kernel/
2. 开发板厂家
3. 芯片厂家获取
7. linux内核的版本号的定义
主版本号.次版本号.修订版本号
次版本号:如果为偶数,代表稳定版,
如果为奇数,代表测试版
修订版本号:只要更新了代码,
次版本号就要相应的更新
8. 内核的配置和编译
配置交叉编译工具 :
1. 修改顶层目录下 Makefile
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
修改为:
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
------------------------------
扩展学习
2. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
3. export CROSS_COMPILE=arm-none-linux-gnueabi-
配置内核支持fs6818平台
make fs6818_defconfig
相当于 1. cp arch/arm/configs/fs6818_defconfig .config
2. make menuconfig
其实就是在源码的顶层目录下生成一个.config文件
图形化配置
make menuconfig
1. 安装图形库 sudo apt-get install libncurses5-dev
2. sudo apt-get install flex
sudo apt-get install bison
3. 终端太小错误提示
4. linux内核的编译
make uImage
make uImage -j2
-j2 : 多核编译
出现如下错误:
1. "mkimage" command not found - U-Boot images will not be built
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2
u-boot-2014-07 $ cp ./tools/mkimage /usr/bin
5. 清除编译的三个等级
make clean // 清除编译生成的所有目标文件
make mrproper // 清除目标文件 + 配置文件
make distclean // 清除目标文件 + 配置文件 + 备份文件
9. 内核的目录结构
arch 体系结构相关代码
include 头文件
drivers 各种驱动代码
lib 解压压缩代码,红黑树算法,md5, 字符串处理
fs 文件系统代码
net 网络协议代码
ipc 进程间通信内核支持代码
mm 内存管理
kernel 进程创建,调度
init 内核启动之初的初始化代码
scripts 编译脚本
Documentation 开发文档
10. 执行过程详解 make fs6818_defconfig
491 %config: scripts_basic outputmakefile FORCE
492 $(Q)mkdir -p include/linux include/config
493 $(Q)$(MAKE) $(build)=scripts/kconfig $@
@make -f scripts/Makefile.build obj=scripts/kconfig fs6818_defconfig
95 %_defconfig: $(obj)/conf
96 $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
@conf --defconfig=arch/arm/configs/fs6818_defconfig Kconfig
11. 执行过程详解 make menuconfig
491 %config: scripts_basic outputmakefile FORCE
492 $(Q)mkdir -p include/linux include/config
493 $(Q)$(MAKE) $(build)=scripts/kconfig $@
@make -f scripts/Makefile.build obj=scripts/kconfig menuconfig
20 menuconfig: $(obj)/mconf
21 $< $(Kconfig)
$(obj)/mconf Kconfig
12. 配置菜单语法说明
1. config SYMBOL
[类型值] bool/tristate/string/hex/int
[提示字符] prompt
[默认值] default
[依赖] depends on SYMBOL
[反向依赖] select SYMBOL
[帮助] help/---help--- 帮助信息
2. if SYMBOL
endif # SYMBOL
3. menu "提示字符"
depends on SYMBOL
endmenu
4. choice
prompt "提示字符"
depends on SYMBOL
default SYMBOL
endchoice
5. comment "提示字符"
6. source
13. 自己添加一个符号选项,并将一个.c文件编译到内核中
1. 写一个.c文件
在driver/char目录下创建一个test.c
2. 修改Makefile
在driver/char目录下打开Makefile
添加一下内容
obj-$(CONFIG_NOZUONODEI_TEST) += test.o
3. 添加菜单选项
在driver/char目录下打开Kconfig
config NOZUONODEI_TEST
bool "no zuo no dei!"
default y
help
This is test code!~
执行make menuconfig
输入"/",弹出搜索界面, 用于搜索符号
输入要搜索的内容“NOZUONODEI_TEST”
Symbol: NOZUONODEI_TEST [=y]
Type : boolean
Prompt: no zuo no dei!
Defined at drivers/char/Kconfig:12
Location:
-> Device Drivers
-> Character devices
14. 自己添加一个符号选项,并将一个.c文件编译到成 ko
<*>:编译到内核
< >:不编译到内核
<M>:以模块化的方式进行编译
需要运行的时候,直接加载驱动,
不需要运行的时候直接卸载你的驱动
最终编译生成***.ko
insmod ***.ko 加载到内核
rmmod *** 从内核中卸载
1. 写一个.c文件
在driver/char目录下创建一个test.c
2. 修改Makefile
在driver/char目录下打开Makefile
添加一下内容
obj-$(CONFIG_NOZUONODEI_TEST) += test.o
3. 添加菜单选项
在driver/char目录下打开Kconfig
4 menu "No-zuo-no-dei"
5 config NOZUONODEI_TEST
6 tristate "no zuo no dei!"
7 default y
8 help
9 This is test code!~
10 endmenu
执行make menuconfig
输入"/",弹出搜索界面,
输入要搜索的内容“NOZUONODEI_TEST”
Symbol: NOZUONODEI_TEST [=m]
Type : boolean
Prompt: no zuo no dei!
Defined at drivers/char/Kconfig:5
Location:
-> Device Drivers
-> No-zuo-no-dei
4. 对内核进行编译
使用命令 make modules
LD [M] drivers/char/test.ko
15. 总结:Kconfig .config Makefile 文件之间的关系
16. 内核的编译流程