BlockCache开发中的问题

问题一:内核开发中的内存分配问题
----我目前正在开发BlockCache,它是利用内存对块设备的读写进行加速的缓存,那么显然我们需要内核中的空间作为缓存空间。但是对于用惯了操作系统提供的内存分配接口的我来说,如何获得内核的内存空间就是知识盲区了。在看了几个小时的内存分配模块的源代码后,我发现了这个玩意:


----然后我就明白了,还是直接用Box就行了,这是GPT给的方法:

----但是我还是有些不解,Vec分配的空间在DragonOS里面是怎么被分配的,而在linux操作系统中Vec分配的空间又是怎么被分配,linux中Vec会触发系统调用吗

问题二:代码该写在哪里
----上面提到BlockCache是利用内存对块设备的读写进行加速的缓存,那么既然是cache,我最直接的思路就是,在块设备的读写的接口进行截胡,每次有人调用块设备的读写接口之前我都对cache进行询问,这样就可以实现cache的功能了。

----于是我找到了Driver模块中的Block模块,里面定义了一个BlockDevice的trait:
image
----显然,只要在这里面做手脚,就可以实现cache的功能了。当然,古语有云:“代码要对修改封闭,对扩展开放”,我希望少对里面的方法进行修改,多增加一些默认实现的方法(因为这样就不至于要给每个设备都再实现一遍这个方法)。

----但是现在有一个问题,我默认实现了一个cache_read方法作为对cache的查询方法,但是对块设备的读写的接口的reat_at方法,它不是一个默认实现的方法,这就意味着,我必须要深入到各个块设备对reat_at方法的实现中我才能插入对cache的查询,这显然很不优雅。

----我目前的解决办法是,再增加一个read函数,它可以先进行cache的查询再调用read_at方法,这样调用这个read函数就可以达到cache的目的了。它也有一个问题,就是现在很多代码都使用了read_at函数,如果要更换接口,是不是也不太优雅?

----所以目前我对我选择编写代码的位置产生了怀疑,是否这个BlockCache的代码一个写在这个BlockDevice的trait里面

这个可以使用AlignedBox,因为你将来开发pagecache的话,应该需要要求这玩意4k对齐

会使用内核的分配器进行分配:
https://code.dragonos.org.cn/xref/DragonOS/kernel/src/lib.rs?r=7a29d4fcbcd89a226289c7bf541c2c78623de3ad#93

这里设置了内核的全局分配器的实例。任何动态分配的操作,底层都会转换为调用这个实例的GlobalAlloctrait的调用:
https://code.dragonos.org.cn/xref/DragonOS/kernel/src/mm/allocator/kernel_allocator.rs?r=7b32f5080f42bcbf7d2421013f3ea53c776a063c#85

我感觉这样是可行的

你在用户空间写的Vec的内存分配是通过标准库/C库里面的方法,然后在DragonOS里我们相当于是重载了这个方法,所以你直接用Vec、Box之类的结构体,它就可以给你分配好内存了。Linux的内存分配一般都是用kmalloc来分配内存,然后linux里好像不会用Vec这种动态的数据结构吧,至少我还没见过