eCryptfs 综合篇
README
- 作者:邢万里
- 学校:重庆邮电大学
- email:wlxing@yahoo.com
eCryptfs模块入口(ecryptfs_init()
函数)
eCryptfs模块出口(ecryptfs_exit()
函数)
挂载eCryptfs(ecryptfs_mount()
函数)
关联知识
BDI:
(1)定义:
bdi,即是backing device info的缩写,根据英文单词全称可知其通指备用存储设备相关描述信息,这在内核代码里用一个结构体backing_dev_info
来表示。
(2)分类:
备用存储设备,简单点说就是能够用来存储数据的设备,而这些设备存储的数据能够保证在计算机电源关闭时也不丢失。这样说来,软盘存储设备、光驱存储设备、USB存储设备、硬盘存储设备都是所谓的备用存储设备(后面都用bdi来指示),而内存不是BDI。
(3)作用:
相对于内存来说,bdi设备(比如最常见的硬盘存储设备)的读写速度是非常慢的,因此为了提高系统整体性能,Linux系统对bdi设备的读写内容进行了缓冲,那些读写的数据会临时保存在内存里,以避免每次都直接操作bdi设备,但这就需要在一定的时机(比如每隔5秒、脏数据达到的一定的比率等)把它们同步到bdi设备,否则长久的呆在内存里容易丢失(比如机器突然宕机、重启),而进行间隔性同步工作的进程之前名叫pdflush(老版本内核)。
(4)使用:
一个Linux系统会挂载很多bdi设备,在bdi设备注册(函数:bdi_register(…)
)时,这些bdi设备会以链表的形式组织在全局变量bdi_list下,除了一个比较特别的bdi设备以外,它就是default bdi设备(default_backing_dev_info
结构体),它除了被加进到bdi_list
,还会新建一个bdi-default内核进程。
(5)MMU:mmap()系统调用:
mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。必须以PAGE_SIZE
为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE
整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE
的倍数大小进行映射。
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。
实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。
(6)底层块设备具备的如下功能:
BDI_CAP_NO_ACCT_AND_WRITEBACK
含义为不回写脏页、不统计脏页、不自动统计回写的脏页 。
BDI_CAP_MAP_DIRECT
表示块设备支持mmap操作的MAP_PRIVATE 。
BDI_CAP_MAP_COPY
表示块设备支持mmap操作的MAP_PRIVATE 。
BDI_CAP_READ_MAP
表示块设备支持mmap操作的PROT_READ 。
BDI_CAP_WRITE_MAP
表示块设备支持mmap操作的PROT_WRITE 。
BDI_CAP_EXEC_MAP
表示块设备支持mmap操作的PROT_EXEC 。
(7)eCryptfs:
eCryptfs使用BDI_CAP_MAP_COPY
方式注册BDI,目的:建立“Copy can be mapped”的私有映射,内存区域的写入不会影响到原文件,直到解除映射后,写入原文件。这个标志和前述中的标志是互斥的,只能使用其中一个。此方式英文解释如下:Writes to file mappings created with the MAP_PRIVATE flag perform a copy on write, allocating a new local copy of the page to store the changes. These changes are not made visible to other processes, and do not update the on-disk copy of the file.
注:网上不知道哪个混蛋带头说,此种方法是“无论如何任何修改都不会写入磁盘”,这个错误的结论在网上到处被转载,应该是不会被其他的进程修改,切记切记!