make jCPU_NUM 以CPU_NUM数量同时进行编译
CPU_NUM = 当前PC的处理器数量*处理器的核心数
从上电开始
1、系统上电,执行固化在IROM中的代码,目的初始化基本的系统功能,已经加载BL1代码
2、BL1代码继续进行初始化,初始化DRAM控制器(400000000-80000000可用)
3、uboot.bin开始在0x43E00000 地址位置开始执行
common(uboot命令)
556 U_BOOT_CMD(   ) 这个宏函数 设置了当前命令执行以及需要执行函数  do_movi -> simple_strtoul(argv[3], NULL, 16);  完成命令行获取以及命令执行
查询函数或者标号顺序
1、在当前文件中
2、不在当前文件中
ctags工具使用
在源码目录下生成ctags索引 ctags -R
ctrl + 】进行查询
输入数字来完成文件的跳转
ctrl + t返回上一层文件
两次esc进入到数字输入界面
必须在生成tags索引文件的目录下打开文件
uboot启动(关注于流程,不关注与具体代码)
第一阶段:
从arch/arm/cpu/armv7/start.S 开始
异常中断向量表的创建 
b reset
保存启动参数(进入位置) ,svc模式设置,协处理器指令
156     mrc p15, 0, r0, c1, c0, 0  将CP15协处理中内容保存到r0 
协处理器设备目的是关闭所有中断
167     bl  cpu_init_cp15     初始化cp15协处理器  CP15协处理器设置(MMU,cache、中断)
关闭了MMU和cache 
325     mov pc, lr   返回
168     bl  cpu_init_crit     初始化板级结构设置   
344     b   lowlevel_init  
				进入board/samsung/fs4412/lowlevel_init.S   
				进行检查reset模式 检测当前电源选项,有电压降低能情况,会进行复位方式的检测
				添加关闭看门狗代码(没时间喂狗)
				确定uboot是否已经运行在物理内存中 当前这个0x43E00000   
				r1是pc中值 r2是0x43E00000 
				111     bl uart_asm_init完成串口初始化(完成了栈指针设置以及时钟,波特率设置)
				113     bl tzpc_init  (注释的是安全保护模式)
				 43     push    {lr}   当前标号刚开始
				 115     pop {pc}    ==> mov pc,lr   结束
回到arch/arm/cpu/armv7/start.S中
171     bl  _main     
				进入到arch/arm/lib/crt0.S  (初始化c语言环境以及board_init_r)
				108     ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)   
				CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR - GENERATED_GBL_DATA_SIZE(gd结构体大小))     0x43e000000 - 128 
				#define CONFIG_SYS_LOAD_ADDR        (CONFIG_SYS_SDRAM_BASE + 0x3E00000) 
				#define CONFIG_SYS_SDRAM_BASE       0x40000000      
				就是在为gd结构体的赋值预留工具 需要使用(include/configs/fs4412.h) 以及 ctags
				115     bl  board_init_f   
								进入arch/arm/lib/board.c  
								完成了gd结构体的赋值(arch/arm/include/asm/global_data.h ) gd结构体主要存储的是执行的环境变量,包括执行地址
         
									303     for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
									304         if ((*init_fnc_ptr)() != 0) {
									305             hang ();
									306         }                
									243 init_fnc_t *init_sequence[] 函数指针数组 
									遍历函数指针,完成了板级结构初始化,最后进行了dram初始化(bl1阶段完成的是dram控制器的初始化)(40000000-80000000可用)
完成了第一阶段的启动,主要是汇编完成 CP15协处理器设置,完成了中断MMUcache关闭 板级结构初始化(串口、时钟等)最后完成了gd结构体赋值、dram初始化
第二阶段
		回到arch/arm/lib/crt0.S  (创建临时环境)
		r8表示的是当前gd结构体的开始位置
		lr  = here
		r0 = r8 + 68
		r0 = gd->start_addr_sp 
		r2 = gd->relocaddr 
		r1 = r8
