eCryptfs - Bonus

eCryptfs 综合篇

README

  • 作者:邢万里
  • 学校:重庆邮电大学
  • email:wlxing@yahoo.com

eCryptfs模块入口(ecryptfs_init()函数)

eCryptfs模块出口(ecryptfs_exit()函数)

挂载eCryptfs(ecryptfs_mount()函数)

关联知识

  1. 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.
    注:网上不知道哪个混蛋带头说,此种方法是“无论如何任何修改都不会写入磁盘”,这个错误的结论在网上到处被转载,应该是不会被其他的进程修改,切记切记!

创建eCryptfs文件(ecryptfs_create()函数)

打开eCryptfs文件(ecryptfs_open()函数)

读取eCryptfs文件(ecryptfs_readpage()函数)

写入eCryptfs文件(ecryptfs_writepage()函数)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值