- 博客(9)
- 收藏
- 关注
原创 LINUX内核定时器和中断
硬件定时器提供时钟源,时钟源的频率可以设置。设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率)。系统节拍率是可以设置的,单位是 Hz,我们在编译 Linux 内核的时候可以通过图形化界面设置系统节拍率,设置好以后打开 Linux 内核源码根目录下的.config 文件,Linux 内核会使用 CONFIG_HZ 来设置自己的系统时钟。
2025-02-09 16:01:30
1093
原创 LINUX并发与竞争
并发就是多个“用户”同时访问同一个共享资源,Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。并发访问带来的问题就是竞争,所谓的临界区就是共享数据段。对于临界区必须保证一次只有一个线程访问,也就是要保证临界区是原子访问的,
2025-02-09 14:10:23
1115
原创 U-Boot启动流程详解3
首先我们还是要明确调用此函数前,一些关键量的值:如gd>malloc_base=0X0091FB00,这个也就是 early malloc的起始地址,其它在下图有标记:_main中会 调用 board_init_f函数, board_init_f函数主要有两个工作:①、初始化一系列外设,比如串口、定时器,或者打印一些消息等。②、初始化 gd的各个成员变量, uboot会将自己重定位到 DRAM最后面的地址区域,也就是将自己拷贝到DRAM最后面的内存区域中。
2025-01-16 14:45:24
1092
原创 U-Boot启动流程详解2
读取 gd->reloc_off的值复制给 r0寄存器, GD_RELOC_OFF=68行, lr寄存器的值加上 r0寄存器的值,重新赋值给 lr寄存器。),在函数 board_init_f中会初始化gd的所有成员变量,其中 gd->start_addr_sp=0X9EF44E90 所以这里相当于设置sp=gd->start_addr_sp=0X9EF44E90。定义有GD_BD=0,新的 gd在 bd下面,所以 r9减去 gd的大小就 是新的gd的位置,获取到新的gd的位置以后赋值给r9行。
2025-01-16 11:17:24
1189
原创 U-Boot启动流程详解
进入reset后,又跳到了save_boot_params函数,在save_boot_params函数中,又跳到了save_boot_params_ret中执行。行将 r0寄存器的值 (向量表值 )写入到 CP15的c12寄存器中,也就是VBAR寄存器 ,对向量表进行重定位。但是lowlevel_init 函数也执行完成了,返回到了函数cpu_init_crit,函数cpu_init_crit也执行完成了,最终返回到save_boot_params_ret,准备调用_main函数。
2025-01-15 21:26:51
1353
原创 U-boot顶层Makefile分析-第二节
version_h和timestamp_h两个变量保存了两个自动生成的文件,接着定义了4个变量的值。MAKECMDGOALS是 make的一个环境变量,这个变量会保存你所指定的终极目标列表,“比如执行“ make mx6ull_alientek_emmc_defconfig”,那么 MAKECMDGOALS就为 mx6ull_alientek_emmc_defconfig。很明显过滤后为空,所以条件不成立,变量 dot-config依旧为 1。
2025-01-15 00:11:00
1086
原创 U-Boot顶层Makefile分析
顶层Makefile也就是uboot根目录下的Makefile文件,由于顶层Makefile文件内容比较多,所以我们将其分开来看。本文主要参考正点原子。
2025-01-14 21:14:50
757
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人