GNU_C
[TOC] 编译器特性 && 选项__va_arg_pack 用于处理可变参数函数__va_arg_pack_len 用于获取可变参数的数量__fortify_function 用于启用额外的安全检查,以防止常见的编程错误,如缓冲区溢出__LEAF 告诉编译器,该函数是一个叶函数(leaf function),即它不会调用其他函数 叶函数的属性允许编译器进行进一步的优化,例如减少函数调用的开销和栈空间的使用。 __error__ 属性告诉编译器,如果该函数被调用,则会触发编译错误,并输出指定的错误消息 msg12# define __errordecl(name, msg) \ extern void name (void) __attribute__((__error__ (msg))) __builtin_constant_p 检查 参数 是否为编译时常量__attribute_malloc__ 用于标记函数返回一个新分配的内存块 这有助于编译器进行优化,例如避免不必要的内存检查。 __attribute_alloc_size__ 用于指定分配的内存大...
setlocalversion
[TOC] 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168KERNELVERSION="5.10.0"# 变量默认值与传入赋值no_local=falseif test "$1" = "--no-l...
scripts
[TOC] scripts 用于构建脚本的工具 参考UBOOT全部目标的编译过程详解 scripts_basic 用于构建基本脚本的工具参考 uboot 和 Linux kernel 的主 Makefile 里面,都有下面这段话: 1234PHONY += scripts_basicscripts_basic: $(Q)$(MAKE) $(build)=scripts/basic $(Q)rm -f .tmp_quiet_recordmcount 展开后就是: 1make -f ./scripts/Makefile.build obj=scripts/basic $(build)的展开主 Makefile 里面,有一个非常重要的 include: 1include scripts/Kbuild.include 这是一个头文件,相当于把 Kbuild.include 的内容直接写到主 Makefile 里。Kbuild.include 代码片段: 12345#### Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj...
u-boot
[TOC] u-boot.map Archive member included to satisfy reference by file (symbol) 静态库链接成员 Archive member:归档成员是指静态库(通常是 .a 文件)中的对象文件。静态库是由多个对象文件打包而成的归档文件。 Included to satisfy reference:这部分信息表示链接器在链接过程中包含了某个归档成员,以满足其他文件中的符号引用。 by file (symbol):by file 表示引用该符号的文件。symbol 表示被引用的符号名称。 (–whole-archive) 表示在链接过程中将整个归档文件包含在内 这是一个链接选项,表示在链接过程中将整个归档文件包含在内。–whole-archive 选项告诉链接器将指定的归档文件中的所有对象文件都包含在最终的可执行文件中,而不仅仅是那些被其他对象文件引用的符号。 Discarded input sections 丢弃的输入段 在链接过程中,某些段可能会被丢弃,因为它们不需要包含在最终的可执行文件中。 Memory...
shell
[TOC] 语法if 条件语句 if:用于执行一个命令并根据其退出状态码执行不同的操作。 $(if $(KBUILD_OUTPUT),, ...): 这是一个条件判断语句。(if ...) 函数的语法是 $(if condition, then-part, else-part)如果 condition 为真,则执行 then-part;否则,执行 else-part。 环境变量 shift 命令用于移动参数 shift 命令用于移动参数。它会将所有参数左移一个位置,即 $2 的值赋给 $1,$3 的值赋给 $2,以此类推。$1 的值会被丢弃,而 $0(脚本名称)不会受到影响。 local 命令用于声明局部变量${parameter+word} 用于检查变量是否已经定义 一种参数替换语法,用于检查变量是否已设置并根据结果返回不同的值。以下是对这种语法的详细解释: 1${parameter+word} 如果 parameter 已设置且不为空,则结果为 word。 如果 parameter 未设置或为空,则结果为空字符串。 标志$BASH 指向的 she...
u-boot_config
last设置编译引导加载程序VPL(Very Early Program Loader) 功能 :VPL 是 U-Boot 的非常早期引导加载程序,通常用于在极其受限的环境中进行最基本的硬件初始化。 位置 :VPL 通常位于存储设备的固定位置,类似于 SPL 和 TPL。 作用 :VPL 的主要任务是加载并执行 TPL,以便进一步初始化系统并准备加载 SPL。 SPL(Secondary Program Loader) 功能 :SPL 是 U-Boot 的第二阶段引导加载程序,通常用于初始化基本的硬件资源,如内存控制器、时钟和电源管理等。 位置 :SPL 通常位于存储设备的固定位置,如 NAND、NOR 闪存或 SD 卡的特定扇区。 作用 :SPL 的主要任务是加载并执行 U-Boot 的主引导加载程序(即 U-Boot 本身),以便进一步初始化系统并启动操作系统。 TPL(Tertiary Program Loader) 功能 :TPL 是 U-Boot 的第三阶段引导加载程序,通常用于在资源受限的环境中进一步初始化硬件资源。 位置 :TPL 通常位于存储设备的固定位置,类...
u-boot_make
_all: 第一个目标 执行这个123456789101112# 这是我们的默认目标,当命令行上没有给出PHONY := _all_all:# 如果构建外部模块,我们不关心 all: 规则# 而是_all依赖于模块PHONY += allifeq ($(KBUILD_EXTMOD),)_all: allelse_all: modulesendif all:12345678# Timestamp 文件,以确保 binman 始终运行.binman_stamp: $(INPUTS-y) FORCEifeq ($(CONFIG_BINMAN),y) $(call if_changed,binman)endif @touch $@all: .binman_stamp 依赖$(INPUTS-y),优先执行 依赖 $(INPUTS-y) 导入特定规则123456789-include include/autoconf.mk-include include/autoconf.mk.dep#如果.config比auto.conf新,则重新生成auto.confinclude config...
u-boot流程分析
[toc] U-Boot 启动流程lds链接脚本 从链接脚本中定义了ENTRY(_start),即开始入口为_start _start函数 arch/arm/lib/vectors_m.S 编译的时候设置中断向量表 顺序执行下去,执行了reset函数 reset函数 arch/arm/cpu/armv7m/start.S 定义了reset函数,跳转到_main _main函数 arch/arm/lib/crt0.S 定义了_main函数 初始化堆栈指针sp为CONFIG_SYS_INIT_SP_ADDR12345678/* 设置初始 C 运行环境并调用 board_init_f(0)*/#if defined(CONFIG_TPL_BUILD) && defined(CONFIG_TPL_NEEDS_SEPARATE_STACK) ldr r0, =(CONFIG_TPL_STACK)#elif defined(CONFIG_XPL_BUILD) &...
arch
[TOC] arch 架构介绍ARC (Argonaut RISC Core) ARC 是一种基于 RISC(精简指令集计算机)原理的处理器架构,广泛应用于嵌入式系统中。 ARC 处理器由 Synopsys 公司开发和推广,广泛应用于嵌入式系统中,因其高性能和低功耗特性而受到欢迎。 ARM ARM M68K M68K,也称为 68K 或 Motorola 68000,是一种由摩托罗拉公司(Motorola)开发的16/32位微处理器架构。M68K 系列处理器在20世纪80年代和90年代广泛应用于计算机、嵌入式系统和游戏机中。 MICROBLAZE MicroBlaze 是由 Xilinx 公司开发的一种软处理器核心,专门用于其 FPGA(现场可编程门阵列)产品。MicroBlaze 处理器可以通过硬件描述语言(如 VHDL 或 Verilog)在 FPGA 中实现,并根据具体应用需求进行定制。 MIPS MIPS(Microprocessor without Interlocked Pipeline Stages)是一种由 MIPS Technologies 开...
bootm
cmd/bootm.c 从内存中的映像引导应用程序映像do_bootm1234567891011121314151617181920212223242526//bootm 90080000//cmdtp:命令表,flag:标志位,argc:参数个数,argv:参数列表int do_bootm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]){ struct bootm_info bmi; int ret; //执行子命令 //默认命令执行默认参数初始化 bootm_init(&bmi); if (argc) bmi.addr_img = argv[0]; //设置镜像地址 字符串"90080000" if (argc > 1) bmi.conf_ramdisk = argv[1]; if (argc > 2) bmi.conf_fdt = argv[2]; /* set up argc and argv[] since some OSes ...







