从boot_check_mode到bcb的代码流程
时间: 2023-12-11 14:05:38 浏览: 110
boot_check_mode函数到bcb分区的代码流程如下:
1. 在U-Boot启动过程中,boot_check_mode函数会被调用。如果当前系统处于恢复模式,则boot_check_mode函数会返回BOOT_MODE_RECOVERY,否则会返回其他的启动模式,例如BOOT_MODE_NORMAL或BOOT_MODE_BOOTLOADER。
2. 如果boot_check_mode函数返回BOOT_MODE_RECOVERY,则U-Boot会调用recovery_init函数,该函数用于初始化恢复模式下的相关参数。
3. 在recovery_init函数中,U-Boot会尝试读取BCB分区中的数据。读取BCB分区的代码如下:
```
struct bootloader_message boot = { 0 };
bcb_read(&boot);
```
其中,bootloader_message是一个结构体类型,它定义了BCB分区中存储的数据结构;bcb_read是一个函数指针,它指向读取BCB分区的函数。
4. 如果成功读取了BCB分区中的数据,则可以根据BCB中存储的数据来判断下一步的操作。例如,可以根据BCB中存储的bootloader命令来判断是否需要更新固件,或者根据BCB中存储的系统标志位来判断是否需要进行恢复操作等。读取BCB分区中数据的代码如下:
```
static int bcb_read(struct bootloader_message *out)
{
off_t offset;
ssize_t count;
offset = BCB_OFFSET;
count = pread(BCB_DEV, out, sizeof(*out), offset);
if (count != sizeof(*out)) {
return -1;
}
if (memcmp(out->command, BOOTLOADER_MESSAGE_MAGIC,
sizeof(out->command))) {
return -1;
}
return 0;
}
```
其中,BCB_OFFSET和BCB_DEV分别表示BCB分区在设备中的偏移量和设备号;BOOTLOADER_MESSAGE_MAGIC是一个魔数,用于检查BCB分区中存储的数据是否合法。
5. 如果读取BCB分区失败,则U-Boot会尝试使用默认的启动参数和配置来启动系统,例如在启动正常模式时,会跳转到正常启动的流程中。
总之,从boot_check_mode到bcb分区的代码流程主要是通过boot_check_mode函数判断当前系统启动模式,在恢复模式下读取BCB分区中的数据,并根据BCB中存储的参数和标志位来决定下一步的操作。BCB分区是在Android系统中引入的一种机制,通过BCB分区可以实现在恢复模式下进行各种系统操作的目的。
阅读全文