文章目录
启动内核的第一阶段
操作系统
操作系统运行起来后在软件上分为内核层和应用层,分层后两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便访问各种硬件,而应用程序只能被限制的访问硬件和内存地址)
**uboot的镜像是u-boot.bin**
**linux系统的镜像是zImage**
SD卡的部署分区
一个完整的软件+硬件的嵌入式系统,静止时(未上电时)bootloader、kernel、rootfs等必须的软件都以镜像的形式存储在启动介质中(X210中是iNand/SD卡); u-boot.bin zImage rootfs,不可能随意存在SD卡的任意位置,需要对SD卡进行一个分区,然后将各种镜像各自存在各自的分区中,这样在启动过程中uboot、内核等就知道到哪里去找谁。(uboot和kernel中的分区表必须一致,同时和SD卡的实际使用的分区要一致)
如何查看分区 命令
启动内核第一步
第一步是将内核镜像从启动介质(inand/SD卡)中加载到DDR中
第二步是去DDR中启动内核镜像;
movi read kernel 0x30008000 把镜像存放到0x30008000那
bootm 0x30008000 启动内核
(开机的自启动就是使用这两个命令)
tftp、nfs等网络下载方式从远端服务器获取镜像
uboot还支持远程启动,也就是内核镜像不烧录到开发板的SD卡中,而是放在主机的服务器中,然后需要启动时uboot通过网络从服务器中下载镜像到开发板的DDR中。
命令 : tftp 0x30008000 (镜像名)
(在这之前板子和虚拟机的网络必须要ping通)
内核存放的地址
内核在DDR中存放的地址;存放在链接地址处(0x30008000)
do_bootm()函数,校验镜像
函数在/common/com_bootm.c
安全校验(安全启动,签名认证)之类(这没有使用)
157行
#if defined(CONFIG_SECURE_BOOT)
rv = Check_Signature( (SecureBoot_CTX *)SECURE_BOOT_CONTEXT_ADDR,
(unsigned char*)CONFIG_SECURE_KERNEL_BASE,
CONFIG_SECURE_KERNEL_SIZE-128,
(unsigned char*)(CONFIG_SECURE_KERNEL_BASE+CONFIG_SECURE_KERNEL_SIZE-128),
128 );
if(rv != SB_OK) {
printf("Kernel Integrity check fail\nSystem Halt....");
while(1);
}
printf("Kernel Integirty check success.\n");
rv = Check_Signature( (SecureBoot_CTX *)SECURE_BOOT_CONTEXT_ADDR,
(unsigned char*)CONFIG_SECURE_ROOTFS_BASE,
CONFIG_SECURE_ROOTFS_SIZE-128,
(unsigned char*)(CONFIG_SECURE_ROOTFS_BASE+CONFIG_SECURE_ROOTFS_SIZE-128),
128 );
if(rv != SB_OK) {
printf(