@@ -480,7 +480,7 @@ <h3>Qemu 模拟器平台<a class="headerlink" href="#qemu" title="永久链接
480480< li > < p > 第 12 行,我们为虚拟机添加一块虚拟硬盘,内容为我们之前通过 < code class ="docutils literal notranslate "> < span class ="pre "> easy-fs-fuse</ span > </ code > 工具打包的包含应用 ELF 的 easy-fs 镜像,并命名为 < code class ="docutils literal notranslate "> < span class ="pre "> x0</ span > </ code > 。</ p > </ li >
481481< li > < p > 第 13 行,我们将硬盘 < code class ="docutils literal notranslate "> < span class ="pre "> x0</ span > </ code > 作为一个 VirtIO 总线中的一个块设备接入到虚拟机系统中。 < code class ="docutils literal notranslate "> < span class ="pre "> virtio-mmio-bus.0</ span > </ code > 表示 VirtIO 总线通过 MMIO 进行控制,且该块设备在总线中的编号为 0 。</ p > </ li >
482482</ ul >
483- < p > < strong > 内存映射 I/O</ strong > (MMIO, Memory-Mapped I/O) 指的是外设的设备寄存器可以通过特定的物理内存地址来访问,每个外设的设备寄存器都分布在没有交集的一个或数个物理地址区间中,不同外设的设备寄存器所占的物理地址空间也不会产生交集,且这些外设物理地址区间也不会和RAM的物理内存所在的区间存在交集(注:在后续的外设相关章节有更深入的讲解)。从Qemu for RISC-V 64 平台的 < a class ="reference external " href ="https://github.com/qemu/qemu/blob/master /hw/riscv/virt.c#L58 "> 源码</ a > 中可以找到 VirtIO 外设总线的 MMIO 物理地址区间为从 0x10001000 开头的 4KiB 。为了能够在内核中访问 VirtIO 外设总线,我们就必须在内核地址空间中对特定内存区域提前进行映射:</ p >
483+ < p > < strong > 内存映射 I/O</ strong > (MMIO, Memory-Mapped I/O) 指的是外设的设备寄存器可以通过特定的物理内存地址来访问,每个外设的设备寄存器都分布在没有交集的一个或数个物理地址区间中,不同外设的设备寄存器所占的物理地址空间也不会产生交集,且这些外设物理地址区间也不会和RAM的物理内存所在的区间存在交集(注:在后续的外设相关章节有更深入的讲解)。从Qemu for RISC-V 64 平台的 < a class ="reference external " href ="https://github.com/qemu/qemu/blob/f1dd640896ee2b50cb34328f2568aad324702954 /hw/riscv/virt.c#L83 "> 源码</ a > 中可以找到 VirtIO 外设总线的 MMIO 物理地址区间为从 0x10001000 开头的 4KiB 。为了能够在内核中访问 VirtIO 外设总线,我们就必须在内核地址空间中对特定内存区域提前进行映射:</ p >
484484< div class ="highlight-rust notranslate "> < div class ="highlight "> < pre > < span > </ span > < span class ="c1 "> // os/src/config.rs</ span >
485485
486486< span class ="cp "> #[cfg(feature = </ span > < span class ="s "> "board_qemu"</ span > < span class ="cp "> )]</ span >
@@ -871,7 +871,7 @@ <h3>打开与关闭文件<a class="headerlink" href="#id10" title="永久链接
871871< span class ="w "> </ span > < span class ="n "> path</ span > < span class ="p "> .</ span > < span class ="n "> as_str</ span > < span class ="p "> (),</ span >
872872< span class ="w "> </ span > < span class ="n "> OpenFlags</ span > ::< span class ="n "> from_bits</ span > < span class ="p "> (</ span > < span class ="n "> flags</ span > < span class ="p "> ).</ span > < span class ="n "> unwrap</ span > < span class ="p "> ()</ span >
873873< span class ="w "> </ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="p "> {</ span >
874- < span class ="w "> </ span > < span class ="kd "> let</ span > < span class ="w "> </ span > < span class ="k "> mut</ span > < span class ="w "> </ span > < span class ="n "> inner</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> task</ span > < span class ="p "> .</ span > < span class ="n "> acquire_inner_lock </ span > < span class ="p "> ();</ span >
874+ < span class ="w "> </ span > < span class ="kd "> let</ span > < span class ="w "> </ span > < span class ="k "> mut</ span > < span class ="w "> </ span > < span class ="n "> inner</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> task</ span > < span class ="p "> .</ span > < span class ="n "> inner_exclusive_access </ span > < span class ="p "> ();</ span >
875875< span class ="w "> </ span > < span class ="kd "> let</ span > < span class ="w "> </ span > < span class ="n "> fd</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> inner</ span > < span class ="p "> .</ span > < span class ="n "> alloc_fd</ span > < span class ="p "> ();</ span >
876876< span class ="w "> </ span > < span class ="n "> inner</ span > < span class ="p "> .</ span > < span class ="n "> fd_table</ span > < span class ="p "> [</ span > < span class ="n "> fd</ span > < span class ="p "> ]</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="nb "> Some</ span > < span class ="p "> (</ span > < span class ="n "> inode</ span > < span class ="p "> );</ span >
877877< span class ="w "> </ span > < span class ="n "> fd</ span > < span class ="w "> </ span > < span class ="k "> as</ span > < span class ="w "> </ span > < span class ="kt "> isize</ span >
0 commit comments