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

uboot 第三天学习的更多相关文章

  1. 20145213《Java程序设计》第三周学习总结

    20145213<Java程序设计>第三周学习总结 教材学习内容总结 正所谓距离产生美,上周我还倾心于Java表面的基础语法.其简单的流程结构,屈指可数的基本类型分类,早已烂熟于心的运算符 ...

  2. 20145304 Java第三周学习报告

    20145304 <Java程序设计>第三周学习总结 教材学习内容总结 1.定义类: 类定义时使用class关键词,建立实例要使用new关键词. 代码如下: /*定义类 书上例子 衣服的型 ...

  3. 20145330《Java程序设计》第三周学习总结

    20145330 <Java程序设计>第三周学习总结 第三周知识的难度已经逐步上升,并且一周学习两章学习压力也逐渐加大,需要更高效率的来完成学习内容,合理安排时间. 类与对象 对象(Obj ...

  4. 20145337《Java程序设计》第三周学习总结

    20145337 <Java程序设计>第三周学习总结 教材学习内容总结 类与对象 类与对象的关系:要产生对象必须先定义类,类是对象的设计图,对象是类的实例.我觉得在视频中对类与对象关系的描 ...

  5. 20145218 《Java程序设计》第三周学习总结

    20145218 <Java程序设计>第三周学习总结 教材学习内容总结 定义类 编写程序要产生对象就要先定义类.类是对象的设计图,对象是类的实例.类定义时使用class关键词,建立实例时, ...

  6. 《Java程序设计》第三周学习总结

    20145224-陈颢文 <Java程序设计>第三周学习总结 教材学习内容总结 一.定义类: ·类定义时使用class关键字,要对类中变量(值域成员/对象数据成员)行类型声明. class ...

  7. JDBC第三次学习

    这是我的JDBC第三次学习了,在学习的过程中,老是会忘掉一些知识,不记下笔记实在不行啊! 使用JDBC调用存储过程 (1)关于如何使用Navicat(11.1.13) for MySQL如何创建存储过 ...

  8. 20155304 2016-2017-2 《Java程序设计》第三周学习总结

    20155304 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 类与对象 定义: 对象(Object):存在的具体实体,具有明确的状态和行为. 类( ...

  9. 201521123038 《Java程序设计》 第三周学习总结

    201521123038 <Java程序设计> 第三周学习总结 1. 本周学习总结 附大图链接 http://naotu.baidu.com/file/5774caa2be710afbc0 ...

随机推荐

  1. 烂泥:学习centos之快速搭建LNMP环境

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 以前在centos下安装软件都是喜欢源码安装,不过昨天因为一个事情需要一个centos 下的LNMP环境.反倒不会搞了,今天特意记录下,以备后续使用. 一 ...

  2. 移动WEB viewport 相关知识

    了解移动web viewport的知识,主要是为了切图时心中有数.本文主要围绕一个问题:切图时怎样设置<meta name="viewport">相关参数?围绕这个问题 ...

  3. 【记录】Ubuntu下安装VirtualBox

    之前换了新硬盘,重装了ubuntu,由于学习需要还是要装个虚拟机.以前用过VMWare真的是神卡,这次换VirtualBox,希望开源社区能给我带来曙光:) 添加VirtualBox的源并安装5.1版 ...

  4. 常用算法——排序(二)

    简单选择排序法 选择排序(Selection Sort)的基本思想:对n个记录进行扫描,选择最小的记录,将其输出,接着在剩下的n-1个记录中扫描,选择最小的记录将其输出,--不断重复这个过程,直到只剩 ...

  5. 使用jOrgChart插件实现组织架构图的展示

    项目要做组织架构图,要把它做成自上而下的树形结构. 一.说明 (1)通过后台查询数据库,生成树形数组结构,返回到前台. (2)需要引入的js插件和css文件: ①jquery.jOrgChart.cs ...

  6. TesseractOCR

    简介: OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程. Tesseract:开源的OCR识别引擎,初期Tesser ...

  7. [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  8. SQLite3源程序分析之查询处理及优化

    前言 查询处理及优化是关系数据库得以流行的根本原因,也是关系数据库系统最核心的技术之一.SQLite的查询处理模块很精致,而且很容易移植到不支持SQL的存储引擎(Berkeley DB最新的版本已经将 ...

  9. FCM聚类算法介绍

    FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小.模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则 ...

  10. MSSQLSERVER

    create database test--创建数据库zh use test --打开数据库 go--执行 create table tab--创建表 ( UserName ),--创建字符串类型的字 ...