head.S分析
rt-thread版本:v5.0.0 qemu-vexpress-a9 qemu arm64
1. 简介 early_irq_init完成中断子系统软件部分初始化。 irqchip_init初始化中断控制器,向系统注册struct irq_domain。 2. 中断软件子系统初始化 early_irq_init初始化数组或树,用于保存virq到struct irq_desc的转换关系。 irq_to_desc用于将virq转换为struct irq_desc指针。 2.1. 线性映射 未定义CONFIG_SPARSE_IRQ时使用线性映射,使用数组实现,静态分配,支持的最大virq由NR_IRQS决定。 1struct irq_desc irq_desc[NR_IRQS]...
保证内核启动安全的几种方式 禁止修改cmdline 禁止修改根文件系统 使能内核地址空间布局随机化(KASLR)
1. U-Boot获取布局内存 U-Boot在启动过程中,默认内存布局通常在.config中定义。 1CONFIG_SYS_SDRAM_BASE=0x240000000 2CONFIG_SYS_DDR_SIZE=0xC0000000 在DDR控制器初始化完成之后,就要确定系统中有多少可用内存,这通常是由dram_init_banksize来实现的,而不同的板级文件会实现不同的dram_init_banksize,这也就决定了不同的板级可以定义不同的获取内存布局的方法。这里介绍一种从dtb中获取内存布局的实现,这可以通过简单的调用fdtdec_setup_memory_banksize来实现。而在使能...
1. get_ram_size get_ram_size只适用于CONFIG_SYS_DDR_SIZE=2^n。 1int dram_init(void) 2{ 3 gd->ram_size = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 4 CONFIG_SYS_DDR_SIZE); 5 return 0; 6} 2. 多核启动之spintable U-Boo中需要开启ARMV8_MULTIENTRY,另外CPU_RELEASE_ADDR的值要与内核dtb的cpu-release-addr保持一致。 1#define CPU_RELEASE_ADDR 0x100000 3. FIT...
启动流程,BL1是8k还是15k
1. 查找入口 u-boot版本:2024.01 参考defconfig:imx8qm_mek_defconfig 通过编译生成的u-boot.lds,U-Boot的入口为_start。而程序的一开始存放的指令是由start.c生成的。 1ENTRY(_start) 1 . = 0x00000000; 2 . = ALIGN(8); 3 .text : 4 { 5 *(.__image_copy_start) 6 arch/arm/cpu/armv8/start.o (.text*) 7 } 2. 程序流程 2.1. _start 默认情况下_start会直接通过b reset跳转到reset处。 在反汇编中,1400000a就...
head.S分析
1. 启动流程 1.1. bootrom 芯片上电后,会自动执行bootrom代码,bootrom是各家厂商定制的,但完成的工作基本相同。bootrom通常支持从多种不同的介质启动,如SD卡、NADN、eMMC、USB等。以Exynos4412为例,bootrom会读取OM引脚指定的启动介质。以eMMC为例,eMMC分为boot0、boot1、RPMB和user四个物理分区,四个物理分区独立寻址。可以通过寄存器指定eMMC的bootmode,也就是eMMC启动时,读取那个物理分区的数据。这就需要根据厂家需要,提前设置eMMC的寄存器。对于Exynos4412来说,bootrom会去读boot0分区的内容。 短接emmc clk...