Linux内核中的dm-crypt模块的异步IO改造---blog18---项目总结

2021SC@SUDSC

目录

    • 项目总结
    • 个人总结

项目总结

通过我们小组的共同学习,我们已经基本掌握了Linux内核编译、Linux设备驱动程序的使用以及Linux内核中的密码子系统、异步队列、内核多线程、模块等技术,掌握了核心代码dm-crypt的具体原理及实现。

所以对于项目开始提出的问题:加密卡一次只能处理一个sector(512字节)的数据,虽然利用IO技术提高了性能,但是对于更快的新加密卡,处理速度仍然很慢,想要使用异步和多线程机制完全发掘新加密卡的性能。

通过这一学期的源码分析以及其他知识的学习,认为可以把队列中的相邻甚至不相邻的sector合并到一个scatterlist里面进行DMA,这样就需要修改源代码内容,自己设计一个效率更高的请求队列。我们认为整个异步的效率的关键在数据的准备和DMA上,对于数据处理流程:准备数据—>DMA—>等待—>DMA—>转发数据,这里的数据的准备与转发和DMA与等待可以使用多线程并发完成。但是考虑到让DMA和硬件引擎满负荷,那么就可以设置两个线程:一个用于DMA—>等待—>DMA,另一个用于数据的准备与转发。此外需要准备两块内存,一块用于DMA,一块用于数据的转发与准备。因为CPU的速度远大于外设,对于不涉及内存拷贝,数据的准备和转发的线程要更快一些,这样就达到了让DMA对应的线程基本满负荷运转的效果。如果硬件支持流式处理,也就是说在处理上一块数据的时候就可以继续DMA下一块数据,那么就真正可以做到让DMA满负荷了。另外,scatterlist是为DMA传输准备的,但是dm-crypt传给算法的scatterlist是否可以直接去DMA需要去实践。因为对于一些只支持24位总线寻址的设备,高地址的scatterlist就不能DMA。而dm-crypt直接将bio的page设置给scatterlist,这个page能否DMA也是需要实践的。但是,可以去创建pci设备相关的dma内存,然后把数据拷贝过去,虽然数据拷贝很费时,但这是数据的准备和转发要做的事情,那就可以让它和DMA并行。

因为课程只要求进行源码分析,项目实现不作为考核要求,但我们小组成员还是希望将所学的知识用于实践,决定利用寒假时间将上述分析的方案进行实践。

个人总结

从最初的选题到组队再到小组分工,都做了许多的决定。之所以选这个题目,是因为以前很少接触Linux,想借这个课程学习一下Linux内核的相关内容,现在看来,已经达到了预期的要求。项目开始初期学习Linux的架构,Linux内核的相关架构,然后就是Linux内核的编译了。在Linux的内核编译阶段,花费了我很长一段时间,在安装模块阶段,一直报有个文件缺失,在网上找了很多资料,都没有对该错误的解释,然后小组讨论也没有解决,一度想要放弃。但是因为这是小组项目,需要大家共同努力,最后我决定去学习Makefile的相关语法,然后深入分析Linux内核源码的架构,最终将问题解决,这也给了我极大的信息。接着有学习的git的使用,cryptsetup加密工具的使用,在学会使用了之后,又结合源代码学习了cryptsetup加密工具的基本原理和机制。最后深入分析了Device Mapper机制和dm-crypt模块的源代码,得到了dm-crypt模块的异步IO改造相关方案。

通过这个课程,不仅学到了很多知识,也锻炼了小组合作的能力。因为这个项目内容较多,在比较短的时间的内分析得到一个较为全面的结果,那就需要小组成员共同努力,一个人解决不了的困难,就需要小组成员共同努力去解决。此外,小组成员的分工不同,如何将每个人所学的对接起来也是一项考验,如果自己的分析内容涉及到其他成员的内容,其他成员能够较为简单明了给出你所需要的分析,这样就加快的项目的推进。总的来说,通过这个课程,既学到了知识,也锻炼了技能。

你可能感兴趣的:(软件工程应用与实践,linux)