block_device结构体从哪里来?

今天来的比较晚,下班也相应要晚一些。吃完饭上来又看了一下代码,总算看清了一些关于block_device的眉目。


以前对block_device不解的是:何时分配它分配内存?曾经一阵狂追,发现了bdget这个函数。块设备的核心数据结构应该是gendisk,block_device应该只是gendisk的一个容器。那么生成一个block_device应该是在找到gendisk之后的事。bdget这个函数只有一个参数:设备号。表面上来看,这个函数很正点,add_disk的时候将设备号与gendisk关联了,bdget根据设备号找到gendisk,然后做点脏活整出个block_device。一切跟所预想的一致。


而实际上bdget根本没有鸟gendisk,如果之前为这个设备生成了bock_device,调用bdget会直接得到其缓存。如果是第一次使用块设备,bdget居然直接生成了一个block_device!没有gendisk的block_device只是一个空壳呀。


今天又从头由sys_mount开始看一了遍。sys_mount要得到挂载点的inode,然后让指定的文件系统去读取superblock。而基于块设备文件系统的get_sb方法是利用get_sb_bdev。这个函数以块设备文件名为参数调用open_bdev_excl,从而得到了block_device,然后将block_device传给文件系统相关的函数填充super_block。很好,就是open_bdev_excl完成了从块设备文件名到block_device的转换。先设想一下实现:打开这个文件,得到inode,得到设备号,向系统查询与该设备号相关的的gendisk,生成block_device,将其与gendi

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 内核中,regmap_bus 结构体定义在文件 include/linux/regmap.h 中,其定义如下: ``` struct regmap_bus { struct device *dev; int (*read)(struct regmap_bus *bus, unsigned int reg, unsigned int *val); int (*write)(struct regmap_bus *bus, unsigned int reg, unsigned int val); int (*read_block)(struct regmap_bus *bus, unsigned int reg, void *val, size_t val_len); int (*write_block)(struct regmap_bus *bus, unsigned int reg, const void *val, size_t val_len); int (*reg_write)(struct regmap_bus *bus, unsigned int reg); int (*reg_read)(struct regmap_bus *bus, unsigned int reg); }; ``` regmap_bus 结构体包含了一些函数指针,用于执行读写寄存器等操作。具体来说,它包含以下字段: - `dev`: 指向 regmap_bus 所属的设备对象的指针。该设备对象通常是一个 i2c_device 或 spi_device 结构体,表示与 regmap_bus 相关联的总线设备。 - `read`: 读取指定寄存器的值。 - `write`: 向指定寄存器写入指定值。 - `read_block`: 读取指定寄存器块的值。 - `write_block`: 向指定寄存器块写入指定值。 - `reg_write`: 向指定寄存器写入一个无意义的值,以触发一次写操作。 - `reg_read`: 读取指定寄存器的值。 这些函数指针定义了 regmap_bus 对象所支持的操作,用户可以根据实际需要实现这些函数,以满足自己的设备要求。同时,用户还可以自定义绑定这些函数指针到自己的操作函数中,以满足自己的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值