没有合适的资源?快使用搜索试试~ 我知道了~
首页ext4写文件流程分析
资源详情
资源评论
资源推荐

Linux 内核写文件过程
目 录Table of Contents
1 ........................................................................................................................... 4概述
2 ................................................................................. 6虚拟文件系统与ext4文
件系统层
2.1 ...................................................................................................... 6sys_write()
2.2 ....................................................................................................... 7vfs_write()
2.3 .............................................................................................. 9do_sync_write()
2.4 ............................................................................................ 10ext4_file_write()
2.4.1 .............................................................................. 10Ext4文件系统extent特性
2.4.2 ........................................................................ 12ext4_file_write()函数分析
2.5 ................................................................................. 14generic_file_aio_write()
2.6 ............................................................................. 15__generic_file_aio_write()
2.7 ........................................................................ 18generic_file_buffered_write()
2.8 ................................................................................ 19generic_perform_write()
2.8.1 ..................................................... 19ext4文件系
统address_space_operations
2.8.2 ................................................................ 20ext4文件系
统delay allocation机制
2.8.3 ............................................................................ 21genric_perform_write()
2.8.4 .................................................................................. 29genric_write_end()
2.8.5 .................................................................................... 30block_write_end()
2

Linux 内核写文件过程
图目录 List of Figures
图1 Linux内核块设备I/O流程........................................................................................................ 4
图2 Ext4文件
系统间接块映射与Extent模式................................................................................ 10
图3 ext4_extent、ext4_
extent_idx、ext4_extent_header数据结构 ........................................... 11
图4 ext4 extent树....................................................................................................................... 12
图5 缓冲页
与缓冲区头的关系.................................................................................................... 27
3

Linux 内核写文件过程
1 概述
用户进程通过系统调用write()往磁盘上写数据,但write()执行结束后,数据是否
立即写到磁盘上?内核读文件数据时,使用到了“提前读”;写数据时,则使用了“延迟写”,
即write()执行结束后,数据并没有立即立即将请求放入块设备驱动请求队列,然后写到
硬盘上。
本文不考虑以O_DIRECT或O_SYNC方式打开文件的情形,我们仅考虑异步I/O。同步方式写的I/O流
程相对简单。
本文以Redhat Enterprise Linux 6 Update 3内核版本2.6.32-279.el6.x86_64为例,分
析内核写文件过程。
在分析具体源码之前,我们回顾一下Linux内核块设备I/O流程,如图1所示。
Buffer Cache (Page Cache)
Disk
Filesystem
Disk
Filesystem
Mapping Layer
Generic Block Layer
Virtual Filesystem (VFS) Layer
Direct IO
Request Queue
Block Device Driver
Block Device Driver
Hard Disk
Kernel S
p
ace
… …
SSD
I/O Scheduler Layer
Request Queue
Stora
g
e Media
图1 Linux内核块设备I/O流程
4

Linux 内核写文件过程
为了简化块设备驱动分析,我们以Ramdisk块设备为基础,分析Linux内核写数据过程。
本文实例将/dev/ram1格式化为ext4文件系统,然后读写文件。下面是写文件内核栈信息,
从该栈信息中,可以看出整个I/O写操作,所经历的流程。
Pid:4318,comm:cpTainted:G‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐HT2.6.32279.debug#19
CallTrace:
[<ffffffff8135ce59>]?brd_make_request+0x439/0x510
[<ffffffff814fd503>]?printk+0x41/0x46
[<ffffffff81256f64>]?generic_make_request+0x2c4/0x5b0
[<ffffffff8125730c>]?submit_bio+0xbc/0x160
[<ffffffff811acd46>]?submit_bh+0xf6/0x150
[<ffffffffa0109773>]?ext4_mb_init_cache+0x883/0x9f0[ext4]
[<ffffffff8112b560>]?__lru_cache_add+0x40/0x90
[<ffffffffa01099fe>]?ext4_mb_init_group+0x11e/0x210 [ext4]
[<ffffffffa0109bbd>]?ext4_mb_good_group+0xcd/0x110[e
xt4]
[<ffffffffa010b35b>]?ext4_mb_regular_allocator+0x19b/0 x410[ext4]
[<ffffffff814feffe>]?mutex_lock+0x1e/0x50
[<ffffffffa010d22d>]?ext4_mb_new_blocks+0x38d/0x560[ext4]
[<ffffffffa0100ace>]?ext4_ext_find_extent+0x2be/0x320[ext4]
[<ffffffffa0103b83>]?ext4_ext_get_blocks+0x1113/0x1a10[ext4]
[<ffffffff810097cc>]?__switch_to+0x1ac/0x320
[<ffffffff81136959>]?zone_statistics+0x99/0xc0
[<ffffffff811259f1>]?get_page_from_freelist+0x3d1/0x820
[<ffffffffa00dfd39>]?ext4_get_blocks+0xf9/0x2a0[ext4]
[<ffffffffa00e07ad>]?ext4_get_block+0xbd/0x120[ext4]
[<ffffffff811afe1b>]?__block_prepare_write+0x1db/0x570
[<ffffffffa00e06f0>]?ext4_get_block+0x0/0x120[ext4]
[<f
fffffff811b048c>]?block_write_begin_newtrunc+0x5c/0xd0
[<ffffffff811b0893>]?block_write_begin+0x43/0x90
[<ffffffffa00e06f0>]?ext4_get_block+0x0/0x120[ext4]
[<ffffffffa00e4896>]?ext4_write_begin+0x226/0x2d0[ext4]
[<ffffffffa00e06f0>]?ext4_get_block+0x0/0x120[ext4]
[<ffffffffa00e4ac8>]?ext4_da_write_begin+0x188/0x200[ext4]
[<ffffffffa00ab63f>]?jbd2_journal_dirty_metadata+0xff/0x150[jbd2]
[<ffffffff814ff6f6>]?down_read+0x16/0x30
[<ffffffff81114ab3>]?generic_file_buffered_write+0x123/0x2e0
[<ffffffff810724c7>]?current_fs_time+0x27/0x30
[<ffffffff81116450>]?__generic_file_aio_write+0x250/0x480
[<ffffffff8113f1c7>]?handle_pte_fault+0xf7/0xb50
[<ffffffff811166ef>]?generic_file_aio_write+0x6f/0xe0
[<f
fffffffa00d9131>]?ext4_file_write+0x61/0x1e0[ext4]
[<ffffffff8117ad6a>]?do_sync_write+0xfa/0x140
[<ffffffff810920d0>]?autoremove_wake_function+0x0/0x40
[<ffffffff810edfc2>]?ring_buffer_lock_reserve+0xa2/0x160
5
剩余31页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0