rcore-os / rCore-Tutorial-Book-v3

A book about how to write OS kernels in Rust easily.
https://rcore-os.github.io/rCore-Tutorial-Book-v3/
GNU General Public License v3.0
1.23k stars 233 forks source link

rCore-Tutorial-Book-v3/chapter6/3using-easy-fs-in-kernel #104

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

在内核中接入 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

lindyang commented 2 years ago

因为 OSInode 也是要一种要放到进程文件描述符表中

不通顺

wei-huan commented 2 years ago

上一页简易文件系统easy-fs的实现中为什么要把 DiskInode 的 _data_blocks 再封装成 data_blocks,感觉写成两个函数有点冗余,请问是有什么考量吗

wyfcyx commented 2 years ago

@wei-huan 由于时间仓促没有好好整理代码,这里确实有些冗余。

Direktor799 commented 2 years ago

请问virtio-drivers中VirtIOBlkread_blockwrite_block实现是否也要求传入的buf所在的物理内存地址区域是连续的?我在物理页不连续的内核栈上调用read_block时会读到一些脏数据,会是这里的问题吗?

wyfcyx commented 2 years ago

请问virtio-drivers中VirtIOBlkread_blockwrite_block实现是否也要求传入的buf所在的物理内存地址区域是连续的?我在物理页不连续的内核栈上调用read_block时会读到一些脏数据,会是这里的问题吗?

@Direktor799 是这样的,目前virtio-drivers还不支持物理地址不连续的缓冲区,详见这里

Direktor799 commented 2 years ago

@wyfcyx 感谢回复,教程中似乎并没有对此做相关处理,是否可以在kernel中单独分配一些物理页用作VirtIOBlk读写操作的缓冲?在操作BlockCache时读写这些固定的物理页面。 或是将类似功能集成到virtio-drivers中,在virtio_dma_alloc时再多请求一些用于缓冲的物理页,会是好的实现吗?

wyfcyx commented 2 years ago

@wyfcyx 感谢回复,教程中似乎并没有对此做相关处理,是否可以在kernel中单独分配一些物理页用作VirtIOBlk读写操作的缓冲?在操作BlockCache时读写这些固定的物理页面。 或是将类似功能集成到virtio-drivers中,在virtio_dma_alloc时再多请求一些用于缓冲的物理页,会是好的实现吗?

@Direktor799 听起来不错。

PeterWrighten commented 2 years ago

@Direktor799 哈哈,你这个想法和OSTEP里Filesystem Implementation这一章里Caching and Buffering里提到的好像,有Static和Dynamic partition,不过感觉是个大工程,我也挺有兴趣实现的。有兴趣的话可以参考上面提到的书中的章节,可以一起实现下试试。

Direktor799 commented 2 years ago

@PeterWrighten 简单阅读了一下对应的章节,感觉上一章的BlockCacheManager就已经是Dynamic比较好的实现了,只需要更新Cache替换算法即可。而之前的comment主要是针对加载BlockCache时dma在物理地址上顺序读写,但虚拟地址实际对应的物理地址不连续导致的问题,已经通过BuddySystem解决

PeterWrighten commented 2 years ago

@PeterWrighten 简单阅读了一下对应的章节,感觉上一章的BlockCacheManager就已经是Dynamic比较好的实现了,只需要更新Cache替换算法即可。而之前的comment主要是针对加载BlockCache时dma在物理地址上顺序读写,但虚拟地址实际对应的物理地址不连续导致的问题,已经通过BuddySystem解决

@Direktor799 好的,谢谢。但那一章感觉是在讲分页内存和文件系统内存的动态分割,也可能是我理解错了。

whfuyn commented 2 years ago

从Qemu for RISC-V 64 平台的 源码 中可以找到 VirtIO 外设总线的 MMIO 物理地址区间为从 0x10001000 开头的 4KiB 。

这里链接的源码的位置有些偏移,现在在这里

    [VIRT_VIRTIO] =       { 0x10001000,        0x1000 },

左边是起始位置,右边是大小。

typhigh commented 2 years ago

这节是不是应该多介绍一下,接入文件系统后,fork系统调用实现的变化,以及父子进程并发读写的行为及实现。

CelestialMelody commented 1 year ago

目前文档的参考代码的对于 virtio-drivers 的依赖版本应该是早期的版本。virtio-drivers 0.3.0 近期发布了,目前仓库的代码没法直接使用 0.3.0 的版本。

SnowWarri0r commented 5 months ago

发现一个问题,通过刻录程序向文件系统写入最后一个bin的时候会产生写入失败的情况,在os中读取数据为空,而在写入之后再get_block_cache一次就不会产生没落盘的现象,这个点我还觉得挺奇怪的,希望有大佬能解答一下😂

SnowWarri0r commented 5 months ago

尝试了一下在烧录程序完成后,在block_cache.rs中实现了一个sync_all_cache,然后手动进行sync的操作,通过这个方法能保证落盘了,看起来是BlockCache的Drop在Manager中没生效

SnowWarri0r commented 5 months ago

查了一下lazy_static是不会释放对应的对象的,也就是说保存在BLOCK_MANAGER里面的cache块是不会drop的,这就是原因

SnowWarri0r commented 5 months ago

发现少实现了一个block_cache_sync_all的函数😂,怪不得出了这个问题