read系统调用如何调用到ext3_do_readpage,给出调用关系
时间: 2024-06-01 12:11:35 浏览: 128
read系统调用会先调用vfs_read函数,该函数会先进行一些参数的检查和初始化操作,然后会调用file_operations结构体中的read函数。在ext3文件系统中,该函数就是ext3_file_read函数。该函数会通过调用generic_file_read_iter函数来进行实际的读取操作,而该函数又会调用__generic_file_read_iter函数来进行实际的读取操作。在__generic_file_read_iter函数中,会调用do_generic_file_read函数来进行实际的读取操作。而在do_generic_file_read函数中,会调用filemap_fault函数来进行页面的管理操作,如果需要读取的数据没有在内存中,则会调用ext3_do_readpage函数来将数据从磁盘读入内存中。因此,read系统调用最终会调用到ext3_do_readpage函数。
相关问题
a = '<a href="/51/51412/48031215_2.html" id="pt_next" class="Readpage_down js_page_down">下一页</a>' 如何取到‘/51/51412/48031215_2.html’
可以使用正则表达式来匹配该字符串中的目标字符串,如下所示:
import re
a = '<a href="/51/51412/48031215_2.html" id="pt_next" class="Readpage_down js_page_down">下一页</a>'
pattern = r'href="(.+?)"'
match = re.search(pattern, a)
if match:
target_string = match.group(1)
print(target_string)
输出结果为:/51/51412/48031215_2.html
上述正则表达式中,使用括号将需要匹配的目标字符串包裹起来,然后使用“.+?”表示匹配任意字符(包括空格、换行等),并且使用“?”表示非贪婪模式,即尽可能匹配最短的字符串。最后使用group(1)方法取出匹配到的第一个括号内的字符串,即为目标字符串。
用ext3的代码示例,说明linux中的块请求如何转换成bio
在Linux中,块请求是由块设备驱动程序负责处理的。当应用程序请求读取或写入一个块时,块设备驱动程序将该请求转换为一个块请求,并将其发送给存储设备。
在ext3文件系统中,块请求通常是通过bio结构体来表示的。bio结构体定义如下:
```
struct bio {
struct bio *bi_next;
struct block_device *bi_bdev;
unsigned long bi_flags;
unsigned long bi_rw;
struct bio_vec *bi_io_vec;
sector_t bi_sector;
unsigned int bi_vcnt;
unsigned int bi_idx;
unsigned int bi_size;
unsigned int bi_max_vecs;
void *bi_private;
struct bio_vec bi_inline_vecs[0];
};
```
其中,bi_bdev表示请求的块设备,bi_rw表示请求的读写类型,bi_io_vec表示I/O向量数组,bi_sector表示请求的起始扇区,bi_vcnt表示I/O向量的数量,bi_size表示请求的数据大小,bi_max_vecs表示I/O向量数组的最大长度。
在ext3文件系统中,块请求通常是通过bio结构体来表示的。例如,当应用程序请求读取一个文件时,文件系统会将该请求转换为一个或多个bio结构体。这些bio结构体将被传递给块设备驱动程序,以便驱动程序可以读取所需的数据块并将其返回给文件系统。
下面是一个示例代码,说明如何将块请求转换为bio结构体:
```
int ext3_do_readpage(struct file *file, struct page *page) {
struct address_space *mapping = page->mapping;
struct inode *inode = mapping->host;
sector_t block = page->index << (PAGE_SHIFT - inode->i_blkbits);
struct block_device *bdev = inode->i_sb->s_bdev;
struct bio *bio = bio_alloc(GFP_KERNEL, 1);
int ret;
bio->bi_bdev = bdev;
bio->bi_rw = READ;
bio->bi_sector = block;
bio->bi_io_vec = &bio->bi_inline_vecs;
bio->bi_vcnt = 1;
bio->bi_idx = 0;
bio->bi_size = PAGE_SIZE;
bio->bi_private = page;
bio->bi_end_io = ext3_end_io_readpage;
bio_add_page(bio, page, PAGE_SIZE, 0);
ret = submit_bio_wait(bio);
bio_put(bio);
return ret;
}
```
在这个示例中,ext3_do_readpage函数表示读取文件的页面。该函数首先计算所需的块号,并使用该块号设置bio结构体的各个字段。然后,函数使用bio_add_page函数将内存页面添加到I/O向量数组中。最后,函数使用submit_bio_wait函数将bio结构体提交给块设备驱动程序,并等待I/O操作完成。
需要注意的是,这只是一个简单的示例,实际的块请求和bio结构体可能会更加复杂。但是,这个示例可以帮助我们理解Linux中的块请求和bio结构体是如何工作的。
阅读全文