问题一:内核开发中的内存分配问题
----我目前正在开发BlockCache,它是利用内存对块设备的读写进行加速的缓存,那么显然我们需要内核中的空间作为缓存空间。但是对于用惯了操作系统提供的内存分配接口的我来说,如何获得内核的内存空间就是知识盲区了。在看了几个小时的内存分配模块的源代码后,我发现了这个玩意:
----然后我就明白了,还是直接用Box就行了,这是GPT给的方法:
----但是我还是有些不解,Vec分配的空间在DragonOS里面是怎么被分配的,而在linux操作系统中Vec分配的空间又是怎么被分配,linux中Vec会触发系统调用吗
问题二:代码该写在哪里
----上面提到BlockCache是利用内存对块设备的读写进行加速的缓存,那么既然是cache,我最直接的思路就是,在块设备的读写的接口进行截胡,每次有人调用块设备的读写接口之前我都对cache进行询问,这样就可以实现cache的功能了。
----于是我找到了Driver模块中的Block模块,里面定义了一个BlockDevice的trait:
----显然,只要在这里面做手脚,就可以实现cache的功能了。当然,古语有云:“代码要对修改封闭,对扩展开放”,我希望少对里面的方法进行修改,多增加一些默认实现的方法(因为这样就不至于要给每个设备都再实现一遍这个方法)。
----但是现在有一个问题,我默认实现了一个cache_read方法作为对cache的查询方法,但是对块设备的读写的接口的reat_at方法,它不是一个默认实现的方法,这就意味着,我必须要深入到各个块设备对reat_at方法的实现中我才能插入对cache的查询,这显然很不优雅。
----我目前的解决办法是,再增加一个read函数,它可以先进行cache的查询再调用read_at方法,这样调用这个read函数就可以达到cache的目的了。它也有一个问题,就是现在很多代码都使用了read_at函数,如果要更换接口,是不是也不太优雅?
----所以目前我对我选择编写代码的位置产生了怀疑,是否这个BlockCache的代码一个写在这个BlockDevice的trait里面