Lab1.html 97 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. <!DOCTYPE html>
  2. <html lang="en-US">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <title>文件系统 | 操作系统实验</title>
  7. <meta name="generator" content="VuePress 1.9.10">
  8. <meta name="description" content="Welcome!">
  9. <link rel="preload" href="/OS_lab_tutorial/assets/css/0.styles.dbcc0abd.css" as="style"><link rel="preload" href="/OS_lab_tutorial/assets/js/app.de832b6b.js" as="script"><link rel="preload" href="/OS_lab_tutorial/assets/js/2.6cca19a7.js" as="script"><link rel="preload" href="/OS_lab_tutorial/assets/js/1.2e5d3cee.js" as="script"><link rel="preload" href="/OS_lab_tutorial/assets/js/35.38b1a166.js" as="script"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/10.e3ae3b6e.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/11.c389195a.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/12.15e02b09.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/13.e100960d.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/14.3675c8e8.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/15.5542c093.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/16.01c35b5f.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/17.bd8d538c.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/18.6d3b94c1.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/19.eb35cfee.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/20.c11ec329.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/21.160e1109.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/22.8c6c68bf.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/23.6c245a02.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/24.c2cc382b.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/25.3a441277.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/26.7dca1b95.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/27.9fdfa008.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/28.ea152bf8.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/29.310b119e.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/3.5322f14a.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/30.1be87618.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/31.e60e769a.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/32.ed12ff5e.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/33.d0e6ffd8.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/34.fb25dd7d.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/36.f2dcdc62.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/37.85edb076.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/38.a07efacb.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/39.2e2bced7.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/4.ba0ffc9e.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/40.7564ba2d.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/41.7bc98649.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/42.ee9b7b13.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/43.dbdee45b.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/44.f24405f8.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/45.bebd92ee.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/46.5d70de3f.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/47.0df811bd.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/48.3f21f3a0.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/49.4ceb6d85.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/5.1674539b.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/50.9d21087d.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/51.760bed26.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/52.78b43a02.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/53.fd428cc4.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/54.4937721a.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/55.b040b54f.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/56.f538318b.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/57.47c5385e.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/58.c8103992.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/59.7a4c397a.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/6.44f67c6a.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/60.1f64a100.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/61.8ebdd979.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/62.6cab9dfb.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/63.380a795e.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/64.57bfd1e1.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/65.54ffadf5.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/66.dccb9c04.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/7.21830bc0.js"><link rel="prefetch" href="/OS_lab_tutorial/assets/js/vendors~docsearch.cf079a49.js">
  10. <link rel="stylesheet" href="/OS_lab_tutorial/assets/css/0.styles.dbcc0abd.css">
  11. </head>
  12. <body>
  13. <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/OS_lab_tutorial/" class="home-link router-link-active"><!----> <span class="site-name">操作系统实验</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/OS_lab_tutorial/" class="nav-link">
  14. 首页
  15. </a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Linux" class="dropdown-title"><span class="title">Linux</span> <span class="arrow down"></span></button> <button type="button" aria-label="Linux" class="mobile-dropdown-title"><span class="title">Linux</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
  16. 实验教程
  17. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab1.html" class="nav-link">
  18. 实验1-熟悉类Linux系统
  19. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab2.html" class="nav-link">
  20. 实验2-进程创建与进程间通信
  21. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab3/" class="nav-link">
  22. 实验3-进程调度算法
  23. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab4/" class="nav-link">
  24. 实验4-存储管理算法
  25. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab5.html" class="nav-link">
  26. 实验5-文件管理系统
  27. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab6.html" class="nav-link">
  28. 实验6-网络编程(暂定)
  29. </a></li></ul></li><li class="dropdown-item"><h4>
  30. 课程练习
  31. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab1.html" class="nav-link">
  32. 实验1-熟悉类Linux系统
  33. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab2.html" class="nav-link">
  34. 实验2-进程创建与进程间通信
  35. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab3.html" class="nav-link">
  36. 实验3-进程调度算法
  37. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab4.html" class="nav-link">
  38. 实验4-存储管理算法
  39. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab5.html" class="nav-link">
  40. 实验5-文件管理系统
  41. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab6.html" class="nav-link">
  42. 实验6-网络编程(暂定)
  43. </a></li></ul></li><li class="dropdown-item"><h4>
  44. 附录
  45. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab1.html" class="nav-link">
  46. 实验1-熟悉类Linux系统
  47. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab2.html" class="nav-link">
  48. 实验2-进程创建与进程间通信
  49. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab3.html" class="nav-link">
  50. 实验3-进程调度算法
  51. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab4.html" class="nav-link">
  52. 实验4-存储管理算法
  53. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab5.html" class="nav-link">
  54. 实验5-文件管理系统
  55. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab6.html" class="nav-link">
  56. 实验6-网络编程(暂定)
  57. </a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="DragonOS" class="dropdown-title"><span class="title">DragonOS</span> <span class="arrow down"></span></button> <button type="button" aria-label="DragonOS" class="mobile-dropdown-title"><span class="title">DragonOS</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
  58. 实验教程
  59. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/DragonOS/Lab/Lab1.html" class="nav-link">
  60. 实验-文件系统
  61. </a></li></ul></li><li class="dropdown-item"><h4>
  62. 课程练习
  63. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html" aria-current="page" class="nav-link router-link-exact-active router-link-active">
  64. 实验-文件系统
  65. </a></li></ul></li><li class="dropdown-item"><h4>
  66. 附录
  67. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/DragonOS/Appendix/Lab1.html" class="nav-link">
  68. 实验-文件系统
  69. </a></li></ul></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/OS_lab_tutorial/" class="nav-link">
  70. 首页
  71. </a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Linux" class="dropdown-title"><span class="title">Linux</span> <span class="arrow down"></span></button> <button type="button" aria-label="Linux" class="mobile-dropdown-title"><span class="title">Linux</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
  72. 实验教程
  73. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab1.html" class="nav-link">
  74. 实验1-熟悉类Linux系统
  75. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab2.html" class="nav-link">
  76. 实验2-进程创建与进程间通信
  77. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab3/" class="nav-link">
  78. 实验3-进程调度算法
  79. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab4/" class="nav-link">
  80. 实验4-存储管理算法
  81. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab5.html" class="nav-link">
  82. 实验5-文件管理系统
  83. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Lab/Lab6.html" class="nav-link">
  84. 实验6-网络编程(暂定)
  85. </a></li></ul></li><li class="dropdown-item"><h4>
  86. 课程练习
  87. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab1.html" class="nav-link">
  88. 实验1-熟悉类Linux系统
  89. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab2.html" class="nav-link">
  90. 实验2-进程创建与进程间通信
  91. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab3.html" class="nav-link">
  92. 实验3-进程调度算法
  93. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab4.html" class="nav-link">
  94. 实验4-存储管理算法
  95. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab5.html" class="nav-link">
  96. 实验5-文件管理系统
  97. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Assignment/Lab6.html" class="nav-link">
  98. 实验6-网络编程(暂定)
  99. </a></li></ul></li><li class="dropdown-item"><h4>
  100. 附录
  101. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab1.html" class="nav-link">
  102. 实验1-熟悉类Linux系统
  103. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab2.html" class="nav-link">
  104. 实验2-进程创建与进程间通信
  105. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab3.html" class="nav-link">
  106. 实验3-进程调度算法
  107. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab4.html" class="nav-link">
  108. 实验4-存储管理算法
  109. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab5.html" class="nav-link">
  110. 实验5-文件管理系统
  111. </a></li><li class="dropdown-subitem"><a href="/OS_lab_tutorial/Linux/Appendix/Lab6.html" class="nav-link">
  112. 实验6-网络编程(暂定)
  113. </a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="DragonOS" class="dropdown-title"><span class="title">DragonOS</span> <span class="arrow down"></span></button> <button type="button" aria-label="DragonOS" class="mobile-dropdown-title"><span class="title">DragonOS</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
  114. 实验教程
  115. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/DragonOS/Lab/Lab1.html" class="nav-link">
  116. 实验-文件系统
  117. </a></li></ul></li><li class="dropdown-item"><h4>
  118. 课程练习
  119. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html" aria-current="page" class="nav-link router-link-exact-active router-link-active">
  120. 实验-文件系统
  121. </a></li></ul></li><li class="dropdown-item"><h4>
  122. 附录
  123. </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/OS_lab_tutorial/DragonOS/Appendix/Lab1.html" class="nav-link">
  124. 实验-文件系统
  125. </a></li></ul></li></ul></div></div> <!----></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>文件系统</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#补写代码" class="sidebar-link">补写代码</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#创建文件" class="sidebar-link">创建文件</a></li><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#文件读写" class="sidebar-link">文件读写</a></li></ul></li><li><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#实现-myramfs" class="sidebar-link">实现 myramfs</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#open和close" class="sidebar-link">open和close</a></li><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#fopen" class="sidebar-link">fopen</a></li></ul></li><li><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#测试文件系统" class="sidebar-link">测试文件系统</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#创建测试文件夹" class="sidebar-link">创建测试文件夹</a></li><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#配置文件" class="sidebar-link">配置文件</a></li></ul></li><li><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#配置dadk" class="sidebar-link">配置dadk</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#拷贝文件-2" class="sidebar-link">拷贝文件</a></li><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#更改dadk内容" class="sidebar-link">更改dadk内容</a></li></ul></li><li><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#挂载文件系统" class="sidebar-link">挂载文件系统</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#导入" class="sidebar-link">导入</a></li><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#创建文件夹、实例并挂载" class="sidebar-link">创建文件夹、实例并挂载</a></li><li class="sidebar-sub-header"><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#迁移伪文件系统的inode" class="sidebar-link">迁移伪文件系统的inode</a></li></ul></li><li><a href="/OS_lab_tutorial/DragonOS/Assignment/Lab1.html#开始测试" class="sidebar-link">开始测试</a><ul class="sidebar-sub-headers"></ul></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="文件系统"><a href="#文件系统" class="header-anchor">#</a> 文件系统</h1> <h2 id="补写代码"><a href="#补写代码" class="header-anchor">#</a> 补写代码</h2> <h3 id="创建文件"><a href="#创建文件" class="header-anchor">#</a> 创建文件</h3> <p>ramfs的基本功能在/kernel/src/filesystem/ramfs/mod.rs中,实现过程中请参考文件../vfs/mod.rs以及已实现函数的相关代码和注释。在实现基本的文件操作之前,需要先实现创建文件结构的辅助函数:create_with_data。其用于创建文件时,在父目录下创建带初始化数据的inode。</p> <blockquote><p>练习1:实现位于/kernel/src/filesystem/ramfs/mod.rs中的 create_with_data。</p></blockquote> <div class="language-rust extra-class"><pre class="language-rust"><code> <span class="token comment">// 该函数用于在当前目录下创建一个新的inode,并传入一个简单的data字段,方便进行初始化。</span>
  126. <span class="token comment">// 需要判断当前inode是否是文件且是否重名,接着创建inode进行初始化。</span>
  127. <span class="token keyword">fn</span> <span class="token function-definition function">create_with_data</span><span class="token punctuation">(</span>
  128. <span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span>
  129. name<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">str</span><span class="token punctuation">,</span>
  130. file_type<span class="token punctuation">:</span> <span class="token class-name">FileType</span><span class="token punctuation">,</span>
  131. mode<span class="token punctuation">:</span> <span class="token keyword">u32</span><span class="token punctuation">,</span>
  132. data<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>
  133. <span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token class-name">Arc</span><span class="token operator">&lt;</span><span class="token keyword">dyn</span> <span class="token class-name">IndexNode</span><span class="token operator">&gt;</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  134. <span class="token comment">// 获取当前inode</span>
  135. <span class="token keyword">let</span> <span class="token keyword">mut</span> inode <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  136. <span class="token comment">// LAB TODO BEGIN</span>
  137. <span class="token comment">// LAB TODO END</span>
  138. <span class="token comment">// 初始化inode的自引用的weak指针</span>
  139. result<span class="token number">.0</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>self_ref <span class="token operator">=</span> <span class="token class-name">Arc</span><span class="token punctuation">::</span><span class="token function">downgrade</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
  140. <span class="token comment">// 将子inode插入父inode的B树中</span>
  141. inode<span class="token punctuation">.</span>children<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">,</span> result<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  142. <span class="token keyword">return</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
  143. <span class="token punctuation">}</span>
  144. </code></pre></div><h3 id="文件读写"><a href="#文件读写" class="header-anchor">#</a> 文件读写</h3> <p>文件读写是文件系统的基本功能,ramfs的读写操作会将文件数据块中内容读入内存缓冲区,或将缓冲区内容写入对应文件数据块。<code>read_at</code>和 <code>write_at</code>两个函数分别用于以一定偏移量读取和写入一段长度的数据,并且返回实际的读写字节长度 (读取不能超过文件大小)</p> <blockquote><p>练习2:实现位于/kernel/src/filesystem/ramfs/mod.rs中的 read_at和 write_at。</p></blockquote> <div class="language-rust extra-class"><pre class="language-rust"><code> <span class="token comment">// 该函数用于实现对文件以一定偏移量读取一段长度的数据,并且返回实际的读字节长度。</span>
  145. <span class="token comment">// 首先检查当前inode是否为一个文件,然后计算读文件的偏移量,最后拷贝数据(copy_from_slice)。</span>
  146. <span class="token keyword">fn</span> <span class="token function-definition function">read_at</span><span class="token punctuation">(</span>
  147. <span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span>
  148. offset<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>
  149. len<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>
  150. buf<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token punctuation">[</span><span class="token keyword">u8</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  151. _data<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token class-name">FilePrivateData</span><span class="token punctuation">,</span>
  152. <span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token keyword">usize</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  153. <span class="token keyword">if</span> buf<span class="token punctuation">.</span><span class="token function">len</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> len <span class="token punctuation">{</span>
  154. <span class="token keyword">return</span> <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EINVAL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  155. <span class="token punctuation">}</span>
  156. <span class="token comment">// 加锁</span>
  157. <span class="token keyword">let</span> inode<span class="token punctuation">:</span> <span class="token class-name">SpinLockGuard</span><span class="token operator">&lt;</span><span class="token class-name">RamFSInode</span><span class="token operator">&gt;</span> <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  158. <span class="token comment">// LAB TODO BEGIN</span>
  159. <span class="token comment">// LAB TODO END</span>
  160. <span class="token keyword">return</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">len</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  161. <span class="token punctuation">}</span>
  162. <span class="token comment">// 该函数用于实现对文件以一定偏移量写一段长度的数据,并且返回实际的写字节长度。</span>
  163. <span class="token comment">// 首先检查当前inode是否为一个文件,如果文件大小比原来的大,那就resize这个数组,最后将数据写入(copy_from_slice)。</span>
  164. <span class="token keyword">fn</span> <span class="token function-definition function">write_at</span><span class="token punctuation">(</span>
  165. <span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span>
  166. offset<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>
  167. len<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>
  168. buf<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token punctuation">[</span><span class="token keyword">u8</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  169. _data<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token class-name">FilePrivateData</span><span class="token punctuation">,</span>
  170. <span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token keyword">usize</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  171. <span class="token keyword">if</span> buf<span class="token punctuation">.</span><span class="token function">len</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> len <span class="token punctuation">{</span>
  172. <span class="token keyword">return</span> <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EINVAL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  173. <span class="token punctuation">}</span>
  174. <span class="token comment">// 加锁</span>
  175. <span class="token keyword">let</span> <span class="token keyword">mut</span> inode<span class="token punctuation">:</span> <span class="token class-name">SpinLockGuard</span><span class="token operator">&lt;</span><span class="token class-name">RamFSInode</span><span class="token operator">&gt;</span> <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  176. <span class="token comment">// 检查当前inode是否为一个文件夹,如果是的话,就返回错误</span>
  177. <span class="token keyword">if</span> inode<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>file_type <span class="token operator">==</span> <span class="token class-name">FileType</span><span class="token punctuation">::</span><span class="token class-name">Dir</span> <span class="token punctuation">{</span>
  178. <span class="token keyword">return</span> <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EISDIR</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  179. <span class="token punctuation">}</span>
  180. <span class="token comment">// LAB TODO BEGIN</span>
  181. <span class="token comment">// LAB TODO END</span>
  182. <span class="token keyword">return</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span>len<span class="token punctuation">)</span><span class="token punctuation">;</span>
  183. <span class="token punctuation">}</span>
  184. </code></pre></div><h2 id="实现-myramfs"><a href="#实现-myramfs" class="header-anchor">#</a> 实现 myramfs</h2> <blockquote><p>练习3:模仿 ramfs 实现 my_ramfs,并更正 ramfs</p></blockquote> <p>原 ramfs 其实是有点小问题的,需要在 my_ramfs 更正后再测试,具体如下:</p> <h3 id="open和close"><a href="#open和close" class="header-anchor">#</a> open和close</h3> <p>测试代码中打开文件调用的<code>open</code>函数,最终会进行系统调用,在 <strong>kernel/src/syscall</strong> 中,标志是<code>SYS_OPEN</code></p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token constant">SYS_OPEN</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  185. <span class="token keyword">let</span> path<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">CStr</span> <span class="token operator">=</span> <span class="token keyword">unsafe</span> <span class="token punctuation">{</span> <span class="token class-name">CStr</span><span class="token punctuation">::</span><span class="token function">from_ptr</span><span class="token punctuation">(</span>args<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token keyword">as</span> <span class="token operator">*</span><span class="token keyword">const</span> c_char<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  186. <span class="token keyword">let</span> path<span class="token punctuation">:</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token operator">&amp;</span><span class="token keyword">str</span><span class="token punctuation">,</span> <span class="token namespace">core<span class="token punctuation">::</span></span><span class="token keyword">str</span><span class="token punctuation">::</span><span class="token class-name">Utf8Error</span><span class="token operator">&gt;</span> <span class="token operator">=</span> path<span class="token punctuation">.</span><span class="token function">to_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  187. <span class="token keyword">let</span> res <span class="token operator">=</span> <span class="token keyword">if</span> path<span class="token punctuation">.</span><span class="token function">is_err</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  188. <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EINVAL</span><span class="token punctuation">)</span>
  189. <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
  190. <span class="token keyword">let</span> path<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">str</span> <span class="token operator">=</span> path<span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  191. <span class="token keyword">let</span> flags <span class="token operator">=</span> args<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  192. <span class="token keyword">let</span> open_flags<span class="token punctuation">:</span> <span class="token class-name">FileMode</span> <span class="token operator">=</span> <span class="token class-name">FileMode</span><span class="token punctuation">::</span><span class="token function">from_bits_truncate</span><span class="token punctuation">(</span>flags <span class="token keyword">as</span> <span class="token keyword">u32</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  193. <span class="token keyword">Self</span><span class="token punctuation">::</span><span class="token function">open</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> open_flags<span class="token punctuation">)</span>
  194. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  195. res
  196. <span class="token punctuation">}</span>
  197. </code></pre></div><p>检查文件路径正确后会调用同级目录下的 <strong>syscall.rs</strong> 中的 open 函数</p> <p>测试代码中的关闭文件调用<code>close</code>函数也和 open 类似,标志为<code>SYS_CLOSE</code>,然后调用 <strong>syscall.rs</strong> 中的 close 函数</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token constant">SYS_CLOSE</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  198. <span class="token keyword">let</span> fd <span class="token operator">=</span> args<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  199. <span class="token keyword">Self</span><span class="token punctuation">::</span><span class="token function">close</span><span class="token punctuation">(</span>fd<span class="token punctuation">)</span>
  200. <span class="token punctuation">}</span>
  201. </code></pre></div><p>再看 <strong>kernel/vfs/mod.rs</strong> 的<code>IndexNode</code>接口中</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token keyword">pub</span> <span class="token keyword">trait</span> <span class="token type-definition class-name">IndexNode</span><span class="token punctuation">:</span> <span class="token class-name">Any</span> <span class="token operator">+</span> <span class="token class-name">Sync</span> <span class="token operator">+</span> <span class="token class-name">Send</span> <span class="token operator">+</span> <span class="token class-name">Debug</span> <span class="token punctuation">{</span>
  202. <span class="token comment">/// @brief 打开文件</span>
  203. <span class="token comment">/// @return 成功:Ok()</span>
  204. <span class="token comment">/// 失败:Err(错误码)</span>
  205. <span class="token keyword">fn</span> <span class="token function-definition function">open</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> _data<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token class-name">FilePrivateData</span><span class="token punctuation">,</span> _mode<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">FileMode</span><span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  206. <span class="token comment">// 若文件系统没有实现此方法,则返回“不支持”</span>
  207. <span class="token keyword">return</span> <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EOPNOTSUPP_OR_ENOTSUP</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  208. <span class="token punctuation">}</span>
  209. <span class="token comment">/// @brief 关闭文件</span>
  210. <span class="token comment">/// @return 成功:Ok()</span>
  211. <span class="token comment">/// 失败:Err(错误码)</span>
  212. <span class="token keyword">fn</span> <span class="token function-definition function">close</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> _data<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token class-name">FilePrivateData</span><span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  213. <span class="token comment">// 若文件系统没有实现此方法,则返回“不支持”</span>
  214. <span class="token keyword">return</span> <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EOPNOTSUPP_OR_ENOTSUP</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  215. <span class="token punctuation">}</span>
  216. <span class="token punctuation">}</span>
  217. </code></pre></div><p>如果文件系统没有具体实现 open 和 close 函数,就返回不支持,所以这就是出错的原因</p> <p><strong>解决方式:</strong></p> <p>在我们模仿的 ramfs 文件系统里,添加 open 和 close 函数的具体实现,如下:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token keyword">fn</span> <span class="token function-definition function">open</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> _data<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token class-name">FilePrivateData</span><span class="token punctuation">,</span> _mode<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">super</span><span class="token module-declaration namespace"><span class="token punctuation">::</span>vfs<span class="token punctuation">::</span>file<span class="token punctuation">::</span></span><span class="token class-name">FileMode</span><span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  218. <span class="token keyword">return</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  219. <span class="token punctuation">}</span>
  220. <span class="token keyword">fn</span> <span class="token function-definition function">close</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> _data<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token class-name">FilePrivateData</span><span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  221. <span class="token keyword">return</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  222. <span class="token punctuation">}</span>
  223. </code></pre></div><h3 id="fopen"><a href="#fopen" class="header-anchor">#</a> fopen</h3> <p>测试代码中我们用到了<code>fopen</code>来打开文件,第二个参数的&quot;w+&quot;的含义可以在 <strong>user/libs/libc/src/stdio.c</strong> 文件中查看,表示读写文件,并且如果文件不存在的话就创建这个文件</p> <p>fopen 的系统调用也是 SYS_OPEN ,但是和 open 的区别在于:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token comment">// 如果O_TRUNC,并且,打开模式包含O_RDWR或O_WRONLY,清空文件</span>
  224. <span class="token keyword">if</span> mode<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token class-name">FileMode</span><span class="token punctuation">::</span><span class="token constant">O_TRUNC</span><span class="token punctuation">)</span>
  225. <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>mode<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token class-name">FileMode</span><span class="token punctuation">::</span><span class="token constant">O_RDWR</span><span class="token punctuation">)</span> <span class="token operator">||</span> mode<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token class-name">FileMode</span><span class="token punctuation">::</span><span class="token constant">O_WRONLY</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
  226. <span class="token operator">&amp;&amp;</span> file_type <span class="token operator">==</span> <span class="token class-name">FileType</span><span class="token punctuation">::</span><span class="token class-name">File</span>
  227. <span class="token punctuation">{</span>
  228. inode<span class="token punctuation">.</span><span class="token function">truncate</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">;</span>
  229. <span class="token punctuation">}</span>
  230. </code></pre></div><p>fopen 在满足条件的情况下会调用<code>truncate</code>函数,这个函数和 open 、close 一样,也是定义在 <strong>vfs/mod.rs</strong> 中的 IndexNode 接口中,但是没有具体实现,需要文件系统自己实现,如下:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token comment">/// @brief 截断当前inode到指定的长度。如果当前文件长度小于len,则不操作。</span>
  231. <span class="token comment">///</span>
  232. <span class="token comment">/// @param len 要被截断到的目标长度</span>
  233. <span class="token keyword">fn</span> <span class="token function-definition function">truncate</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> _len<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  234. <span class="token keyword">return</span> <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EOPNOTSUPP_OR_ENOTSUP</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  235. <span class="token punctuation">}</span>
  236. </code></pre></div><p><strong>解决方式:</strong></p> <p>所以需要在我们模仿的 ramfs 中,添加 truncate 的具体实现,如下:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token keyword">fn</span> <span class="token function-definition function">truncate</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> _len<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">)</span> <span class="token punctuation">-&gt;</span> <span class="token class-name">Result</span><span class="token operator">&lt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">SystemError</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
  237. <span class="token keyword">let</span> <span class="token keyword">mut</span> inode <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  238. <span class="token keyword">if</span> inode<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>file_type <span class="token operator">==</span> <span class="token class-name">FileType</span><span class="token punctuation">::</span><span class="token class-name">Dir</span> <span class="token punctuation">{</span>
  239. <span class="token keyword">return</span> <span class="token class-name">Err</span><span class="token punctuation">(</span><span class="token class-name">SystemError</span><span class="token punctuation">::</span><span class="token constant">EISDIR</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  240. <span class="token punctuation">}</span>
  241. inode<span class="token punctuation">.</span>data<span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span>_len<span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  242. <span class="token keyword">return</span> <span class="token class-name">Ok</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  243. <span class="token punctuation">}</span>
  244. </code></pre></div><h2 id="测试文件系统"><a href="#测试文件系统" class="header-anchor">#</a> 测试文件系统</h2> <p>测试我们模仿实现的 my_ramfs</p> <h3 id="创建测试文件夹"><a href="#创建测试文件夹" class="header-anchor">#</a> 创建测试文件夹</h3> <p>在 <strong>DragonOS/user/apps</strong> 目录下新建一个文件夹 <strong>my_test</strong></p> <h3 id="配置文件"><a href="#配置文件" class="header-anchor">#</a> 配置文件</h3> <h4 id="拷贝文件"><a href="#拷贝文件" class="header-anchor">#</a> 拷贝文件</h4> <p>找到 <strong>DragonOS/user/apps</strong> 目录下其他测试文件夹(例如:test_fstat)的两个文件:<strong>link.lds</strong> + <strong>Makefile</strong>,将这两个文件拷贝到我们新建的测试文件夹 <strong>my_test</strong> 中</p> <h4 id="更改makefile内容"><a href="#更改makefile内容" class="header-anchor">#</a> 更改Makefile内容</h4> <p>将 <strong>Makefile</strong> 中的测试目录名改回来,假设拷贝的是 test_fstat 目录的,则按如下修改:</p> <h4 id="test-fstat-makefile"><a href="#test-fstat-makefile" class="header-anchor">#</a> test_fstat/Makefile</h4> <div class="language-Makefile extra-class"><pre class="language-makefile"><code>CC<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>DragonOS_GCC<span class="token punctuation">)</span>/x86_64-elf-gcc
  245. LD<span class="token operator">=</span>ld
  246. OBJCOPY<span class="token operator">=</span>objcopy
  247. <span class="token comment"># 修改这里,把它改为你的relibc的sysroot路径</span>
  248. RELIBC_OPT<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>DADK_BUILD_CACHE_DIR_RELIBC_0_1_0<span class="token punctuation">)</span>
  249. CFLAGS<span class="token operator">=</span>-I <span class="token variable">$</span><span class="token punctuation">(</span>RELIBC_OPT<span class="token punctuation">)</span>/<span class="token keyword">include</span> -D__dragonos__
  250. tmp_output_dir<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>ROOT_PATH<span class="token punctuation">)</span>/bin/tmp/user
  251. output_dir<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>DADK_BUILD_CACHE_DIR_TEST_FSTAT_0_1_0<span class="token punctuation">)</span>
  252. LIBC_OBJS<span class="token operator">:=</span><span class="token variable">$</span><span class="token punctuation">(</span><span class="token function">shell</span> find <span class="token variable">$</span><span class="token punctuation">(</span>RELIBC_OPT<span class="token punctuation">)</span>/lib -name <span class="token string">&quot;*.o&quot;</span> <span class="token operator">|</span> sort <span class="token punctuation">)</span>
  253. LIBC_OBJS<span class="token operator">+=</span><span class="token variable">$</span><span class="token punctuation">(</span>RELIBC_OPT<span class="token punctuation">)</span>/lib/libc.a
  254. <span class="token target symbol">all</span><span class="token punctuation">:</span> main.o
  255. mkdir -p <span class="token variable">$</span><span class="token punctuation">(</span>tmp_output_dir<span class="token punctuation">)</span>
  256. <span class="token variable">$</span><span class="token punctuation">(</span>LD<span class="token punctuation">)</span> -b elf64-x86-64 -z muldefs -o <span class="token variable">$</span><span class="token punctuation">(</span>tmp_output_dir<span class="token punctuation">)</span>/test_fstat <span class="token variable">$</span><span class="token punctuation">(</span><span class="token function">shell</span> find . -name <span class="token string">&quot;*.o&quot;</span><span class="token punctuation">)</span> <span class="token variable">$</span><span class="token punctuation">(</span>LIBC_OBJS<span class="token punctuation">)</span> -T link.lds
  257. <span class="token variable">$</span><span class="token punctuation">(</span>OBJCOPY<span class="token punctuation">)</span> -I elf64-x86-64 -R <span class="token string">&quot;.eh_frame&quot;</span> -R <span class="token string">&quot;.comment&quot;</span> -O elf64-x86-64 <span class="token variable">$</span><span class="token punctuation">(</span>tmp_output_dir<span class="token punctuation">)</span>/test_fstat <span class="token variable">$</span><span class="token punctuation">(</span>output_dir<span class="token punctuation">)</span>/test_fstat.elf
  258. mv <span class="token variable">$</span><span class="token punctuation">(</span>output_dir<span class="token punctuation">)</span>/test_fstat.elf <span class="token variable">$</span><span class="token punctuation">(</span>output_dir<span class="token punctuation">)</span>/test_fstat
  259. <span class="token target symbol">main.o</span><span class="token punctuation">:</span> main.c
  260. <span class="token variable">$</span><span class="token punctuation">(</span>CC<span class="token punctuation">)</span> <span class="token variable">$</span><span class="token punctuation">(</span>CFLAGS<span class="token punctuation">)</span> -c main.c -o main.o
  261. <span class="token target symbol">clean</span><span class="token punctuation">:</span>
  262. rm -f *.o
  263. </code></pre></div><h4 id="my-test-makefile"><a href="#my-test-makefile" class="header-anchor">#</a> my_test/Makefile</h4> <div class="language-Makefile extra-class"><pre class="language-makefile"><code>CC<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>DragonOS_GCC<span class="token punctuation">)</span>/x86_64-elf-gcc
  264. LD<span class="token operator">=</span>ld
  265. OBJCOPY<span class="token operator">=</span>objcopy
  266. <span class="token comment"># 修改这里,把它改为你的relibc的sysroot路径</span>
  267. RELIBC_OPT<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>DADK_BUILD_CACHE_DIR_RELIBC_0_1_0<span class="token punctuation">)</span>
  268. CFLAGS<span class="token operator">=</span>-I <span class="token variable">$</span><span class="token punctuation">(</span>RELIBC_OPT<span class="token punctuation">)</span>/<span class="token keyword">include</span> -D__dragonos__
  269. tmp_output_dir<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>ROOT_PATH<span class="token punctuation">)</span>/bin/tmp/user
  270. output_dir<span class="token operator">=</span><span class="token variable">$</span><span class="token punctuation">(</span>DADK_BUILD_CACHE_DIR_MY_TEST_0_1_0<span class="token punctuation">)</span>
  271. LIBC_OBJS<span class="token operator">:=</span><span class="token variable">$</span><span class="token punctuation">(</span><span class="token function">shell</span> find <span class="token variable">$</span><span class="token punctuation">(</span>RELIBC_OPT<span class="token punctuation">)</span>/lib -name <span class="token string">&quot;*.o&quot;</span> <span class="token operator">|</span> sort <span class="token punctuation">)</span>
  272. LIBC_OBJS<span class="token operator">+=</span><span class="token variable">$</span><span class="token punctuation">(</span>RELIBC_OPT<span class="token punctuation">)</span>/lib/libc.a
  273. <span class="token target symbol">all</span><span class="token punctuation">:</span> main.o
  274. mkdir -p <span class="token variable">$</span><span class="token punctuation">(</span>tmp_output_dir<span class="token punctuation">)</span>
  275. <span class="token variable">$</span><span class="token punctuation">(</span>LD<span class="token punctuation">)</span> -b elf64-x86-64 -z muldefs -o <span class="token variable">$</span><span class="token punctuation">(</span>tmp_output_dir<span class="token punctuation">)</span>/my_test <span class="token variable">$</span><span class="token punctuation">(</span><span class="token function">shell</span> find . -name <span class="token string">&quot;*.o&quot;</span><span class="token punctuation">)</span> <span class="token variable">$</span><span class="token punctuation">(</span>LIBC_OBJS<span class="token punctuation">)</span> -T link.lds
  276. <span class="token variable">$</span><span class="token punctuation">(</span>OBJCOPY<span class="token punctuation">)</span> -I elf64-x86-64 -R <span class="token string">&quot;.eh_frame&quot;</span> -R <span class="token string">&quot;.comment&quot;</span> -O elf64-x86-64 <span class="token variable">$</span><span class="token punctuation">(</span>tmp_output_dir<span class="token punctuation">)</span>/my_test <span class="token variable">$</span><span class="token punctuation">(</span>output_dir<span class="token punctuation">)</span>/my_test.elf
  277. mv <span class="token variable">$</span><span class="token punctuation">(</span>output_dir<span class="token punctuation">)</span>/my_test.elf <span class="token variable">$</span><span class="token punctuation">(</span>output_dir<span class="token punctuation">)</span>/my_test
  278. <span class="token target symbol">main.o</span><span class="token punctuation">:</span> main.c
  279. <span class="token variable">$</span><span class="token punctuation">(</span>CC<span class="token punctuation">)</span> <span class="token variable">$</span><span class="token punctuation">(</span>CFLAGS<span class="token punctuation">)</span> -c main.c -o main.o
  280. <span class="token target symbol">clean</span><span class="token punctuation">:</span>
  281. rm -f *.o
  282. </code></pre></div><p>将代码里的 <strong>test_fstat</strong> 改为 <strong>my_test</strong>(<strong>PS:</strong> 注意区分大小写)</p> <h2 id="配置dadk"><a href="#配置dadk" class="header-anchor">#</a> 配置dadk</h2> <h3 id="拷贝文件-2"><a href="#拷贝文件-2" class="header-anchor">#</a> 拷贝文件</h3> <p>在 <strong>DragonOS/user/dadk/config</strong> 目录下模仿其它文件新建一个文件 <strong>my_test-0.1.0.dadk</strong>(<strong>PS:</strong> 这里的my_test和我们在第一步创建的测试目录名相同),然后拷贝其他文件的内容到里面,比如拷贝 <strong>test_fstat-0.1.0.dadk</strong></p> <h3 id="更改dadk内容"><a href="#更改dadk内容" class="header-anchor">#</a> 更改dadk内容</h3> <p>还是和之前类似,按如下修改:</p> <h4 id="test-fstat-0-1-0-dadk"><a href="#test-fstat-0-1-0-dadk" class="header-anchor">#</a> <strong>test_fstat-0.1.0.dadk</strong></h4> <div class="language-dadk extra-class"><pre class="language-text"><code>{
  283. &quot;name&quot;: &quot;test_fstat&quot;,
  284. &quot;version&quot;: &quot;0.1.0&quot;,
  285. &quot;description&quot;: &quot;一个用来测试fstat能够正常运行的app&quot;,
  286. &quot;task_type&quot;: {
  287. &quot;BuildFromSource&quot;: {
  288. &quot;Local&quot;: {
  289. &quot;path&quot;: &quot;apps/test_fstat&quot;
  290. }
  291. }
  292. },
  293. }
  294. </code></pre></div><h4 id="my-test-0-1-0-dadk"><a href="#my-test-0-1-0-dadk" class="header-anchor">#</a> <strong>my_test-0.1.0.dadk</strong></h4> <div class="language-dadk extra-class"><pre class="language-text"><code>{
  295. &quot;name&quot;: &quot;my_test&quot;,
  296. &quot;version&quot;: &quot;0.1.0&quot;,
  297. &quot;description&quot;: &quot;一个用来测试ramfs能够正常运行的app&quot;,
  298. &quot;task_type&quot;: {
  299. &quot;BuildFromSource&quot;: {
  300. &quot;Local&quot;: {
  301. &quot;path&quot;: &quot;apps/my_test&quot;
  302. }
  303. }
  304. },
  305. }
  306. </code></pre></div><p>将代码里的 <strong>test_fstat</strong> 都改成 <strong>my_test</strong></p> <h2 id="挂载文件系统"><a href="#挂载文件系统" class="header-anchor">#</a> 挂载文件系统</h2> <p>将你要测试的文件系统挂载到我们的操作系统上面</p> <p>打开 <strong>DragonOS/kernel/src/filesystem/vfs/core.rs</strong> 文件</p> <h3 id="导入"><a href="#导入" class="header-anchor">#</a> 导入</h3> <p>导入你自己实现的文件系统,比如我这里是模仿ramfs写了一个my_ramfs,就按如下添加:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token keyword">use</span> <span class="token keyword">crate</span><span class="token punctuation">::</span><span class="token punctuation">{</span>
  307. <span class="token namespace">driver<span class="token punctuation">::</span>disk<span class="token punctuation">::</span>ahci<span class="token punctuation">::</span></span><span class="token punctuation">{</span><span class="token keyword">self</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
  308. <span class="token namespace">filesystem<span class="token punctuation">::</span></span><span class="token punctuation">{</span>
  309. <span class="token namespace">devfs<span class="token punctuation">::</span></span><span class="token class-name">DevFS</span><span class="token punctuation">,</span>
  310. <span class="token namespace">fat<span class="token punctuation">::</span>fs<span class="token punctuation">::</span></span><span class="token class-name">FATFileSystem</span><span class="token punctuation">,</span>
  311. <span class="token namespace">procfs<span class="token punctuation">::</span></span><span class="token class-name">ProcFS</span><span class="token punctuation">,</span>
  312. <span class="token namespace">my_ramfs<span class="token punctuation">::</span></span><span class="token class-name">RamFS</span><span class="token punctuation">,</span>
  313. <span class="token namespace">sysfs<span class="token punctuation">::</span></span><span class="token class-name">SysFS</span><span class="token punctuation">,</span>
  314. <span class="token namespace">vfs<span class="token punctuation">::</span></span><span class="token punctuation">{</span><span class="token namespace">mount<span class="token punctuation">::</span></span><span class="token class-name">MountFS</span><span class="token punctuation">,</span> <span class="token class-name">FileSystem</span><span class="token punctuation">,</span> <span class="token class-name">FileType</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
  315. <span class="token punctuation">}</span><span class="token punctuation">,</span>
  316. <span class="token namespace">include<span class="token punctuation">::</span>bindings<span class="token punctuation">::</span>bindings<span class="token punctuation">::</span></span><span class="token constant">PAGE_4K_SIZE</span><span class="token punctuation">,</span>
  317. kerror<span class="token punctuation">,</span> kinfo<span class="token punctuation">,</span>
  318. <span class="token namespace">syscall<span class="token punctuation">::</span></span><span class="token class-name">SystemError</span><span class="token punctuation">,</span>
  319. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  320. </code></pre></div><h3 id="创建文件夹、实例并挂载"><a href="#创建文件夹、实例并挂载" class="header-anchor">#</a> 创建文件夹、实例并挂载</h3> <p>在<code>vfs_init</code>函数中:</p> <p>模仿其它文件系统创建当前准备测试的文件系统的文件夹,如下:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token comment">// 创建文件夹</span>
  321. root_inode
  322. <span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">&quot;proc&quot;</span><span class="token punctuation">,</span> <span class="token class-name">FileType</span><span class="token punctuation">::</span><span class="token class-name">Dir</span><span class="token punctuation">,</span> <span class="token number">0o777</span><span class="token punctuation">)</span>
  323. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Failed to create /proc&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  324. root_inode
  325. <span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">&quot;dev&quot;</span><span class="token punctuation">,</span> <span class="token class-name">FileType</span><span class="token punctuation">::</span><span class="token class-name">Dir</span><span class="token punctuation">,</span> <span class="token number">0o777</span><span class="token punctuation">)</span>
  326. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Failed to create /dev&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  327. root_inode
  328. <span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">&quot;sys&quot;</span><span class="token punctuation">,</span> <span class="token class-name">FileType</span><span class="token punctuation">::</span><span class="token class-name">Dir</span><span class="token punctuation">,</span> <span class="token number">0o777</span><span class="token punctuation">)</span>
  329. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Failed to create /sys&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  330. <span class="token comment">// 添加至这里</span>
  331. root_inode
  332. <span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string">&quot;ram&quot;</span><span class="token punctuation">,</span> <span class="token class-name">FileType</span><span class="token punctuation">::</span><span class="token class-name">Dir</span><span class="token punctuation">,</span> <span class="token number">0o777</span><span class="token punctuation">)</span>
  333. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Failed to create /ram&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  334. </code></pre></div><p>紧接着在下面创建 ramfs 实例,并挂载,照样是模仿其它文件系统挂载,如下:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token comment">// 创建 sysfs 实例</span>
  335. <span class="token keyword">let</span> sysfs<span class="token punctuation">:</span> <span class="token class-name">Arc</span><span class="token operator">&lt;</span><span class="token class-name">SysFS</span><span class="token operator">&gt;</span> <span class="token operator">=</span> <span class="token class-name">SysFS</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  336. <span class="token comment">// sysfs 挂载</span>
  337. <span class="token keyword">let</span> _t <span class="token operator">=</span> root_inode
  338. <span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">&quot;sys&quot;</span><span class="token punctuation">)</span>
  339. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Cannot find /sys&quot;</span><span class="token punctuation">)</span>
  340. <span class="token punctuation">.</span><span class="token function">mount</span><span class="token punctuation">(</span>sysfs<span class="token punctuation">)</span>
  341. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Failed to mount sysfs&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  342. <span class="token macro property">kinfo!</span><span class="token punctuation">(</span><span class="token string">&quot;SysFS mounted.&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  343. <span class="token comment">// 添加至这里</span>
  344. <span class="token comment">// // 创建ramfs实例</span>
  345. <span class="token keyword">let</span> ramfs<span class="token punctuation">:</span> <span class="token class-name">Arc</span><span class="token operator">&lt;</span><span class="token class-name">RamFS</span><span class="token operator">&gt;</span> <span class="token operator">=</span> <span class="token class-name">RamFS</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  346. <span class="token comment">// ramfs挂载</span>
  347. <span class="token keyword">let</span> _t <span class="token operator">=</span> root_inode
  348. <span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">&quot;ram&quot;</span><span class="token punctuation">)</span>
  349. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Cannot find /ram&quot;</span><span class="token punctuation">)</span>
  350. <span class="token punctuation">.</span><span class="token function">mount</span><span class="token punctuation">(</span>ramfs<span class="token punctuation">)</span>
  351. <span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;Failed to mount ramfs.&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  352. <span class="token macro property">kinfo!</span><span class="token punctuation">(</span><span class="token string">&quot;RamFS mounted.&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  353. </code></pre></div><h3 id="迁移伪文件系统的inode"><a href="#迁移伪文件系统的inode" class="header-anchor">#</a> 迁移伪文件系统的inode</h3> <p>在 <strong>migrate_virtual_filesystem</strong> 函数中:</p> <h4 id="获取inode"><a href="#获取inode" class="header-anchor">#</a> 获取inode</h4> <p>模仿其它文件系统获取ramfs的inode,如下:</p> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token comment">// ==== 在这里获取要被迁移的文件系统的inode ===</span>
  354. <span class="token keyword">let</span> binding <span class="token operator">=</span> <span class="token constant">ROOT_INODE</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">&quot;proc&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;ProcFS not mounted!&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">fs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  355. <span class="token keyword">let</span> proc<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">MountFS</span> <span class="token operator">=</span> binding<span class="token punctuation">.</span><span class="token function">as_any_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">downcast_ref</span><span class="token punctuation">::</span><span class="token operator">&lt;</span><span class="token class-name">MountFS</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  356. <span class="token keyword">let</span> binding <span class="token operator">=</span> <span class="token constant">ROOT_INODE</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">&quot;dev&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;DevFS not mounted!&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">fs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  357. <span class="token keyword">let</span> dev<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">MountFS</span> <span class="token operator">=</span> binding<span class="token punctuation">.</span><span class="token function">as_any_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">downcast_ref</span><span class="token punctuation">::</span><span class="token operator">&lt;</span><span class="token class-name">MountFS</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  358. <span class="token keyword">let</span> binding <span class="token operator">=</span> <span class="token constant">ROOT_INODE</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">&quot;sys&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;SysFs not mounted!&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">fs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  359. <span class="token keyword">let</span> sys<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">MountFS</span> <span class="token operator">=</span> binding<span class="token punctuation">.</span><span class="token function">as_any_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">downcast_ref</span><span class="token punctuation">::</span><span class="token operator">&lt;</span><span class="token class-name">MountFS</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  360. <span class="token comment">// 添加至这里</span>
  361. <span class="token keyword">let</span> binding <span class="token operator">=</span> <span class="token constant">ROOT_INODE</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">&quot;ram&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">expect</span><span class="token punctuation">(</span><span class="token string">&quot;RamFs not mounted!&quot;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">fs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  362. <span class="token keyword">let</span> ram<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">MountFS</span> <span class="token operator">=</span> binding<span class="token punctuation">.</span><span class="token function">as_any_ref</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">downcast_ref</span><span class="token punctuation">::</span><span class="token operator">&lt;</span><span class="token class-name">MountFS</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  363. </code></pre></div><h4 id="迁移到新的文件系统下"><a href="#迁移到新的文件系统下" class="header-anchor">#</a> 迁移到新的文件系统下</h4> <div class="language-rust extra-class"><pre class="language-rust"><code><span class="token comment">// 把上述文件系统,迁移到新的文件系统下</span>
  364. <span class="token function">do_migrate</span><span class="token punctuation">(</span>new_root_inode<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">&quot;proc&quot;</span><span class="token punctuation">,</span> proc<span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">;</span>
  365. <span class="token function">do_migrate</span><span class="token punctuation">(</span>new_root_inode<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">&quot;dev&quot;</span><span class="token punctuation">,</span> dev<span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">;</span>
  366. <span class="token function">do_migrate</span><span class="token punctuation">(</span>new_root_inode<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">&quot;sys&quot;</span><span class="token punctuation">,</span> sys<span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">;</span>
  367. <span class="token comment">// 添加至这里</span>
  368. <span class="token function">do_migrate</span><span class="token punctuation">(</span>new_root_inode<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">&quot;ram&quot;</span><span class="token punctuation">,</span> ram<span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">;</span>
  369. </code></pre></div><h2 id="开始测试"><a href="#开始测试" class="header-anchor">#</a> 开始测试</h2> <p>至此,我们就可以开始测试文件系统了。</p> <p>在之前我们新建的测试文件夹 <strong>DragonOS/user/apps/my_test</strong> 目录下添加 <strong>main.c</strong> 文件,用来测试文件系统的开、关、读、写</p> <p>测试的过程中会出现一些问题,具体原因在上文的 <strong>ramfs的更正</strong> 中</p> <div class="language-c extra-class"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;sys/types.h&gt;</span></span>
  370. <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;sys/stat.h&gt;</span></span>
  371. <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;fcntl.h&gt;</span></span>
  372. <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;unistd.h&gt;</span></span>
  373. <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;stdio.h&gt;</span></span>
  374. <span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
  375. <span class="token comment">//需要先创建文件夹</span>
  376. <span class="token keyword">int</span> check<span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
  377. check <span class="token operator">=</span> <span class="token function">mkdir</span><span class="token punctuation">(</span><span class="token string">&quot;/ram/test_0&quot;</span><span class="token punctuation">,</span><span class="token number">0777</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  378. <span class="token keyword">if</span><span class="token punctuation">(</span>check<span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
  379. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Cannot create dir: /ram/test_0\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  380. <span class="token keyword">return</span><span class="token punctuation">;</span>
  381. <span class="token punctuation">}</span>
  382. check<span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
  383. check <span class="token operator">=</span> <span class="token function">mkdir</span><span class="token punctuation">(</span><span class="token string">&quot;/ram/test_1&quot;</span><span class="token punctuation">,</span><span class="token number">0777</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  384. <span class="token keyword">if</span><span class="token punctuation">(</span>check<span class="token operator">!=</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
  385. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Cannot create dir: /ram/test_1\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  386. <span class="token keyword">return</span><span class="token punctuation">;</span>
  387. <span class="token punctuation">}</span>
  388. <span class="token comment">//测试open+close+write+read</span>
  389. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Test open/close/write/read\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  390. <span class="token keyword">int</span> fd<span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
  391. fd<span class="token operator">=</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">&quot;/ram/test_0/file_0.txt&quot;</span><span class="token punctuation">,</span>O_WRONLY <span class="token operator">|</span> O_CREAT<span class="token punctuation">)</span><span class="token punctuation">;</span>
  392. <span class="token keyword">if</span><span class="token punctuation">(</span>fd<span class="token operator">&lt;</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
  393. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Open file failed!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  394. <span class="token keyword">return</span><span class="token punctuation">;</span>
  395. <span class="token punctuation">}</span>
  396. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;File opened successfully!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  397. <span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> write_ptr <span class="token operator">=</span> <span class="token string">&quot;Write str here&quot;</span><span class="token punctuation">;</span>
  398. <span class="token function">write</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span>write_ptr<span class="token punctuation">,</span><span class="token function">strlen</span><span class="token punctuation">(</span>write_ptr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  399. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Having written:%s\n&quot;</span><span class="token punctuation">,</span>write_ptr<span class="token punctuation">)</span><span class="token punctuation">;</span>
  400. <span class="token function">close</span><span class="token punctuation">(</span>fd<span class="token punctuation">)</span><span class="token punctuation">;</span>
  401. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;File closed successfully!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  402. <span class="token comment">//测试open+close+read</span>
  403. fd<span class="token operator">=</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">&quot;/ram/test_0/file_0.txt&quot;</span><span class="token punctuation">,</span>O_WRONLY <span class="token operator">|</span> O_CREAT<span class="token punctuation">)</span><span class="token punctuation">;</span>
  404. <span class="token keyword">if</span><span class="token punctuation">(</span>fd<span class="token operator">&lt;</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
  405. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Open file failed!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  406. <span class="token keyword">return</span><span class="token punctuation">;</span>
  407. <span class="token punctuation">}</span>
  408. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;File opened successfully!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  409. <span class="token keyword">char</span><span class="token operator">*</span> buf<span class="token punctuation">[</span><span class="token number">64</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  410. <span class="token function">read</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span>buf<span class="token punctuation">,</span><span class="token number">64</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  411. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Having read:%s\n&quot;</span><span class="token punctuation">,</span>buf<span class="token punctuation">)</span><span class="token punctuation">;</span>
  412. <span class="token function">close</span><span class="token punctuation">(</span>fd<span class="token punctuation">)</span><span class="token punctuation">;</span>
  413. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;File closed successfully!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  414. <span class="token comment">//测试fopen+fclose+fputs</span>
  415. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;\nTest fopen/fclose/fputs/fgets\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  416. FILE<span class="token operator">*</span> file <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string">&quot;/ram/test_1/file_0.txt&quot;</span><span class="token punctuation">,</span><span class="token string">&quot;w+&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  417. <span class="token keyword">if</span><span class="token punctuation">(</span>file <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
  418. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Fopen file failed!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  419. <span class="token keyword">return</span><span class="token punctuation">;</span>
  420. <span class="token punctuation">}</span>
  421. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;File opened successfully!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  422. <span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> fputs_ptr <span class="token operator">=</span> <span class="token string">&quot;Fputs str here&quot;</span><span class="token punctuation">;</span>
  423. <span class="token function">fputs</span><span class="token punctuation">(</span>fputs_ptr<span class="token punctuation">,</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>
  424. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Having fput: %s\n&quot;</span><span class="token punctuation">,</span>fputs_ptr<span class="token punctuation">)</span><span class="token punctuation">;</span>
  425. <span class="token function">fclose</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>
  426. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;File closed successfully!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  427. <span class="token comment">//测试fopen+fclose+fgets</span>
  428. file <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string">&quot;/ram/test_1/file_0.txt&quot;</span><span class="token punctuation">,</span><span class="token string">&quot;r+&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  429. <span class="token keyword">if</span><span class="token punctuation">(</span>file<span class="token operator">==</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
  430. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Fopen file failed!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  431. <span class="token keyword">return</span><span class="token punctuation">;</span>
  432. <span class="token punctuation">}</span>
  433. <span class="token keyword">char</span><span class="token operator">*</span> buf1<span class="token punctuation">[</span><span class="token number">64</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  434. <span class="token function">fgets</span><span class="token punctuation">(</span>buf1<span class="token punctuation">,</span><span class="token number">64</span><span class="token punctuation">,</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>
  435. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Having got: %s\n&quot;</span><span class="token punctuation">,</span>buf1<span class="token punctuation">)</span><span class="token punctuation">;</span>
  436. <span class="token function">fclose</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>
  437. <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;File closed successfully!\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  438. <span class="token punctuation">}</span>
  439. </code></pre></div></div> <footer class="page-edit"><!----> <!----></footer> <!----> </main></div><div class="global-ui"></div></div>
  440. <script src="/OS_lab_tutorial/assets/js/app.de832b6b.js" defer></script><script src="/OS_lab_tutorial/assets/js/2.6cca19a7.js" defer></script><script src="/OS_lab_tutorial/assets/js/1.2e5d3cee.js" defer></script><script src="/OS_lab_tutorial/assets/js/35.38b1a166.js" defer></script>
  441. </body>
  442. </html>