回到arch/arm/cpu/armv7/start.S 
r4 = r0  
r5 = r1
r6 = r2(要搬移的目的地址)
r0 = _start(起始地址位置) 
189     cmp r0, r6    进行uboot开始位置内容 和 目的位置内容 确定当前有没有搬移过
r1 = r2 目标位置 地址
196 copy_loop: (搬移模式代码)
197     ldmia   r0!, {r9-r10}       /* copy from source address [r0]    */  将r0地址处的内容以8字节copy到 r9 - r10寄存器中
198     stmia   r1!, {r9-r10}       /* copy to   target address [r1]    */  将r9 - r10寄存器中的值copy到 r1 地址处
199     cmp r0, r2          /* until source end address [r2]    */
200     blo copy_loop
r0 现在是咱们的uboot初始地址,存放的就是咱们的uboot 从咱们原始地址uboot循环搬移到高位目标地址uboot
检测搬移是否成功		
243     bx  lr     (lr  = here)  
			进入arch/arm/lib/crt0.S  
			bss_start bss_end都在System.map中完成了bss段的清零操作
			点亮红灯,进行了gd结构体的搬移
			167     ldr pc, =board_init_r   
			arch/arm/lib/board.c  进一步初始化系统
			702     for (;;) {
			703         main_loop();
			704     }
							进入common/main.c,完成环境变量的获取,进入自启动模式
							bootcmd获取设置的环境变量值与预设的env值进行比较,比较成功才执行
启动了uboot引导系统
linux内核(汇编语言、C语言(主要)、shell脚本、Makefile)
kernel:指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件
linux内核包含了:进程管理,内存管理,用户管理等多种子系统包含的这样一个核心
linux特性:
1、支持的硬件平台广泛(Documentation linux 内核源码目录下的目录 重要文档)
2、高可扩展性 通过精简版的内核进行功能扩充(硬件支持,驱动的添加)
3、高稳定性,高可靠性
4、丰富的功能
5、运行所占资源较少
6、模块化设计(驱动的安装与卸载)
7、遵循GPL开源协议
8、编程更简单(有更多函数封装)
linux内核设计特点:高内聚,低耦合 
《操作系统革命》 
当前使用linux内核版本:3.14
linux2.6内核前  设备传参使用时param结构体
linux3.0内核前  设备传参使用的是tags结构体
linux3.0后      设备传参方式设备树传参(工业使用)
linux版本的选取:
1、针对于当前硬件的体系结构
2、当前设计目的(服务器(网络,数据处理要求)openwrt(偏重于网络功能))
3、资料 
linux目录结构 
arch(体系架构)  block(块设备支持)  crypto(加密算法) Documentation(重要文档)  driver(驱动)  fireware(固件平台) fs(文件系统)
init(启动挂载文件系统)  ipc(进程间通信)   kernel(内核执行相关代码)  mm(内存管理)  net(网络支持) script(脚本工具) 
security(同一安全启动代码) sound(声卡支持)  tools(编译相关工具) virt(物理地址虚拟化)
make -p > text 生成当前源码中全局变量赋值
make -j4/2 以几线程来编译
linux内核配置
步骤:
  make exynos_defconfig    导入默认配置
  make menuconfig(推荐使用)          个人添加配置
  Your display is too small to run Menuconfig! (因为屏幕太小了)
	It must be at least 19 lines by 80 columns.
  make xconfig(QT库)
  make config 一条一条
流程:
Y  包含选中      make uImage 将选中内容编译到内核中
M  模块化		make module 编译为模块(在驱动中常用)
N  不选中 
可以选用空格键 进行切换
*表示选中  M表示以模块化编译   
<> 表示有三种选择
[]表示有两种
()表示输入字符串
?来查看帮助信息
关于menuconfig书写
顶层目录
mainmenu 需要标注抬头信息
source 添加其他目录的kconfig到当前位置
 10 config DEVKMEM  ------指明设备 (在设备树文件中)
 11     bool "/dev/kmem virtual device support"  显示的是名字 bool (两种选项)
 12     default y                                默认选中                                                                                
 13     help       添加的帮助信息
 int char 等 ()
 tristate 三种选项<>
 boot 两种选项 []
 每次完成一次menuconfig设置   make uImage
  M会根据 make moudle生成
make clean 删除生成的一些.o文件中间文件以及目标 保存我们配置信息(.config)
make clean < make mrproper  <   make distclean
			删除了配置文件       删除了所有除源码外的其他文件
修改内核配置 menuconfig 需要重新编译内核
修改设备树文件   exynos4412-fs4412.dts   重新编译设备
作业:实验4-8
原文:http://www.cnblogs.com/renchong/p/5758349.html