我是 Linux 内核的新手,刚刚开始了解它是如何zram
工作的。初始测试,我看到它是在初始化之后READ
发布的。但我只是想知道,为什么会这样?WRITE
zram
作为一项活动,我采用dump_stack()
并遵循路径表单,了解如何zram
执行此读取。
zram
了解此信息是否必须执行READ
或WRITE
操作已发布bio->bi_rw
。代码流就像是从驱动程序中zram_make_request
调用 API 。并在内部调用了调用API。create_device
zram
zram_make_request
__zram_make_request
zram_bvec_rw
在zram_bvec_rw
API 中检查可用信息bio->bi_rw
并相应地发出READ
andWRITE
调用。
现在,在这种情况下发生了什么:READ
被封装在bio
结构本身中。作为分流,我发现submit_bh
填充了所有条目bio
并发布了submit_bio
.
我想知道谁实际上将 as 设置bio->bi_rw
为READ
. 通过启用少量打印,我发现ll_rw_block
API 被__block_write_begin
with调用READ
,稍后ll_rw_block
调用submit_bh
API 填充其余bio
结构条目。
但我仍然没有得到答案,为什么从 fromREAD
发出?ll_rw_block
__block_write_begin
- zram 驱动程序:
if (!buffer_uptodate(bh) && !buffer_delay(bh) &&
!buffer_unwritten(bh) &&
(block_start < from || block_end > to)) {
ll_rw_block(READ, 1, &bh);
*wait_bh++=bh;
}
buffer_uptodate(bh), /* Contains valid data */
buffer_delay(bh), /* Buffer is not yet allocated on disk */
buffer_unwritten(bh), /* Buffer is allocated on disk but not written */
请问有人可以解释/回答我的问题吗?
我如何得出在写之前执行读取的结论?
我只是检查num_reads
和num_writes
计数。并且当我们这样做并且在调用最终计数之后找到时,num_reads
计数被设置为。1
num_writes
0
mkswap /dev/block/zram0
swapon /dev/block/zram0
num_reads = 2 and num_writes=1
注意:这是我们不执行任何其他zram
活动时的情况。如上所述,我们得到了这种行为。