mode_t等系统数据类型

mode_t 数据类型究竟是什么类型

让我们逐步查找一下。

首先从文件 /usr/include/sys/stat.h 中找到 mode_t 类型

/usr/include/sys/stat.h -> typedef __mode_t mode_t;

说明 mode_t 只是对 __mode_t 的一种定义。

然后从 /usr/include/bits/types.h 中找到 __mode_t 类型

/usr/include/bits/types.h -> __STD_TYPE __MODE_T_TYPE __mode_t;

说明 __mode_t 也只是对 __MODE_T_TYPE 的一种定义。

/usr/include/bits/typesizes.h -> #define __MODE_T_TYPE __U32_TYPE

说明 __MODE_T_TYPE 是对 __U32_TYPE 的一种定义。

/usr/include/bits/types.h -> #define __U32_TYPE unsigned int

最后 __U32_TYPE 是一种无符号的整数的定义。

从上述推导可以看出,mode_t 实际上也就是一种无符号整数。

另外如下结构 struct stat 定义中的 st_mode 成员变量也是使用的 mode_t 类型的变量。

从 man 2 stat 中可以找到结构 struct stat 的定义,如下:

  struct stat { 
    dev_t   st_dev;   /* ID of device containing file */ 
    ino_t   st_ino;   /* inode number */ 
    mode_t  st_mode;  /* protection */ 
    nlink_t   st_nlink;   /* number of hard links */ 
    uid_t   st_uid;   /* user ID of owner */ 
    gid_t   st_gid;   /* group ID of owner */ 
    dev_t   st_rdev;  /* device ID (if special file) */ 
    off_t   st_size;  /* total size, in bytes */ 
    blksize_t st_blksize; /* blocksize for filesystem I/O */ 
    blkcnt_t  st_blocks;  /* number of blocks allocated */ 
    time_t  st_atime;   /* time of last access */ 
    time_t  st_mtime;   /* time of last modification */ 
    time_t  st_ctime;   /* time of last status change */ 

};

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分区可以实现在恢复模式下进行各种系统操作的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值