我的假设(这似乎是不正确的)是 ecryptfs(通常是 FUSE 文件系统)使用以下堆栈机制:
- 用户代码问题
read()
- 内核尝试满足来自现有(未加密)缓冲区的请求
- 缓冲区不存在,内核要求 ecryptfs 加载块
- ecryptfs 要求内核加载物理(加密)块,内核执行此操作并将其存储在缓冲区缓存中
- ecryptfs解密物理块
- 内核将解密的块存储在缓冲区高速缓存中
- 后续读取是从缓存中的解密块完成的
然而,比较加密和非加密文件系统上相同操作的“sys”时间,看来缓存中唯一的缓冲区是加密的,并且 ecryptfs 在每个read()
.上图为保险丝主页没有提到缓冲区缓存,但似乎表明操作发生在系统调用级别,而不是块级别。
熟悉 ecryptfs(达斯汀?)或 FUSE 内部结构的人可以回答这个问题吗?