磁盤驅(qū)動就是實現(xiàn)磁盤空間和內(nèi)存空間數(shù)據(jù)上的交互,在上一篇中我們討論了內(nèi)存端的Page Segment Block Sector相關的概念,本文以3.14內(nèi)核為例,討論這部分內(nèi)存是如何被組織管理的。我們知道,為了解決CPU和內(nèi)存的速度不匹配,計算機系統(tǒng)引入了Cache緩存機制,這種硬件Cache的速度接近CPU內(nèi)部寄存器的速度,可以提高系統(tǒng)效率,同樣的思路也適用于解決內(nèi)存和磁盤的速度不匹配問題,此外,磁盤多是機械式的,從壽命的角度考慮也不適合頻繁讀寫,所以內(nèi)核就將一部分內(nèi)存作為緩存,提高磁盤訪問速度的同時延長磁盤壽命,這種緩存就是磁盤高速緩存。包括頁高速緩存(Page Cache,對完整數(shù)據(jù)頁進行操作的磁盤高速緩存) + 目錄項高速緩存(Dentry Cache,描述文件系統(tǒng)路徑名的目錄項對象) + 索引節(jié)點高速緩存(Buffer Cache,存放的是描述磁盤索引節(jié)點的索引節(jié)點對象),本文主要討論頁高速緩存,有了頁高速緩存,內(nèi)核的代碼和數(shù)據(jù)結構不必從磁盤讀,也不必寫入磁盤。頁高速緩存可以看作特定文件系統(tǒng)層的一部分。
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
└── vfs_read(f.file, buf, count, &pos);
└──file->f_op->read(file, buf, count, pos);
└──do_sync_read(file, buf, count, pos);
└──filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos);
├──generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos)
└──filemap_write_and_wait_range(mapping, pos, pos + iov_length(iov, nr_segs) - 1);
-----------------------------------Page Cache----------------------------------------------------
int mpage_readpage(struct page *page, get_block_t get_block)