Open utterances-bot opened 2 years ago
因为 OSInode 也是要一种要放到进程文件描述符表中
不通顺
上一页简易文件系统easy-fs的实现中为什么要把 DiskInode 的 _data_blocks 再封装成 data_blocks,感觉写成两个函数有点冗余,请问是有什么考量吗
@wei-huan 由于时间仓促没有好好整理代码,这里确实有些冗余。
请问virtio-drivers中VirtIOBlk
的read_block
和write_block
实现是否也要求传入的buf
所在的物理内存地址区域是连续的?我在物理页不连续的内核栈上调用read_block
时会读到一些脏数据,会是这里的问题吗?
请问virtio-drivers中
VirtIOBlk
的read_block
和write_block
实现是否也要求传入的buf
所在的物理内存地址区域是连续的?我在物理页不连续的内核栈上调用read_block
时会读到一些脏数据,会是这里的问题吗?
@Direktor799 是这样的,目前virtio-drivers还不支持物理地址不连续的缓冲区,详见这里。
@wyfcyx 感谢回复,教程中似乎并没有对此做相关处理,是否可以在kernel中单独分配一些物理页用作VirtIOBlk
读写操作的缓冲?在操作BlockCache
时读写这些固定的物理页面。
或是将类似功能集成到virtio-drivers中,在virtio_dma_alloc
时再多请求一些用于缓冲的物理页,会是好的实现吗?
@wyfcyx 感谢回复,教程中似乎并没有对此做相关处理,是否可以在kernel中单独分配一些物理页用作
VirtIOBlk
读写操作的缓冲?在操作BlockCache
时读写这些固定的物理页面。 或是将类似功能集成到virtio-drivers中,在virtio_dma_alloc
时再多请求一些用于缓冲的物理页,会是好的实现吗?
@Direktor799 听起来不错。
@Direktor799 哈哈,你这个想法和OSTEP里Filesystem Implementation这一章里Caching and Buffering里提到的好像,有Static和Dynamic partition,不过感觉是个大工程,我也挺有兴趣实现的。有兴趣的话可以参考上面提到的书中的章节,可以一起实现下试试。
@PeterWrighten 简单阅读了一下对应的章节,感觉上一章的BlockCacheManager
就已经是Dynamic比较好的实现了,只需要更新Cache替换算法即可。而之前的comment主要是针对加载BlockCache
时dma在物理地址上顺序读写,但虚拟地址实际对应的物理地址不连续导致的问题,已经通过BuddySystem解决。
@PeterWrighten 简单阅读了一下对应的章节,感觉上一章的
BlockCacheManager
就已经是Dynamic比较好的实现了,只需要更新Cache替换算法即可。而之前的comment主要是针对加载BlockCache
时dma在物理地址上顺序读写,但虚拟地址实际对应的物理地址不连续导致的问题,已经通过BuddySystem解决。
@Direktor799 好的,谢谢。但那一章感觉是在讲分页内存和文件系统内存的动态分割,也可能是我理解错了。
从Qemu for RISC-V 64 平台的 源码 中可以找到 VirtIO 外设总线的 MMIO 物理地址区间为从 0x10001000 开头的 4KiB 。
这里链接的源码的位置有些偏移,现在在这里。
[VIRT_VIRTIO] = { 0x10001000, 0x1000 },
左边是起始位置,右边是大小。
这节是不是应该多介绍一下,接入文件系统后,fork系统调用实现的变化,以及父子进程并发读写的行为及实现。
目前文档的参考代码的对于 virtio-drivers 的依赖版本应该是早期的版本。virtio-drivers 0.3.0 近期发布了,目前仓库的代码没法直接使用 0.3.0 的版本。
发现一个问题,通过刻录程序向文件系统写入最后一个bin的时候会产生写入失败的情况,在os中读取数据为空,而在写入之后再get_block_cache一次就不会产生没落盘的现象,这个点我还觉得挺奇怪的,希望有大佬能解答一下😂
尝试了一下在烧录程序完成后,在block_cache.rs中实现了一个sync_all_cache,然后手动进行sync的操作,通过这个方法能保证落盘了,看起来是BlockCache的Drop在Manager中没生效
查了一下lazy_static是不会释放对应的对象的,也就是说保存在BLOCK_MANAGER里面的cache块是不会drop的,这就是原因
发现少实现了一个block_cache_sync_all的函数😂,怪不得出了这个问题
在内核中接入 easy-fs — rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档
https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter6/3using-easy-fs-in-kernel.html