Linux内核API I_BDEV

函数I_BDEV()在实现过程中调用了函数BDEV_I(),首先申请一个结构体struct bdev_inode变量,然后用参数inode初始化结构体struct bdev_inode变量的vfs_inode字段,此结构体的定义见文件linux-3.19.3/fs/block_dev.c,如下:

struct bdev_inode
{
    struct block_device bdev;     //inode节点对应的block_device
    struct inode vfs_inode;       //inode节点
};

结构体构造完之后,返回结构体的bdev字段,此字段在函数调用过程中并没有被初始化,只是为其分配了空间。

I_BDEV文件包含

#include <linux/fs.h>

I_BDEV函数定义

在内核源码中的位置:linux-3.19.3/fs/block_dev.c

函数定义格式:

inline struct block_device *I_BDEV(struct inode *inode)

I_BDEV输入参数说明

  • inode:用于初始化结构体struct bdev_inode变量的inode字段的值。对于struct inode结构体,其定义及详细说明请参考极客笔记中d_find_alias()函数的参数说明部分。

I_BDEV返回参数说明

  • 函数I_BDEV()返回新构造的struct bdev_inode结构体变量的bdev字段的指针,此字段用于保存与字段vfs_inode相对应的block_device结构体变量的信息。结构体struct block_device的定义及详细解释请参考极客笔记函数get_super()分析文档的输入参数说明部分。

I_BDEV实例解析

编写测试文件:I_BDEV.c

头文件声明如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs_struct.h>
#include <linux/path.h>
#include <linux/sched.h>
#include <linux/fs.h>
MODULE_LICENSE("GPL");

模块初始化函数:

int I_BDEV_init(void)
{
    struct inode *inode;
    inode = current->fs->pwd.dentry->d_inode;       //获取当前文件的inode节点
    blkdev = *I_BDEV(inode);                       //调用函数
    if(blkdev==NULL)
        printk("I_BDEV failed\n");
    else
        printk("the size of the block device is %d\n", blkdev->bd_block_size);
                                                    //显示block_device的大小
    return 0;
}

模块退出函数:

// 模块退出函数定义
void I_BDEV_exit(void)
{
    printk("Goodbye I_BDEV\n");
}

模块初始化及退出函数调用:

module_init(I_BDEV_init);
module_exit(I_BDEV_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod I_BDEV.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

Linux内核API I_BDEV

结果分析:

返回结果为524288,说明block_device的大小为524288。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API I_BDEV
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址