块设备文件的readpage方法

块设备文件的readpage方法由blkdev_readpage调用block_read_full_page完成,其中page参数包含读取起始位置和数量信息。相对于文件开始处的文件块号标识文件内的块位置,而相对块设备开始处的逻辑块号对应物理设备上的位置。对于块设备文件,两者相等。block_read_full_page使用转换函数将文件块号转为逻辑块号。页被划分为多个数据单元,与缓冲区的交互通过struct page的private成员实现,创建空缓冲区关联page和buffer_head。
摘要由CSDN通过智能技术生成

块设备文件的readpage方法总是相同的。都是有blkdev_readpage( )函数实现的,它实际调用block_read_full_page( ):

static int blkdev_readpage(struct file * file, struct page * page)
{
    return block_read_full_page(page, blkdev_get_block);
}

page参数代表的含义是 要将块设备文件的内容读到page对应的页框中去,你可能好奇从块设备文件的哪个地方开始读?读多少?这些信息其实全在page里。
block_read_full_page的第二个参数指向一个函数,该函数把相对于文件开始处的文件块号转换为块设备开始处的逻辑块号。对于块设备文件来说,这两个数是一样的。

static int blkdev_get_block(struct inode *inode, sector_t iblock,
                            struct buffer_head *bh, int create)
{
    bh->b_bdev = I_BDEV(inode);
    bh->b_blocknr = iblock; 
//可以看出对于块设备文件来说,相对于文件开始处的文件块号和相对块设备开始处的逻辑块号是一样的

    set_buffer_mapped(bh);
    return 0;
}

可能读者对相对于文件开始处的文件块号和相对块设备开始处的逻辑块号有点迷惑,我来具体解释下:

  • 相对于文件开始处的文件块号:我们知道块是vfs和文件系统传送数据的基本单位。每个文件都是又很多个块组成的。我们要读写一个文件的某一个块,就得知道这个块是这个文件的第几个块,这就叫相对于文件开始处的文件块号。
    对设备文件直接读写是一种“原始”访问,它绕过了文件系统,内核通过使用最大的块(4096)执行该操作。
    每个块都需要自己的块缓冲区(块缓存),它是内核用来存放块内容的内存区。每个缓冲区对应一个缓冲区首部,用buffer_head描述(相当块缓存的元数据信息)。

  • 相对块设备开始处的逻辑块号:文件都是存在具体的物理设备上如磁盘,我们要往修改文件某块时,光知道该块相对文件是第几块是不够的,需要知道该块是在物理设备的第几个块才行。block_read_full_page的第二个参数就是一个实现块号转换的函数。对于块设备文件,它就是块设备的意思,所以两种块号相同,但对于普通文件就不同了。

    言归正传,block_read_full_page代表从块设备读取一整页,看看它的实现:

int block_read_full_page(struct page *page, get_block_t *get_block)  
{  
    struct inode *inode = page->mapping->host;  //找到inode我们才能找到文件
    sector_t iblock, lblock;  
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值