{"id":5291,"date":"2025-11-08T14:22:23","date_gmt":"2025-11-08T06:22:23","guid":{"rendered":"https:\/\/www.yizishun.com\/?p=5291"},"modified":"2025-11-08T14:56:40","modified_gmt":"2025-11-08T06:56:40","slug":"ch2-%e6%89%b9%e5%a4%84%e7%90%86%e7%b3%bb%e7%bb%9f","status":"publish","type":"post","link":"https:\/\/www.yizishun.com\/?p=5291","title":{"rendered":"Rcore CH2 \u6279\u5904\u7406\u7cfb\u7edf"},"content":{"rendered":"<h1>1.\u7279\u6743\u7ea7\u673a\u5236<\/h1>\n<p>\u8fd9\u4e2a\u5176\u5b9e\u6211\u8fd8\u662f\u5f88\u4e86\u89e3\uff0c\u6bd5\u7adf\u5199\u8fc7\u5904\u7406\u5668<\/p>\n<p>\u4f46\u662f\u770b\u4ed6\u7684\u5bfc\u8bfb\u8fd8\u662f\u6709\u4e00\u4e9b\u65b0\u7684\u8ba4\u8bc6\uff0c\u4e00\u8a00\u4ee5\u853d\u4e4b\uff0c\u5c31\u662f\u6240\u6709\u5f53\u524d\u7a0b\u5e8f\u4e0d\u80fdhandle\u7684\u4e8b\u60c5\u90fd\u5e94\u8be5\u8f6c\u79fb\u5230\u4e0b\u5c42\u53bb\u5904\u7406\uff0c\u5305\u62ec\u96640\u9519\u8bef\uff0cseg fault\u7b49\u7b49<\/p>\n<h1>2.\u5b9e\u73b0\u5e94\u7528\u7a0b\u5e8f<\/h1>\n<p>\u5c31\u662f\u5b9e\u73b0\u90a3\u4e9bu mode\u4e0b\u7684\u7a0b\u5e8f\uff0c\u5728\u6ca1\u6709\u770b\u6587\u7ae0\u4e4b\u524d\u7684\u4e00\u4e9b\u60f3\u6cd5\uff1a\u611f\u89c9\u5c31\u662f\u8981\u4f7f\u7528ecall\u6765\u5b8c\u6210\u4efb\u52a1\u7684\u4e00\u4e9b\u666e\u901a\u7a0b\u5e8f\uff0c\u7136\u540e\u8c03\u7528\u7ea6\u5b9a\u548clinux\u4e00\u6837\uff0c\u7136\u540e\u505a\u5199\u8ba1\u7b97\uff0c\u7136\u540e\u88ab\u7f16\u8bd1\u6210elf\u5230bin\uff0c\u6700\u7ec8\u548ckernel\u94fe\u63a5\u5230\u4e00\u8d77\uff0c\u88abqemu\u52a0\u8f7d\uff0c\u7136\u540e\u88abkernel\u52a0\u8f7d\u5230\u67d0\u4e2a\u5730\u65b9\uff0c\u4e3a\u4ed6\u914d\u7f6e\u8fd0\u884c\u65f6\u73af\u5883\uff0c\u5f53\u7136\u8fd9\u662f\u540e\u8bdd<\/p>\n<p>\u9996\u5148\u8981\u52a0\u4e00\u4e2a\u53eb\u505auser\u7684Package\uff0c\u5728cargo\u4e2d\uff0c\u6bcf\u4e2a\u6709cargo.toml\u7684\u90fd\u53eb\u505aPackage\uff0cPackage\u4e2d\u6709\u5f88\u591atarget\uff0c\u6bd4\u5982binary\uff0clib\uff08\u4e00\u4e2aPackage\u4e2d\u53ea\u80fd\u6709\u4e00\u4e2a\uff09\uff0ctest\uff0cexample\u7b49\u7b49\uff0c\u7136\u540e\u6211\u7528workspace\u6765\u5305\u62ec\u8fd9\u4e24\u4e2aPackage\uff0c\u786e\u4fdd\u4ed6\u4eec\u6709\u76f8\u540c\u7684\u73af\u5883\uff0cr-a\u53ef\u4ee5\u6b63\u5e38\u5de5\u4f5c\uff0c\u5e76\u4e14\u53ef\u4ee5\u76f4\u63a5cargo build\u5c06\u6240\u6709\u7684\u5168\u90e8build\u5e76\u653e\u5165\u76f8\u540c\u6587\u4ef6\u5939<\/p>\n<p>\u4e4b\u540e\u51fa\u73b0\u4e86\u4e00\u4e2a\u95ee\u9898\uff0c\u5728build\u7684\u65f6\u5019\uff0c\u6700\u5c0f\u5316\u5230\u4e0d\u540c\u7684target\u90fd\u9700\u8981\u4e0d\u540c\u7684\u94fe\u63a5\u811a\u672c\uff0c\u4f7f\u7528\u4e4b\u524d\u7684config.toml\u6765\u544a\u8bc9cargo\u663e\u5f97\u53c8\u4e9b\u4e0d\u592a\u591f\uff08\u8fd9\u4e2a\u6700\u591a\u53ea\u80fd\u7ec6\u5316\u5230\u6bcf\u4e2aPackage\u4e2d\u7684\u4e0d\u540carch_targe\uff09\uff0c\u4e8e\u662f\u4f7f\u7528build.rs\u6765\u7ba1\u7406\u9879\u76ee\uff0c\u5b66\u4e60\u4e86rustsbi\u7684\u5199\u6cd5\uff0c\u5c06ld\u6587\u4ef6\u4e5f\u786c\u7f16\u7801\u5230build.rs\u4e2d\uff0c\u7136\u540e\u6839\u636e\u4e0d\u540c\u7684<a href=\"https:\/\/doc.rust-lang.org\/cargo\/reference\/environment-variables.html#environment-variables-cargo-sets-for-build-scripts\">TARGET<\/a> env var\u6765\u9009\u62e9\u4e0d\u540c\u7684ld\u4ee3\u7801<\/p>\n<p>\u4e4b\u540e\u5c06\u4ed6\u7684user\u4ee3\u7801\u590d\u5236\u8fc7\u6765\uff0c\u53d1\u73b0\u4ed6\u7528\u4e86\u4e00\u4e2a\u6709\u610f\u601d\u7684feature\uff0c\u4f7f\u7528unstable feature\u9700\u8981\u4f7f\u7528nightly\u7248\u672c\uff0c\u662flinkarg\u8fd9\u4e2afeature\uff0c\u7136\u540e\u5173\u8054\u7684issue:<a href=\"https:\/\/github.com\/rust-lang\/rust\/issues\/29603\">29603<\/a><\/p>\n<p>\u4e4b\u540e\u7f16\u8bd1\u8fd9\u4e9b\u7528\u6237\u7a0b\u5e8f\uff0c\u7136\u540e\u7528qemu-riscv64\u8fd0\u884c\u8fd9\u4e9b\u4ee3\u7801\uff0c\u5168\u90e8\u6bb5\u9519\u8bef\u3002\u6709\u70b9\u602a\uff0c\u6211\u7528gdb\u8c03\u8bd5\uff0c\u53d1\u73b0\u6b7b\u5728\u4e86core::fmt::write\u91cc\u9762\uff0c\u6b7b\u7684\u90a3\u6761\u6307\u4ee4\u662fli\u6307\u4ee4\uff0c\u611f\u89c9\u7279\u522b\u8be1\u5f02\uff0c\u603b\u89c9\u5f97\u5e94\u8be5\u4e0d\u662f\u6211\u7684\u95ee\u9898\uff0c\u7136\u540e\u9519\u8bef\u7684\u53d1\u751f\u70b9\u4e5f\u662f\u5728ecall\u524d\u9762\uff0c\u4e0d\u7ba1\u4e86<\/p>\n<p>build.rs\u4f1a\u901a\u8fc7\u8bfb\u67d0\u4e9b\u6587\u4ef6\uff0c\u751f\u6210\u4e00\u4e2a.S\u6587\u4ef6\uff0c\u7136\u540esrc\u4ee3\u7801\u4f1ainclude\u8fd9\u4e2a.S\u6587\u4ef6\uff0c\u8fd9\u76f8\u5f53\u4e8ebuild.rs\u5410\u51fa\u4e00\u4e2a\u6587\u4ef6\uff0csrc\u4ee3\u7801\u901a\u8fc7\u7ea6\u5b9a\u63a5\u6536\u4ed6\uff0c\u8fd9\u6709\u70b9\u4e0d\u5e72\u51c0\u6211\u611f\u89c9\uff0c\u4e4b\u524d\u7684ld\u6587\u4ef6\u6211\u4e5f\u6709\u70b9\u8fd9\u79cd\u611f\u89c9\uff0c\u597d\u5728\u80fd\u89e3\u51b3\uff0c\u8fd9\u4e2a\u6211\u4e5f\u76f4\u63a5build\u4e86<\/p>\n<pre><code class=\"language-rust\">fn main() {\n    let arch = std::env::var(\"TARGET\");\n    let out = PathBuf::from(env::var_os(\"OUT_DIR\").unwrap());\n    let ld = &amp;out.join(\"linker.ld\");\n    let app_data = &amp;out.join(\"link_app.S\");\n\n    \/\/ choose linker script base on arch\n    let _ = match arch.as_ref().unwrap().as_str() {\n        \"riscv64gc-unknown-none-elf\" =&gt; fs::write(ld, RISCV_LINKER_SCRIPT),\n        \"loongarch64-unknown-none\" =&gt; unimplemented!(),\n        _ =&gt; panic!(\"\n            Unsupported ARCH triple={}. \n            Use 'riscv64gc-unknown-none-elf' or 'loongarch64-unknown-none'\", arch.unwrap())\n    };\n    std::fs::write(ld, RISCV_LINKER_SCRIPT).unwrap();\n\n    \/\/ create app data section asm files\n    std::fs::write(app_data, insert_app_data()).unwrap();\n    let mut build = cc::Build::new();\n    build.compiler(\"riscv64-none-elf-gcc\");\n    build.file(app_data).compile(\"app_data\");\n\n    println!(\"cargo:rustc-link-arg=-T{}\", ld.display());\n    println!(\"cargo:rustc-link-arg={}\", \"-Map=\/tmp\/pianoOSMap.map\");\n    println!(\"cargo:rustc-link-search={}\", out.display());\n}<\/code><\/pre>\n<h1>3.\u5b9e\u73b0\u6279\u5904\u7406\u64cd\u4f5c\u7cfb\u7edf<\/h1>\n<h2>\u5bf9\u4e8e\u5168\u5c40\u53d8\u91cf\u7684\u4e00\u4e9b\u601d\u8003<\/h2>\n<p>\u7136\u540e\u4e4b\u540e\u4ed6\u8bf4\u4e86\u5168\u5c40\u53d8\u91cf\u7684\u4e8b\u60c5\uff0c\u6211\u601d\u8003\u4e86\u4e00\u4e0b\uff0c\u6709\u4e86\u4e00\u4e9b\u60f3\u6cd5<\/p>\n<p>\u9996\u5148\u6709\u4e09\u79cd\u6539\u53d8\u4e00\u4e2a\u53d8\u91cf\u7684\u65b9\u5f0f<\/p>\n<ul>\n<li>1.\u6709\u4ed6\u7684\u6240\u6709\u6743\uff0c\u81ea\u7136\u80fd\u6539\u53d8<\/li>\n<li>2.\u6709\u4ed6\u7684\u53ef\u53d8\u5f15\u7528<\/li>\n<li>3.\u5728unsafe block\u4e2d\u7ed5\u8fc7\u4e0a\u8ff0\u6a21\u578b\uff0c\u76f4\u63a5\u8fdb\u884c\u8d4b\u503c\uff08\u5168\u5c40\u53d8\u91cf\uff09\uff08raw ptr\uff09\uff0c\u8fd9\u4e5f\u662f\u6211\u4eec\u8981\u89c4\u907f\u7684<\/li>\n<\/ul>\n<p>\u9996\u5148\uff0c\u666e\u901a\u7684static\u5168\u5c40\u53d8\u91cf\uff0c\u5047\u5982\u4ed6\u662f\u4e0d\u53ef\u53d8\u7684\uff0c\u90a3\u5176\u5b9e\u4ed6\u6ca1\u6709\u4ec0\u4e48\u610f\u4e49\u6211\u611f\u89c9\uff0c\u548cconst\u6ca1\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u4f46\u662f\u5982\u679c\u662fmut\u7684\u8bdd\uff0c\u53c8\u5f88\u5371\u9669\uff0c\u56e0\u4e3a\u6309\u7406\u6765\u8bf4\uff0c\u4e00\u4e2a\u53d8\u91cf\u9700\u8981\u88ab\u4fee\u6539\uff0c\u4f60\u9700\u8981\u83b7\u5f97\u4ed6\u7684\u6240\u6709\u6743\u6216\u8005\u53ef\u53d8\u5f15\u7528\uff0c\u4f46\u662f\u5168\u5c40\u53d8\u91cf\u4ed6\u7ed5\u8fc7\u4e86\u8fd9\u4e2a\u89c4\u5219\uff0c\u4ed6\u7684\u8bfb\u5199\u90fd\u662f\u5728unsafe\u4e2d\u5bf9\u90a3\u6bb5\u5185\u5b58\u8fdb\u884c\u76f4\u63a5\u66f4\u6539\uff0c\u7ed5\u8fc7\u4e86\u501f\u7528\u68c0\u67e5\u6a21\u578b\uff0c\u6240\u4ee5\u8fd9\u4e5f\u4e0d\u662f\u4e00\u4e2a\u597d\u65b9\u6cd5\uff0c\u6240\u4ee5\u53ef\u4ee5\u53d1\u73b0\uff0c\u4e0d\u53ef\u53d8\u548c\u53ef\u53d8\u662f\u4e24\u4e2a\u6781\u7aef\uff0c\u4e00\u4e2a\u4e0d\u597d\u7528\uff0c\u4e00\u4e2a\u5371\u9669<\/p>\n<p>\u6240\u4ee5\u6211\u4eec\u9700\u8981\u627e\u4e00\u4e2a\u4e2d\u95f4\u4f4d\u7f6e\uff0c<\/p>\n<p>\u9996\u5148\u5f15\u5165RefCell\uff0c\u4f60\u53ef\u4ee5\u628a\u5b83\u58f0\u660e\u4e3a\u4e0d\u53ef\u53d8\u7684\uff0c\u4f46\u662f\u4f60\u53ef\u4ee5\u901a\u8fc7borrow_mut\u83b7\u53d6\u4ed6\u7684\u53ef\u53d8\u5f15\u7528\uff0c\u4f46\u662f\u4f60\u5728\u83b7\u5f97\u8fd9\u4e2a\u53ef\u53d8\u5f15\u7528\u7684\u65f6\u5019\uff0c\u4f1a\u5b58\u5728\u8fd0\u884c\u65f6\u68c0\u67e5\u662f\u5426\u6709\u5176\u4ed6\u7684\u5f15\u7528\uff08\u8fd0\u884c\u65f6\u501f\u7528\u68c0\u67e5\uff09\uff0c\u8fd9\u5176\u5b9e\u672c\u8d28\u4e0a\u662f\u5c06\u5168\u5c40\u53d8\u91cf\u4e5f\u62c9\u5165\u4e86\u501f\u7528\u89c4\u5219\u4e4b\u4e2d\uff0c\u5e76\u4e14\u7981\u7528\u4e86\u76f4\u63a5\u4fee\u6539\u4ed6\u7684\u53ef\u80fd\uff0c\u6b64\u65f6\u80fd\u901a\u8fc72\u6765\u4fee\u6539\u4ed6\uff0c\u8fd9\u76f8\u5f53\u4e8e\u662f\u4e0d\u53ef\u53d8+\u501f\u7528\u89c4\u5219\u5b9e\u73b0\u6240\u8c13\u7684\u5185\u90e8\u53ef\u53d8\u6027\uff0c\u8fd9\u5176\u5b9e\u5df2\u7ecf\u5b9e\u73b0\u4e86\u6211\u4eec\u7684\u76ee\u6807\uff1a\u80fd\u6539\u53d8+\u5f88\u5b89\u5168\uff08\u53ea\u9700\u8981\u5c0f\u5c0f\u7528\u501f\u7528\u89c4\u5219\u9650\u5236\u4e00\u4e0b\u4f60\u7684\u4f7f\u7528\uff09<\/p>\n<p>\u8fd9\u5728\u5355\u7ebf\u7a0b\u4e2d\u786e\u5b9e\u5df2\u7ecf\u7b97\u662f\u6700\u5b89\u5168\u7684\u7528\u6cd5\u4e86\uff0c\u4f46\u662f\u8fd9\u4e2a\u7c7b\u578b\u4ed6\u6ca1\u6709\u5b9e\u73b0sync\uff0csync\u53eb\u505a\u540c\u6b65\uff0c\u5176\u5b9e\u672c\u8d28\u4e0a\u5c31\u662f\u5bf9\u4e00\u4e9b\u4e1c\u897f\u8fdb\u884c\u5b89\u6392\u987a\u5e8f\uff0c\u5c31\u50cf\u662f\u98df\u5802\u6392\u961f\uff0c\u4f60\u6709\u4e00\u4e2a\u7a97\u53e3\uff0c\u4f46\u662f\u6709\u5f88\u591a\u4eba\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u8fdb\u884c\u7ba1\u7406\u8bbf\u95ee\u4ed6\u7684\u987a\u5e8f\uff0c\u8fd9\u4e2a\u7c7b\u578b\u6ca1\u6709sync\uff0c\u8fd9\u5c31\u610f\u5473\u7740\uff0c\u5982\u679ca\u548cb\u5728\u51e0\u4e4e\u540c\u65f6\u8bf7\u6c42borrow_mut\uff0c\u7531\u4e8e\u4ed6\u4eec\u6ca1\u6709\u88ab\u540c\u6b65\uff0c\u4ed6\u4eec\u53ef\u80fd\u540c\u65f6\u83b7\u5f97\u8fd9\u4e2amut<\/p>\n<p>\u6240\u4ee5\uff0c\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2a\u7c7b\u578b\u5b58\u5728\u8fd9\u79cd\u540c\u6b65\u673a\u5236\uff08\u5f53\u7136\u4e5f\u4f1a\u5e26\u6765\u66f4\u591a\u7684\u5f00\u9500\uff09\uff0c\u5c31\u662fMutex\u4e92\u65a5\u9501\u6216\u8005Rwlock\uff0c\u8fd9\u79cd\u673a\u5236\u5176\u5b9e\u672c\u8d28\u4e0a\u662f\u9700\u8981\u786c\u4ef6\u652f\u6301\u7684\uff0c\u786c\u4ef6\u5b58\u5728\u539f\u5b50\u6307\u4ee4\u6765\u5bf9\u8fd9\u79cd\u673a\u5236\u8fdb\u884c\u652f\u6301\uff0c\u8fd9\u4e2a\u65f6\u5019\u786c\u4ef6\u80fd\u4fdd\u8bc1\u5728a\uff0cb\u540c\u65f6\u8bf7\u6c42\u7684\u65f6\u5019\u5bf9\u4ed6\u4eec\u8fdb\u884c\u9009\u62e9\u5e76\u6392\u5e8f\uff0c\u6bd4\u5982mutex\uff0c\u4ed6\u662f\u72ec\u5360\u7684\uff0c\u5c31\u662f\u5b83\u4e0d\u5b58\u5728\u4ec0\u4e48borrow\uff0c\u4ed6\u7684\u6240\u6709\u501f\u7528\u5168\u662fborrow_mut\uff0c\u53ea\u8981\u4f60\u83b7\u5f97\u4e86\u8fd9\u4e2a\u9501\uff0c\u4f60\u5c31\u80fd\u5bf9\u4ed6\u5e72\u4efb\u4f55\u4e8b\uff0c\u4f46\u662f\u4f60\u6ca1\u6709\u83b7\u5f97\u9501\uff0c\u4f60\u5c31\u4ec0\u4e48\u4e5f\u4e0d\u80fd\u5e72\u9664\u4e86\u81ea\u65cb\uff08\u5f53\u7136\u8fd8\u6709\u5176\u4ed6\u7684\u7b49\u5f85\u5f62\u5f0f\uff0c\u6bd4\u5982\u76f4\u63a5\u4f11\u7720\uff09\uff0c\u800crwlock\u4f1a\u66f4\u50cfrefcell\uff0c\u4ed6\u80fd\u83b7\u5f97\u591a\u4e2a\u8bfb\u9501\u6216\u8005\u4e00\u4e2a\u5199\u9501\uff0c\u4f46\u662f\u4ed6\u4eec\u5728\u8fdd\u53cd\u501f\u7528\u89c4\u5219\u7684\u65f6\u5019\uff0crefcell\u4f1a\u76f4\u63a5panic\uff0c\u4f46\u662f\u4e92\u65a5\u9501\u4f1a\u8fdb\u884c\u7b49\u5f85<\/p>\n<p>\u7136\u540e\u6211\u7684\u5b9e\u73b0\u7528mutex\u66ff\u6362refcell\uff08\u56e0\u4e3a\u6211\u6709\u591aharts\uff09\uff0c\u7136\u540e\u7528Once\u66ff\u6362lazy_static!\uff0c\u56e0\u4e3a\u540e\u8005\u597d\u50cf\u6709\u70b9\u8fc7\u65f6<\/p>\n<p>\u6240\u4ee5\u6211\u6700\u540e\u7684\u65b9\u6848\u5c31\u662f\uff0c\u7ed3\u6784\u4f53\u672c\u8eab\u88abOnce\u5305\u88f9\uff0c\u901a\u8fc7\u4ed6\u521d\u59cb\u5316\u7ed3\u6784\u4f53\u4e2d\u53ea\u9700\u8981\u8d4b\u503c\u4e00\u6b21\u7684\u503c\uff0c\u7136\u540e\u7528Mutex\u5305\u88f9\u90a3\u4e9b\u9700\u8981\u591a\u6b21\u8bfb\u5199\u7684\u503c\uff0c\u4e5f\u5c31\u662f\u63d0\u4f9b\u5185\u90e8\u53ef\u53d8\u6027<\/p>\n<p>\u4f46\u662f\u6211\u4e00\u5f00\u59cb\u8ba4\u4e3a\u4e0a\u8ff0\u7684\u60f3\u6cd5\u662f\u6b63\u786e\u7684\uff0c\u4f46\u662f\u6211\u53d1\u73b0rustsbi\u5e76\u6ca1\u6709\u628a\u5168\u5c40\u53d8\u91cf\u6309\u7167\u4e0a\u8ff0\u65b9\u5f0f\u5b9a\u4e49\uff0c\u800c\u662f\u8fd8\u662f\u4f7f\u7528\u4e86static mut\uff0c\u6211\u611f\u89c9\u6709\u70b9\u7591\u60d1\uff0c\u4e8e\u662f\u53bb\u95ee\u4e86\u7f57\u5e08\u5085\uff0c\u6211\u53d1\u73b0\u6211\u7406\u89e3\u7684\u8fd8\u662f\u6709\u70b9\u95ee\u9898\uff0c\u6211\u7684\u6bd4\u8f83\u6781\u7aef\uff0c\u5c31\u662f\u6240\u6709\u7684\u5168\u5c40\u53d8\u91cf\u90fd\u5fc5\u987b\u8981\u58f0\u660e\u6210static(no mut)\uff0c\u7136\u540e\u6240\u6709\u9700\u8981\u53ef\u53d8\u7684\u5b57\u6bb5\u90fd\u9700\u8981\u7528\u9501\u6765\u5305\u88f9\uff0c\u60f3\u6539\u53d8\u4ed6\u5fc5\u987b\u8981\u5148\u4f7f\u7528\u9501\uff0c\u4f46\u662f\u6211\u5fd8\u8bb0\u9501\u662f\u6709\u4ee3\u4ef7\u7684\u4e86\uff0c\u4ed6\u4f1a\u6709\u6027\u80fd\u635f\u5931\uff0c\u800c\u5982\u679c\u6709\u67d0\u4e9b\u5b57\u6bb5\uff0c\u4f60\u80fd\u4fdd\u8bc1\u591a\u4e2a\u7ebf\u7a0b\uff08hart\uff09\u7edd\u5bf9\u4e0d\u4f1a\u540c\u65f6\u8bbf\u95ee\uff0c\u540c\u65f6\u5199\uff0c\u90a3\u4f60\u5c31\u53ef\u4ee5\u7528unsafe\u5305\u88f9\u5e76\u4e0d\u5bf9\u4ed6\u505a\u540c\u6b65\uff0c\u8fd9\u662f\u96f6\u6210\u672c\u884c\u4e3a\uff0c\u8fd9\u610f\u5473\u7740\uff0c\u5176\u5b9e\u53ea\u6709\u67d0\u4e9b\u5b57\u6bb5\uff0c\u4f60\u7684\u903b\u8f91\u4e0d\u786e\u5b9a\u4ed6\u662f\u5426\u4f1a\u88ab\u591a\u4e2aharts\u8bbf\u95ee\u7684\u65f6\u5019\uff0c\u4f60\u624d\u628a\u8fd9\u4e2a\u6258\u7ba1\u8d23\u4efb\u4ea4\u7ed9mutex\uff0cmutex\u901a\u8fc7\u4e00\u4e9b\u6027\u80fd\u635f\u5931\u7684\u4fdd\u8bc1\u80fd\u5bf9\u8fd9\u4e2a\u5b57\u6bb5\u7684\u8bbf\u95ee\u505a\u540c\u6b65<\/p>\n<p>\u4f46\u662f\u6211\u8fd8\u662f\u8ba4\u4e3astatic mut\u592a\u6b66\u65ad\u4e86\uff08\u5fc3\u7406\u6d01\u7656\uff09\uff0c\u67d0\u4e9b\u5b57\u6bb5\u672c\u6765\u662f\u4e0d\u5e94\u8be5\u88ab\u4fee\u6539\u7684\uff0c\u4f46\u662f\u4e5f\u88ab\u58f0\u660e\u4e3a\u4e86mut\uff0c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u4e5f\u9700\u8981\u4f7f\u7528unsafe\uff0c\u6211\u8ba4\u4e3a\u8fd9\u592a\u7c97\u653e\u4e86<\/p>\n<p>\u6211\u8ba4\u4e3a\u6bd4\u8f83\u5408\u7406\u7684\u63a7\u5236\u662f\uff1a\u628a\u6574\u4f53\u58f0\u660e\u4e3aOnce\uff0c\u80fd\u4fdd\u8bc1\u7684\u4fee\u6539\u5b57\u6bb5\u7528\u96f6\u6210\u672c\u7684unsafecell\uff0c\u4e0d\u80fd\u4fdd\u8bc1\u7684\u7528mutex<\/p>\n<hr \/>\n<p>\u4e4b\u540e\u5728\u94fe\u63a5\u751f\u6210\u7684s\u6587\u4ef6\u7684\u65f6\u5019\u51fa\u73b0\u4e86abi\u4e0d\u5339\u914d\u7684\u95ee\u9898\uff0c-mabi\u7684\u6587\u7ae0\u5177\u4f53\u53ef\u4ee5\u770b\u8fd9\u4e00\u7bc7https:\/\/blog.csdn.net\/zoomdy\/article\/details\/79353313<\/p>\n<p>\u4e4b\u540e\u6709\u4e00\u4e2aload_app\u7684\u51fd\u6570\u5b9e\u73b0\uff0c\u6700\u540e\u52a0\u4e86\u4e00\u4e2afence.i\uff0c\u6211\u4e00\u5f00\u59cb\u4e5f\u6ca1\u60f3\u5230\uff0c\u4f46\u603b\u4e4b\uff0c\u4fee\u6539\u4e86inst mem\uff0c\u80af\u5b9a\u5c31\u9700\u8981fence.i\uff0c\u4e0d\u7136\u5207\u6362\u7a0b\u5e8f\u7684\u65f6\u5019\u5c31\u80af\u5b9a\u4f1a\u51fa\u95ee\u9898\uff0c\u4f46\u662ffence.i\u662friscv\u7684\uff0c\u67b6\u6784\u76f8\u5173\u7684\u9700\u8981\u52a0\u4e00\u5c42\u62bd\u8c61\uff0cla\u6211\u6ca1\u8bb0\u9519\u7684\u8bdd\u662fibar<\/p>\n<h1>4.\u5b9e\u73b0\u7279\u6743\u7ea7\u7684\u5207\u6362<\/h1>\n<p>\u7136\u540e\u9996\u5148\u5c31\u662f\u8981\u5199\u7528\u6237\u6808\uff0c\u7136\u540e\u8fd8\u8981\u5199\u9677\u5165\u51fd\u6570\uff0c\u6211\u5728\u53c2\u8003rustsbi\u7684\u65f6\u5019\u770b\u5230\u4e86\u4e00\u4e2a\u6846\u67b6\uff0c\u53eb\u505afast-trap<\/p>\n<p>\u4ed6\u91cc\u9762\u8be6\u7ec6\u7684\u8bb2\u89e3\u4e86\u4e00\u79cd\u601d\u60f3\uff0c\u4f46\u662f\u6211\u5b9e\u5728\u662f\u6709\u70b9\u6ca1\u770b\u61c2<\/p>\n<p>\u6765\u6765\u56de\u56de\u770b\u6765\u51e0\u904d\uff0c\u53ef\u80fd\u662f\u6211\u8fd9\u65b9\u9762\u7ecf\u9a8c\u8fd8\u662f\u4e0d\u8db3\uff0c\u6240\u4ee5\u6ca1\u600e\u4e48\u770b\u61c2\uff0c\u552f\u4e00\u770b\u61c2\u7684\u5c31\u662f\u4fdd\u5b58\u4e0a\u4e0b\u6587\u7684\u65f6\u5019\u53ef\u4ee5\u8fdb\u884c\u9009\u62e9\u6027\u7684\u4fdd\u5b58\uff0c\u7136\u540e\u6709\u51e0\u4e2a\u7b49\u7ea7\u7684\u4fdd\u5b58\uff0c\u4f46\u662f\u4ed6\u91cc\u9762\u5bf9\u4e8e\u6808\u7684\u4e00\u4e9b\u7406\u89e3\u6211\u6ca1\u6709\u529e\u6cd5get\u5230\u6682\u65f6<\/p>\n<p>\u6211\u5e94\u8be5\u80fd\u7406\u89e3\u600e\u4e48\u4f7f\u7528\u4ed6\u7684\u8fd9\u4e9b\u6982\u5ff5\uff0c\u4f46\u662f\u4ed6\u7684\u63cf\u8ff0\u6211\u53ef\u80fd\u770b\u4e0d\u592a\u61c2\uff0c\u4e8e\u662f\u6211\u4e5f\u60f3\u628a\u8fd9\u4e2afast-trap\u7684\u601d\u60f3\u79fb\u5230\u6211\u7684kernel\u4e2d\uff0c\u4f46\u662f\u6211\u5e94\u8be5\u4e0d\u4f1a\u53bb\u4f7f\u7528\u5b83\u5927\u90e8\u5206\u7684\u4ee3\u7801\uff0c\u81f3\u5c11trap_entry\u6211\u4f1a\u81ea\u5df1\u5199<\/p>\n<p>\u4e4b\u540e\u6211\u82b1\u4e86\u4e00\u8282\u8bfe\u7684\u65f6\u95f4\u628a\u5b83\u6240\u6709\u7684\u4ee3\u7801\u770b\u4e86\u4e00\u904d\uff0c\u5305\u62ec\u90e8\u5206rustsbi\u4f7f\u7528\u8fd9\u90e8\u5206\u4ee3\u7801\u7684\u4ee3\u7801\uff0c\u5e78\u597d\u4e0d\u957f\uff0c\u7136\u540e\u57fa\u672c\u7406\u89e3\u4e86<\/p>\n<p>\u4f46\u662f\u4ed6\u7ed9\u7684\u5e93\u4e0d\u80fd\u66ff\u6362\u67d0\u4e9b\u5b9e\u73b0\uff0c\u4f46\u662f\u6211\u60f3\u60f3\uff0c\u6709\u6ca1\u6709\u53ef\u4ee5\u505a\u66ff\u6362\u7684\u5462\uff0c\u6211\u7684\u9700\u6c42\u662f\uff0c\u5bf9\u4e8e\u5728\u5e93\u4e2d\u5b9a\u4e49\u7684\u67d0\u4e2astruct\uff0c\u4ed6\u5b9e\u73b0\u7684\u67d0\u4e9b\u65b9\u6cd5\u5185\u90e8\u7684\u5b9e\u73b0\u662f\u53ef\u4ee5\u88ab\u7528\u6237override\u7684\uff0c\u5426\u5219\u5c31\u4f7f\u7528\u5b83\u7ed9\u7684default\u7684\u5b9e\u73b0\uff0c\u6211\u603b\u611f\u89c9\u8fd9\u4e2a\u5b9e\u73b0\u6709\u70b9\u4e11\u964b\uff0c\u5c31\u662f\u6709\u4e00\u4e2a\u53eb\u505aisa\u7684trait\uff0c\u7136\u540e\u5e93\u4e2d\u5b9a\u4e49\u7684struct\u4e2d\u7684\u67d0\u4e2a\u5b57\u6bb5\u662f\u9700\u8981\u5b9e\u73b0\u4e86\u8fd9\u4e2atrait\u7684\uff0c\u7136\u540e\u5e93\u4e2d\u7684\u65b9\u6cd5\u4f1a\u8c03\u7528\u8fd9\u4e2atrait\u7684\u5b9e\u73b0\uff0c\u7528\u6237\u9700\u8981\u81ea\u5df1\u521b\u5efa\u4e00\u4e2a\u53eb\u505aisa\u7684struct\uff0c\u7136\u540e\u5b9e\u73b0isa\u8fd9\u4e2atrait<\/p>\n<p>\u8bf6\u90a3\u6211\u662f\u4e0d\u662f\u53ef\u4ee5\u7528\u8fd9\u4e2a\u4e2d\u601d\u60f3\u53bb\u5b9e\u73b0\u6211kernel\u7684hal\uff0c\u6211\u73b0\u5728\u7528\u7684\u65b9\u6cd5\u662f\uff0c\u63d0\u4f9b\u4e00\u4e2acommon\u7684\u5b9e\u73b0\uff0c\u5185\u90e8\u7528cfg\u6765\u8c03\u7528\u4e0d\u540c\u7684\u5b9e\u73b0\uff0c\u8fd9\u5c31\u5bfc\u81f4\u4e86\u6211\u5185\u90e8\u7279\u522b\u591a\u7684cfg\uff0c\u6709\u70b9\u4e0d\u597d\u770b\uff0c\u66f4\u4e0d\u597d\u7ef4\u62a4<\/p>\n<p>\u5982\u679c\u6211\u9996\u5148\u5b9a\u4e49\u4e00\u4e2a\u53eb\u505aISA\u7684trait\uff0c\u91cc\u9762\u5b9a\u4e49\u4e86\u4e00\u4e9b\u901a\u7528\u65b9\u6cd5\uff0c\u4ed6\u4eec\u662f\u5bf9\u5e95\u5c42\u6307\u4ee4\u6700\u7b80\u5355\u7684\u62bd\u8c61\uff0c\u8d8a\u7b80\u5355\u8d8a\u597d\uff0c\u6bd4\u5982\u8bf4\u7b80\u5355\u5230store\u90fd\u884c\uff08\u4f46\u8fd9\u5c31\u4f1a\u5bfc\u81f4\u5185\u90e8\u65b9\u6cd5\u7279\u522b\u591a\uff09\uff0c\u6211\u53d1\u73b0\u5b66\u957f\u8c8c\u4f3c\u5c31\u662f\u8fd9\u4e48\u505a\u7684\uff0c\u7136\u540e\u6bcf\u4e00\u4e2aisa\u5b9a\u4e49\u4e00\u4e2astruct\uff0c\u7136\u540e\u7ed9\u8fd9\u4e2astruct\u5b9e\u73b0\u8fd9\u4e2aISA trait\uff0c\u4e4b\u540e\u9700\u8981\u7528\u5230isa\u76f8\u5173\u4ee3\u7801\u7684\u5730\u65b9\u5c31\u628a\u8fd9\u4e2astruct\u62c9\u4e0a\u53bb\uff0c\u7136\u540e\u6ca1\u6709\u5b57\u6bb5\uff0c\u6240\u4ee5\u662f\u96f6\u5f00\u9500\u7684<\/p>\n<p>\u6211\u5ffd\u7136\u60f3\u8d77ysyx\u7684abstrat machine\u4e86\uff0c\u6211\u6253\u7b97\u56de\u8fc7\u5934\u53bb\u770b\u4e00\u4e0b<\/p>\n<p>\u4f46\u662f\u8fd9\u4e2a\u5206\u7c7b\u6211\u4e0d\u77e5\u9053\u8be5\u600e\u4e48\u5206\uff0c\u6211\u6709\u4e00\u4e2aArchISA\uff0c\u4f46\u662f\u6211\u8ba4\u4e3a\u6709\u4e9b\u4e1c\u897f\u786e\u5b9e\u4e5f\u4e0d\u662fISA\u7684\u8303\u7574\uff0c\u6bd4\u5982\u8bf4\u591a\u6838\uff0c\u4e00\u4e9b\u548c\u9891\u7387\u76f8\u5173\u7684\u4e1c\u897f\uff0c\u67b6\u6784\u76f8\u5173\u7684\u4e1c\u897f\uff0c\u8fd9\u4e9b\u5e94\u8be5\u4e0d\u80fd\u5c5e\u4e8eISA\uff0c\u4f46\u662f\u6211\u60f3\u4e86\u5f88\u4e45\uff0c\u6ca1\u6709\u60f3\u5230\u5f88\u597d\u7684\u5206\u7c7b\u65b9\u6cd5\uff0c\u4e8e\u662f\u6211\u76f4\u63a5\u9009\u62e9\u6700\u7c97\u66b4\u7684\u65b9\u5f0f\uff0c\u6682\u65f6\u4e0d\u5206\u7c7b\uff0c\u5168\u90e8\u4e1c\u897f\u5148\u653e\u5728ISA\u91cc\u9762\uff0c\u56e0\u4e3a\u6bd5\u7adf\u73b0\u5728\u65b9\u6cd5\u5e76\u4e0d\u662f\u5f88\u591a\uff0c\u5206\u7c7b\u663e\u5f97\u5f88\u6ca1\u6709\u610f\u4e49\uff0c\u4e0e\u5176\u5728\u8fd9\u91cc\u505a\u6ca1\u6709\u610f\u4e49\u7684\u7ea0\u7ed3\uff0c\u4e0d\u5982\u591a\u79ef\u6512\u70b9\u7ecf\u9a8c\uff0c\u53ef\u80fd\u4e00\u4e0b\u5b50\u5c31\u6e05\u6670\u4e86\uff08ysyx\u7684am\u662f\u4ece\u4e0d\u540c\u7684\u529f\u80fd\u4e0a\u5206\u7c7b\u7684\uff0c\u6bd4\u5982\u8bf4trm\u4e4b\u7c7b\u7684\uff0c\u4f46\u662f\u6211\u611f\u89c9\u8fd9\u662f\u5f88\u6709\u6559\u5b66\u98ce\u683c\u7684\uff0c\u4e0d\u9002\u5408\u6211\uff09<\/p>\n<p>\u8bf6\u6211\u5ffd\u7136\u89c9\u5f97\u6211\u4e4b\u524d\u7684\u601d\u60f3\u662f\u4e0d\u5b8c\u5584\u7684\uff0c\u6211\u4e4b\u524d\u8ba4\u4e3a\u6211\u9700\u8981\u5c06isa\uff08\u884c\u4e3a\uff09\u6574\u4e2a\u62bd\u8c61\u51fa\u6765\uff0c\u4f46\u662f\u6211\u53d1\u73b0\u7f16\u8bd1\u5668\u5b9e\u9645\u4e0a\u5c31\u662f\u4e00\u4e2ahal\u5c42\uff01\u6216\u8005\u8bf4\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u672c\u8eab\u5c31\u662f\u4e00\u5c42hal\uff0c\u554a\u8fd9\u53ef\u662f\u521a\u5b66\u8ba1\u7b97\u673a\u5c31\u63a5\u89e6\u7684\u5185\u5bb9\u5440\uff0c\u6211\u7adf\u7136\u5fd8\u8bb0\u4e86\uff0c\u6709\u610f\u601d\uff0c\u8fd9\u4e48\u8bf4\u5982\u679c\u6211\u80fd\u5c06isa\u62bd\u8c61\u51fa\u6765\uff0c\u6211\u5c31\u8bbe\u8ba1\u4e86\u4e00\u4e2a\u7f16\u7a0b\u8bed\u8a00\uff0c\u4f46\u662f\u7f16\u7a0b\u8bed\u8a00\u4ec5\u662f\u5bf9\u4e8e\u67d0\u4e9b\u6307\u4ee4\u7684\u62bd\u8c61\uff0c\u5927\u591a\u662f\u5bf9\u4e8e\u8ba1\u7b97\u548c\u5206\u652f\u8fd9\u79cd\u7b80\u5355\u6307\u4ee4\u7684\u62bd\u8c61\uff0c\u7c7b\u4f3cfence.i\u8fd9\u79cd\u6307\u4ee4\u5e76\u6ca1\u6709\u88ab\u62bd\u8c61\uff0c\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff0c\u6211\u53ea\u6709\u4e00\u79cd\u611f\u89c9\uff0c\u5c31\u662f\u8fd9\u79cd\u6307\u4ee4\u4ed6\u662f\u66f4\u9ad8\u7ea7\u7684\u6307\u4ee4\uff0c\u4ed6\u5e76\u6ca1\u6709\u6539\u53d8\u4ec0\u4e48\u53ef\u53d8\u72b6\u6001\uff0c\u4e0d\u4f1a\u56e0\u4e3a\u6709\u4e00\u4e2afencei\uff0c\u8ba9\u539f\u6765\u7684flow\u51fa\u73b0\u5206\u53c9\uff0c\u4ed6\u50cf\u662f\u4e00\u79cd\u6743\u8861\u4e4b\u8ba1\uff0c\u4ed6\u5f88\u548c\u67b6\u6784\u76f8\u5173\uff0c\u6bd4\u5982\u4e00\u4e2a\u6ca1\u6709icache\u7684\u5904\u7406\u5668\uff0c\u4ed6\u5c31\u6839\u672c\u4e0d\u9700\u8981fencei\uff0c\u6216\u8005\u8bf4\u6211\u6709\u4e00\u4e2a\u6bd4icache\u66f4\u80fd\u52a0\u5feb\u6307\u4ee4\u83b7\u53d6\u7684\u65b9\u5f0f\uff0c\u90a3fencei\u6307\u4ee4\u5c31\u4f1a\u6d88\u5931\uff0c\u5982\u679c\u6211\u6709\u4e00\u79cd\u6bd4\u591a\u6838\u66f4\u5feb\u7684\u5904\u7406\u65b9\u5f0f\uff0c\u6240\u6709\u7684\u591a\u6838\u6307\u4ee4\u5c31\u4f1a\u6d88\u5931\uff0c\u4ed6\u50cf\u662f\u548c\u67b6\u6784\u5b9e\u73b0\u672c\u8eab\u6709\u5173\u7684\u4e1c\u897f\uff08\u5373\u5fae\u67b6\u6784\uff09\uff0c\u6211\u53d1\u73b0\u8fd9\u79cd\u4e1c\u897f\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u5c31\u4e0d\u4f1a\u505a\u62bd\u8c61\uff0c\u4f46\u662f\u6211\u5ffd\u7136\u53d1\u73b0\u5176\u5b9e\u4e0d\u7136\uff0c\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u4ecd\u7136\u6709\u4e00\u4e9b\u539f\u5b50\u7684\u6570\u636e\u7ed3\u6784\uff0c\u4ed6\u4eec\u7684\u5185\u90e8\u6216\u8bb8\u5c31\u662ffencei<\/p>\n<p>\u6240\u4ee5\u6211\u8ba4\u4e3a\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u50cf\u662f\u5728\u64cd\u7eb5\u4e00\u4e2a\u88ab\u62bd\u8c61\u8fc7\u4e00\u904d\u7684\u786c\u4ef6\u6a21\u578b\uff0c\u4ed6\u662f\u4e00\u4e2a\u5de8\u5927\u7684hal\uff0c\u6bd4\u5982\u5728rust\u7684\u62bd\u8c61\u4e16\u754c\u4e2d\uff0c\u6307\u9488\u4e0d\u5728\u662f\u5730\u5740\u4e86\uff0c\u4e00\u4e2a\u7b80\u5355\u7684\u6307\u9488\u5305\u542b\u7740\u5f88\u591a\u4e1c\u897f\u6765\u4fdd\u8bc1\u4ed6\u7684\u5b89\u5168\u6027\uff0c\u4ed6\u7684\u786c\u4ef6\u4e16\u754c\u91cc\u6709\u7740\u68c0\u67e5\u501f\u7528\u89c4\u5219\u5e94\u7528\u4e8e\u6bcf\u4e00\u4e2a\u8bed\u8a00\u4e2d\u7684\u5bf9\u8c61\uff0c\u5076\u5c14\u901a\u8fc7unsafe\u7ed5\u8fc7\uff0c\u6765\u5b8c\u6210\u4e00\u4e9b\u8fd9\u4e2a\u62bd\u8c61\u5c42\u4e4b\u5916\u7684\u4e1c\u897f<\/p>\n<p>\u90a3\u4e48\u6211\u8ba4\u4e3a\u6211\u7684\u786c\u4ef6\u62bd\u8c61\u662f\u6ca1\u6709\u610f\u4e49\u7684\u5176\u5b9e\uff0c\u7528entry\u9996\u5148\u5728\u771f\u5b9e\u786c\u4ef6\u4e16\u754c\u521b\u9020\u4e00\u4e2a\u7f16\u7a0b\u8bed\u8a00\u7684\u4e16\u754c\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u8df3\u5230\u7f16\u7a0b\u8bed\u8a00\u7684\u4e16\u754c\u4e86\uff0c\u53ea\u662f\u5076\u5c14\uff0c\u786c\u4ef6\u4e16\u754c\u7684\u67d0\u4e9b\u5bf9\u8c61\u6ca1\u6709\u88ab\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u7684\u4e16\u754c\u5305\u88f9\uff0c\u6240\u4ee5\u6211\u9700\u8981\u5bf9\u8fd9\u4e9b\u4e1c\u897f\u505a\u62bd\u8c61<\/p>\n<p>\u4f46\u662f\u5176\u5b9e\u53c8\u662f\u6709\u610f\u4e49\u7684\uff0c\u56e0\u4e3a\u6211\u5c31\u662f\u5728\u64cd\u63a7\u771f\u5b9e\u7684\u786c\u4ef6\u4e16\u754c\u5440\uff0c\u6211\u7684\u786c\u4ef6\u4e16\u754c\u91cc\uff0c\u5185\u5b58\u4ec5\u4ec5\u662f\u4e00\u5927\u5757\u6570\u7ec4\uff0c\u4ed6\u6ca1\u6709\u4efb\u4f55\u68c0\u67e5\u673a\u5236\uff0c\u7136\u540e\u4ed6\u6709icache\uff0c\u6240\u4ee5\u66f4\u6539\u4e86\u67d0\u4e9b\u90e8\u5206\u5185\u5b58\uff0c\u6211\u9700\u8981\u4f7f\u7528\u540c\u6b65\u673a\u5236\u5237\u6389cache\u4e2d\u7684\u503c\uff0c\u8fd9\u5c31\u6709\u4e00\u4e2a\u57fa\u672c\u77db\u76fe\uff0c\u6211\u5728\u4e00\u4e2a\u7406\u60f3\u7684\u7f16\u7a0b\u8bed\u8a00\u4e16\u754c\u64cd\u63a7\u771f\u5b9e\u786c\u4ef6\u4e16\u754c\uff0c\u4ed6\u4eec\u7684\u5185\u5b58\u6a21\u578b\u90fd\u662f\u5b8c\u5168\u4e0d\u540c\u7684\uff0c\u771f\u5b9e\u786c\u4ef6\u7684\u5185\u5b58\u6a21\u578b\u5c31\u662f\u4e0a\u8ff0\u8bf4\u7684\uff0c\u6709\u7a0b\u5e8f\u733f\u4e0d\u53ef\u89c1\u7684cache\u7b49\u7b49\uff0c\u4f46\u662frust\u7684\u5185\u5b58\u6a21\u578b\u662f\u4ec0\u4e48\u5462\uff1f<a href=\"https:\/\/doc.rust-lang.org\/reference\/memory-model.html\">https:\/\/doc.rust-lang.org\/reference\/memory-model.html<\/a><\/p>\n<p>\u6240\u4ee5\u8bf4\u5904\u7406\u597d\u786c\u4ef6\u4e16\u754c\u548c\u7f16\u7a0b\u8bed\u8a00\u4e16\u754c\u7684\u77db\u76fe\uff0c\u5c31\u662f\u6211\u5e94\u8be5\u5728arch\/\u8fd9\u4e2a\u6587\u4ef6\u5939\u4e0b\u505a\u7684\u4e8b\u60c5\uff0c\u800c\u4e0d\u662f\u628a\u6574\u4e2aisa\u90fd\u62bd\u8c61\u4e00\u904d\uff0c\u6216\u8005\u6362\u4e00\u79cd\u8bf4\u6cd5\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5939\u9700\u8981\u6784\u5efa\u4e00\u4e2a\u771f\u5b9e\u786c\u4ef6\u548c\u7f16\u7a0b\u8bed\u8a00\u4e16\u754c\u7684\u8fde\u63a5\u70b9\uff08\u866b\u6d1e\uff09<\/p>\n<hr \/>\n<p>\u7136\u540e\u4e4b\u540e\u5c31\u662f\u666e\u901a\u7684boot\uff0c\u5728\u4e00\u5f00\u59cb\u8bbe\u7f6e\u5185\u6838\u6808\u7684\u65f6\u5019\uff0c\u4f1a\u6709\u4e00\u4e2aload\u65b9\u6cd5\u8bbe\u7f6esscratch\uff0c\u5c31\u662f\u5728\u6700\u540e\uff0cboot hart\u8fdb\u5165boot_entry\uff0c\u7136\u540e\u8bbe\u7f6esepc\u4e3a0x80400000\uff0c\u7136\u540e\u8bbe\u7f6esstatus\u7684spp\u4e3auser\uff0c\u4ee5\u81f3\u4e8e\u53ef\u4ee5\u8ba9sret\u6539\u7279\u6743\u7ea7\uff0c\u6700\u540e\u662f\u8bbe\u7f6e\u7528\u6237\u7684sp\uff0c\u6211\u4e5f\u6839\u636e\u4e86hartid\u8fdb\u884cuser stack\u7684locat\uff0c\u7136\u540e\u5c31\u53ef\u4ee5sret<\/p>\n<p>sret\u5230\u7528\u6237\u6001\u4e4b\u540e\uff0ckernel\u5c31\u53ea\u9700\u8981\u76f8\u5e94\u7528\u6237\u6001\u7684expt\u4e86\uff0c\u5728expt\u7684\u65f6\u5019\uff0c\u8fdb\u5165fast-trap\u7684\u6846\u67b6\u4e0b<\/p>\n<pre><code class=\"language-rust\">#[unsafe(naked)]\npub unsafe extern \"C\" fn trap_entry() {\n        core::arch::naked_asm!(\n                \".align 2\",\n                \/\/ \u6362\u6808\n                exchange!(),\n                \/\/ \u52a0\u8f7d\u4e0a\u4e0b\u6587\u6307\u9488\n                save!(a0 =&gt; sp[2]),\n                load!(sp[0] =&gt; a0),\n                \/\/ \u4fdd\u5b58\u5c3d\u91cf\u5c11\u7684\u5bc4\u5b58\u5668\n                save!(ra =&gt; a0[0]),\n                save!(t0 =&gt; a0[1]),\n                save!(t1 =&gt; a0[2]),\n                save!(t2 =&gt; a0[3]),\n                save!(t3 =&gt; a0[4]),\n                save!(t4 =&gt; a0[5]),\n                save!(t5 =&gt; a0[6]),\n                save!(t6 =&gt; a0[7]),\n                \/\/ \u8c03\u7528\u5feb\u901f\u8def\u5f84\u51fd\u6570\n                \/\/\n                \/\/ | reg    | position\n                \/\/ | ------ | -\n                \/\/ | ra     | `TrapHandler.context`\n                \/\/ | t0-t6  | `TrapHandler.context`\n                \/\/ | a0     | `TrapHandler.scratch`\n                \/\/ | a1-a7  | \u53c2\u6570\u5bc4\u5b58\u5668\n                \/\/ | sp     | sscratch\n                \/\/ | gp, tp | gp, tp\n                \/\/ | s0-s11 | \u4e0d\u652f\u6301\n                \/\/\n                \/\/ &gt; \u82e5\u8981\u4fdd\u7559\u9677\u5165\u4e0a\u4e0b\u6587\uff0c\n                \/\/ &gt; \u5fc5\u987b\u5728\u5feb\u901f\u8def\u5f84\u4fdd\u5b58 a0-a7 \u5230 `TrapHandler.context`\uff0c\n                \/\/ &gt; \u5e76\u8fdb\u5165\u5b8c\u6574\u8def\u5f84\u6267\u884c\u540e\u7eed\u64cd\u4f5c\u3002\n                \/\/ &gt;\n                \/\/ &gt; \u82e5\u8981\u5207\u6362\u4e0a\u4e0b\u6587\uff0c\u5728\u5feb\u901f\u8def\u5f84\u8bbe\u7f6e gp\/tp\/sscratch\/sepc \u548c sstatus\u3002\n                \"mv   a0, sp\",\n                load!(sp[1] =&gt; ra),\n                \"jalr ra\",\n                \"0:\", \/\/ \u52a0\u8f7d\u4e0a\u4e0b\u6587\u6307\u9488\n                load!(sp[0] =&gt; a1),\n                \/\/ 0\uff1a\u8bbe\u7f6e\u5c11\u91cf\u53c2\u6570\u5bc4\u5b58\u5668\n                \"   beqz  a0, 0f\",\n                \/\/ 1\uff1a\u8bbe\u7f6e\u6240\u6709\u53c2\u6570\u5bc4\u5b58\u5668\n                \"   addi  a0, a0, -1\n                beqz  a0, 1f\n                \",\n                \/\/ 2\uff1a\u8bbe\u7f6e\u6240\u6709\u8c03\u7528\u8005\u5bc4\u5b58\u5668\n                \"   addi  a0, a0, -1\n                beqz  a0, 2f\n                \",\n                \/\/ 3\uff1a\u8bbe\u7f6e\u6240\u6709\u5bc4\u5b58\u5668\n                \"   addi  a0, a0, -1\n                beqz  a0, 3f\n                \",\n                \/\/ 4\uff1a\u5b8c\u6574\u8def\u5f84\n                save!(s0  =&gt; a1[16]),\n                save!(s1  =&gt; a1[17]),\n                save!(s2  =&gt; a1[18]),\n                save!(s3  =&gt; a1[19]),\n                save!(s4  =&gt; a1[20]),\n                save!(s5  =&gt; a1[21]),\n                save!(s6  =&gt; a1[22]),\n                save!(s7  =&gt; a1[23]),\n                save!(s8  =&gt; a1[24]),\n                save!(s9  =&gt; a1[25]),\n                save!(s10 =&gt; a1[26]),\n                save!(s11 =&gt; a1[27]),\n                \/\/ \u8c03\u7528\u5b8c\u6574\u8def\u5f84\u51fd\u6570\n                \/\/\n                \/\/ | reg    | position\n                \/\/ | ------ | -\n                \/\/ | sp     | sscratch\n                \/\/ | gp, tp | gp, tp\n                \/\/ | else   | `TrapHandler.context`\n                \/\/\n                \/\/ &gt; \u82e5\u8981\u4fdd\u7559\u9677\u5165\u4e0a\u4e0b\u6587\uff0c\n                \/\/ &gt; \u5728\u5b8c\u6574\u8def\u5f84\u4e2d\u4fdd\u5b58 gp\/tp\/sp\/pc \u5230 `TrapHandler.context`\u3002\n                \/\/ &gt;\n                \/\/ &gt; \u82e5\u8981\u5207\u6362\u4e0a\u4e0b\u6587\uff0c\u5728\u5b8c\u6574\u8def\u5f84\u8bbe\u7f6e gp\/tp\/sscratch\/sepc \u548c sstatus\u3002\n                \"mv   a0, sp\",\n                load!(sp[2] =&gt; ra),\n                \"jalr ra\",\n                \"j    0b\",\n                \"3:\", \/\/ \u8bbe\u7f6e\u6240\u6709\u5bc4\u5b58\u5668\n                load!(a1[16] =&gt; s0),\n                load!(a1[17] =&gt; s1),\n                load!(a1[18] =&gt; s2),\n                load!(a1[19] =&gt; s3),\n                load!(a1[20] =&gt; s4),\n                load!(a1[21] =&gt; s5),\n                load!(a1[22] =&gt; s6),\n                load!(a1[23] =&gt; s7),\n                load!(a1[24] =&gt; s8),\n                load!(a1[25] =&gt; s9),\n                load!(a1[26] =&gt; s10),\n                load!(a1[27] =&gt; s11),\n                \"2:\", \/\/ \u8bbe\u7f6e\u6240\u6709\u8c03\u7528\u8005\u5bc4\u5b58\u5668\n                load!(a1[ 0] =&gt; ra),\n                load!(a1[ 1] =&gt; t0),\n                load!(a1[ 2] =&gt; t1),\n                load!(a1[ 3] =&gt; t2),\n                load!(a1[ 4] =&gt; t3),\n                load!(a1[ 5] =&gt; t4),\n                load!(a1[ 6] =&gt; t5),\n                load!(a1[ 7] =&gt; t6),\n                \"1:\", \/\/ \u8bbe\u7f6e\u6240\u6709\u53c2\u6570\u5bc4\u5b58\u5668\n                load!(a1[10] =&gt; a2),\n                load!(a1[11] =&gt; a3),\n                load!(a1[12] =&gt; a4),\n                load!(a1[13] =&gt; a5),\n                load!(a1[14] =&gt; a6),\n                load!(a1[15] =&gt; a7),\n                \"0:\", \/\/ \u8bbe\u7f6e\u5c11\u91cf\u53c2\u6570\u5bc4\u5b58\u5668\n                load!(a1[ 8] =&gt; a0),\n                load!(a1[ 9] =&gt; a1),\n                exchange!(),\n                r#return!(),\n        )\n}<\/code><\/pre>\n<p>\u4e5f\u5c31\u662f\u4e00\u5f00\u59cb\u53ea\u4fdd\u5b58\uff0ct0-t6\uff0cra\uff0c\u7136\u540e\u5c06a0-a7\u5f53\u4f5c\u53c2\u6570\u5bc4\u5b58\u5668\uff0c\u7136\u540e\u8df3\u5230fast handler\u6765\u505a\u5206\u53d1\uff0csyscall\u91cc\u9762\u6709\u4e00\u4e2aexit\u503c\u5f97\u8bf4\u4e00\u4e0b\uff0c\u4ed6\u4f1a\u8bbe\u7f6esepc\uff0c\u5e76\u4e14\u4f1a\u628a\u4e0b\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u52a0\u8f7d\u5230\u76f8\u5e94\u4f4d\u7f6e\u4e0a\uff0c\u7136\u540e\u540c\u6837\u4e5f\u662frestore<\/p>\n<p>\u8dd1\u51fa\u6765\u7684\u611f\u89c9\u8fd8\u662f\u5f88\u4e0d\u9519\u7684\uff0c\u6709\u79cd\u4e4b\u524d\u5199\u8d85\u6807\u91cf\u5904\u7406\u5668\uff0c\u8dd1\u51fa\u7b2c\u4e00\u6761\u6307\u4ee4\u7684\u611f\u89c9\uff0c\u5c31\u662f\u90a3\u79cd\u590d\u6742\u601d\u60f3\u7adf\u7136\u88ab\u6211\u5199\u51fa\u6765\u4e86\uff0c\u7136\u540e\u4ed6\u7adf\u7136\u8fd8work\uff0c\u8fd8\u662f\u6781\u5927\u7684\u589e\u5927\u4e86\u6211\u7684\u4fe1\u5fc3<\/p>\n<h1>5.\u5b9e\u73b0\u65b0\u7684syscall\uff08\u7ec3\u4e60\uff09<\/h1>\n<p>\u8fd9\u662f\u7ec3\u4e60\u9898<\/p>\n<blockquote>\n<ol>\n<li>** \u6269\u5c55\u5185\u6838\uff0c\u5b9e\u73b0\u65b0\u7cfb\u7edf\u8c03\u7528get_taskinfo\uff0c\u80fd\u663e\u793a\u5f53\u524dtask\u7684id\u548ctask name\uff1b\u5b9e\u73b0\u4e00\u4e2a\u88f8\u673a\u5e94\u7528\u7a0b\u5e8fB\uff0c\u80fd\u8bbf\u95eeget_taskinfo\u7cfb\u7edf\u8c03\u7528\u3002<\/li>\n<\/ol>\n<\/blockquote>\n<p>\u8fd9\u7b97\u662f\u81ea\u5b9a\u4e49\u7684\u4e00\u4e2asyscall\u4e86\u5427\uff0c\u6211\u6253\u7b97\u628a\u81ea\u5b9a\u4e49\u7684syscall\u90fd\u5206\u914d\u52301000\u4ee5\u540e<\/p>\n<p>task id\u597d\u8bf4\uff0c\u76f4\u63a5\u628aapp id\u4f20\u51fa\u53bb\u5c31\u597d\u4e86\uff0c\u4f46\u662ftask name\u662f\u4ec0\u4e48\u9b3c\uff0ctask name\u8c8c\u4f3c\u6ca1\u6709\u4efb\u4f55\u9014\u5f84\u4f20\u8fdb\u53bb\u7684\u8bf4\uff0c\u9664\u975e\u6539\u7f16\u8bd1\u90e8\u5206\uff0c\u628a\u8fd9\u4e2a\u5f53\u4f5c\u67d0\u4e2a\u6570\u636e\u4f20\u8fdb\u53bb<\/p>\n<p>\u89e3\u51b3\u8fd9\u4e2a\u4e4b\u524d\uff0c\u6211\u4e0d\u592a\u77e5\u9053\u8be5\u600e\u4e48\u8fd4\u56desyscall\u7684\u503c\uff0c\u6bd5\u7adf\u53ea\u80fd\u4ecea0\u8fd4\u56de\uff08\u6700\u591aa1\uff09\uff0c\u4e8e\u662f\u6211\u53c2\u8003\u4e86linux\u7684\u90a3\u4e9bsyscall\uff0c\u6bd4\u5982\u8bf4\u591a\u8fd4\u56de\u503c\u7684pipe\uff0clinux\u4e00\u822c\u662f\u901a\u8fc7\u76f4\u63a5\u4fee\u6539\u7528\u6237\u7ed9\u7684\u4e00\u4e2a\u7ed3\u6784\u4f53\u7684\u6307\u9488\u6765\u505a\u8fd4\u56de\u7684\uff0c\u4e8e\u662f\u6211\u4e5f\u53ef\u4ee5\u5b66\u4e60\u4ed6\u7684\u505a\u6cd5\uff0c\u5b9a\u4e49\u4e00\u4e2a\u53eb\u505atask_info\u7684\u7ed3\u6784\u4f53\uff0c\u7136\u540e\u8fd4\u56de\u8fd9\u4e2a\u7ed3\u6784\u4f53\uff0c\u7136\u540ea0\u5728\u6210\u529f\u65f6\u662f0<\/p>\n<p>\u7136\u540e\u91cc\u9762\u6709\u4e00\u4e2a\u5b57\u7b26\u4e32\uff08task name\uff09\uff0c\u8fd9\u4e2a\u7684\u8fd4\u56de\u6709\u70b9\u9ebb\u70e6\uff0c\u6211\u770b\u5230\u6709\u7c7b\u4f3c\u7684syscall\u53eb\u505agetcwd\uff0c\u4ed6\u7684\u539f\u578b\u662f <code>char *getcwd(char *buf, size_t size);<\/code>\uff0c\u5373\u5c06path copy\u8fdbbuf\uff0c\u5982\u679cpath\u8d85\u8fc7size\uff0c\u5219\u8fd4\u56denull\uff0c\u5982\u679c\u6210\u529f\uff0c\u5c31\u8fd4\u56debuf\u7684\u8fd9\u4e2a\u6307\u9488\uff0c\u6240\u4ee5\u6211\u8ba4\u4e3a\u5982\u679c\u9700\u8981\u5b9e\u73b0\u8fd9\u4e2asyscall\u6700\u597d\u662f\u628a\u5b83\u5206\u4e3a\u4e24\u4e2asyscall\uff0c\u4e00\u4e2a\u8fd4\u56dename\u4e00\u4e2a\u8fd4\u56deid<\/p>\n<p>\u5f53\u7136\uff0c\u4ed6\u7684\u4efb\u52a1\u4ec5\u4ec5\u662f\u8ba9\u6211\u663e\u793a\u8fd9\u4e24\u4e2a\uff0c\u5e76\u4e14\u6211\u53bb\u770b\u522b\u4eba\u7684\u5b9e\u73b0\uff0c\u4e5f\u90fd\u6ca1\u6709\u5b9e\u73b0\u8fd4\u56de\uff0c\u5e76\u4e14\u4e5f\u90fd\u6ca1\u6709\u6253\u5370\u51fataskname\uff0c\u603b\u4e4b\u8fd9\u4e2a\u4efb\u52a1\u5c31\u611f\u89c9\u602a\u602a\u7684\uff0c\u6211\u6253\u7b97\u5c31\u5b9e\u73b0\u4e00\u4e2a\u8fd4\u56detask id\u7684syscall<\/p>\n<p>\u4f46\u662f\u6211\u7a81\u7136\u53d1\u73b0\uff0c\u5982\u679c\u662f\u5728\u591a\u6838\u8fd0\u884c\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u7adf\u7136\u4e0d\u77e5\u9053\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u7684id\uff0c\u539f\u56e0\u662f\u6211\u53ea\u6709\u4e00\u4e2a\u5168\u5c40\u4e0a\u9501\u7684\u53d8\u91cf\u6307\u793a\u5f53\u524d\u8fd0\u884c\u5230\u54ea\u4e2a\u7a0b\u5e8f\u4e86\uff0c\u800c\u5f53\u524d\u8fd0\u884c\u7a0b\u5e8f\u7684id\u662fhart local\u7684\uff0c\u800c\u4e14\u6211\u5e76\u6ca1\u6709\u4fdd\u5b58\u8fd9\u4e2a\u4e8b\u60c5\uff0c\u6240\u4ee5\u4f1a\u51fa\u95ee\u9898\uff0c\u4f46\u662f\u6211\u73b0\u5728\u6682\u65f6\u53ea\u662f\u652f\u6301\u5355\u6838\uff0c\u6240\u4ee5\u6211\u76f4\u63a5\u8bfb\u8fd9\u4e2a\u5168\u5c40\u53d8\u91cf\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u4f46\u662f\u4e4b\u540e\u9700\u8981\u4fee\u6539\u4ed6\u7684\u5b9e\u73b0<\/p>\n<p>\u4f46\u662f\u5728\u5b9e\u73b0\u8fc7\u7a0b\u4e2d\uff0c\u7528\u6237\u7a0b\u5e8f\u62a5\u4e86\u4e00\u4e2aload fault\u7684\u5f02\u5e38\uff0c\u6211gdb\u505a\u8c03\u8bd5\uff0c\u627e\u5230\u4e86\u51fa\u95ee\u9898\u7684\u90a3\u4e2a\u5730\u5740\uff0c\u7136\u540eobjdump\uff0c\u53d1\u73b0\u51fa\u73b0\u95ee\u9898\u7684\u662f\u5728<code>impl core::fmt::Display for i64<\/code>\u8fd9\u4e2a\u51fd\u6570\u4e2d\uff0c\u4ed6load\u4e86\u4e00\u4e2a0\u5730\u5740<\/p>\n<p>woc\uff0c\u6211\u6539\u6210debug mode\u7f16\u8bd1\uff0c\u5c31\u6ca1\u95ee\u9898\u4e86\uff1fmd\u8fd9\u79cd\u77f3\u4e5f\u80fd\u88ab\u6211\u78b0\u5230\uff0c\u4e5f\u662f\u795e\u4e86<\/p>\n<p>\u597d\u5427\uff0c\u5728\u7ecf\u8fc7\u5f88\u957f\u7684\u65f6\u95f4\u7684debug\uff0c\u6211\u53d1\u73b0\u4e86\u6211\u7684bug\uff0c\u6211\u9996\u5148\u53d1\u73b0\u5728user lib\u7684syscall\u4e2d\u52a0\u4e00\u4e2a<code>clobber_abi(\"C\")<\/code>\uff0c\u5c31\u53ef\u4ee5\u6b63\u5e38\u5de5\u4f5c\u4e86\uff0c\u7136\u540e\u6211\u53d1\u73b0\u8fd9\u4e2a\u662f\u5e2e\u52a9\u6211\u4fdd\u5b58\u4e86\u6240\u6709caller\u9700\u8981\u4fdd\u5b58\u7684\u5bc4\u5b58\u5668\uff0c\u5305\u62eca0-a7\uff0ct0-t7\uff0c\u7136\u540e\u6211\u611f\u89c9\u4e0d\u592a\u5bf9\uff0c\u8fd9\u4e2a\u5bc4\u5b58\u5668\u8fd9\u4e48\u591a\u592a\u4fdd\u5b88\u4e86\uff0c\u7136\u540e\u6211gdb\u89c2\u770becall\u524d\u540e\u7684\u5bc4\u5b58\u5668\uff0c\u6211\u53d1\u73b0a7\u53d8\u4e3a0\u4e86\uff0c\u7136\u540e\u6211\u53d1\u73b0\u6211\u5728fast_handler\u4e2d\u53ea\u8bbe\u7f6e\u4e86ctx\u4e2d\u7684a0\uff0c\u5176\u4ed6\u7684\u90fd\u8fd8\u662f0\uff0c\u5982\u679c\u6211\u4f7f\u7528restore\uff0c\u5c31\u4f1a\u5bfc\u81f4a1-a7\u5168\u90e8\u53d8\u4e3a0\uff0c\u6240\u4ee5\u6211\u9700\u8981\u5728fast handler\u4e2d\u624b\u52a8\u4fdd\u5b58\u8fd9\u4e9b\u5bc4\u5b58\u5668\uff0c\u7136\u540e\u66f4\u6539\u5176\u4e2d\u7684a0\uff0c\u6b64\u65f6\u5c31\u4e00\u5207\u6b63\u5e38\u4e86\uff08\u5dee\u70b9\u4ee5\u4e3a\u662frust\u7684bug hhh\uff09<\/p>\n<h1>6.\u6253\u5370\u8c03\u7528\u6808\uff08panic\u65f6\uff09\uff08\u7ec3\u4e60\uff09<\/h1>\n<blockquote><p>*** \u5b9e\u73b0\u4e00\u4e2a\u88f8\u673a\u5e94\u7528\u7a0b\u5e8fA\uff0c\u80fd\u6253\u5370\u8c03\u7528\u6808\u3002<\/p><\/blockquote>\n<p>\u5728panic\u65f6\u80fd\u6253\u5370\u5185\u6838\u7684\u8c03\u7528\u6808\u65b9\u4fbf\u8c03\u8bd5\uff0c\u5b9e\u9645\u4e0a\u8fd9\u5c31\u662f\u4e00\u4e2aunwind\u7684\u8fc7\u7a0b<\/p>\n<p>\u9996\u5148\u7b2c\u4e00\u4e2a\u95ee\u9898\uff0c\u6211\u7684\u4ee3\u7801\u4e2d\uff0c\u8c8c\u4f3c\u6ca1\u6709\u7528fp\uff1f\uff0c\u4e3a\u5565\u6211\u770b\u6211\u7684fp\u4e00\u76f4\u662f0<\/p>\n<p>\u6211\u4e0a\u7f51\u641c\u4e86\u4e00\u4e0b\uff0c\u53d1\u73b0riscv\u5176\u5b9e\u5e76\u4e0d\u9700\u8981\u4f7f\u7528fp\uff0cfp\u7684\u4f5c\u7528\u5c31\u662f\u5728unwind\u7684\u65f6\u5019\u4f1a\u53d1\u751f\u4f5c\u7528\uff0c\u7136\u540e\u6709\u4e00\u4e2a\u7f16\u8bd1\u9009\u9879<code>-fomit-frame-pointer<\/code>\u4f1a\u8ba9\u4ee3\u7801\u751f\u6210\u4f7f\u7528fp\u7684\u4ee3\u7801<\/p>\n<p>\u7136\u540e\u6211\u6253\u7b97\u5b9a\u4e49\u4e00\u4e2afeature\uff0c\u53eb\u505aunwind_in_panic\uff0c\u7136\u540e\u63a7\u5236\u7f16\u8bd1\u662f\u5426\u4f7f\u7528\u8fd9\u4e2a\u7f16\u8bd1\u9009\u9879+\u662f\u5426\u5728panic\u65f6unwind\uff0c\u53d1\u73b0\u8fd9\u4ef6\u4e8b\u7adf\u7136\u505a\u4e0d\u5230\uff0c\u592asb\u4e86\uff0c\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u518dbuild.rs\u91cc\u9762\u4f20\u7f16\u8bd1\u9009\u9879<\/p>\n<p>\u6700\u540e\u662f\u5728config.toml\u4e2d\u4f20\u7f16\u8bd1\u9009\u9879\uff0c\u7136\u540e\u5728build.rs\u6765\u4fa6\u6d4b\u662f\u5426\u6709\u8fd9\u4e2a\u7f16\u8bd1\u9009\u9879\uff0c\u5982\u679c\u6709\uff0c\u5c31\u5f00\u542f\u4e00\u4e2acfg\uff0c\u7136\u540e\u4ee3\u7801\u4e2d\u5c31\u53ef\u4ee5\u6761\u4ef6\u7f16\u8bd1\u4e86<\/p>\n<p>\u7136\u540e\u901a\u8fc7\u4e86\u89e3fp-16\u4fdd\u5b58\u7740\u4e0a\u4e00\u4e2afp\uff0c\u6240\u4ee5\u53ef\u4ee5\u8fd9\u6837\u4e0d\u65ad\u9012\u5f52\u7684\u53bb\u627efp<\/p>\n<p>\u4f46\u662f\u9700\u8981\u4e00\u4e2a\u673a\u5236\u505c\u4e0b\u6765\uff0c\u6211\u53d1\u73b0\u4e00\u5f00\u59cb\u7684fp\u5e94\u8be5\u662f0\u7684\uff0c\u6240\u4ee5\u5c31\u4e00\u76f4\u9012\u5f52\u5230\u68c0\u6d4b\u5230\u4ed6\u662f0\u5c31\u597d\u4e86<\/p>\n<p>\u7136\u540e\u5199\u51fa\u6765\u5c31\u597d\u4e86\uff0c\u4f46\u662f\u6211\u53d1\u73b0\u6211\u5927\u591a\u662f\u76f4\u63a5\u7528asm\u5199\u7684\uff0c\u4f46\u662f\u53c2\u8003\u7b54\u6848\u662f\u53ea\u5728\u4e00\u5f00\u59cb\u7528asm\u83b7\u53d6fp\u7684\u503c\uff0c\u7136\u540e\u4e4b\u540e\u5168\u90e8\u4f7f\u7528\u4e86rust\u7684\u65b9\u6cd5\uff0c\u4f46\u662f\u90fd\u65e0\u6240\u8c13\u4e86<\/p>\n<h1>7.\u7edf\u8ba1\u8bbf\u95ee\u7cfb\u7edf\u8c03\u7528\u7684\u6b21\u6570\uff08\u7ec3\u4e60\uff09<\/h1>\n<blockquote><p>** \u6269\u5c55\u5185\u6838\uff0c\u80fd\u591f\u7edf\u8ba1\u591a\u4e2a\u5e94\u7528\u7684\u6267\u884c\u8fc7\u7a0b\u4e2d\u7cfb\u7edf\u8c03\u7528\u7f16\u53f7\u548c\u8bbf\u95ee\u6b64\u7cfb\u7edf\u8c03\u7528\u7684\u6b21\u6570\u3002<\/p><\/blockquote>\n<p>\u8fd9\u4e2a\u4e1c\u897f\u672c\u8eab\u4e0d\u96be\uff0c\u6309\u7406\u6765\u8bf4\u53ea\u8981\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf\u5c31\u53ef\u4ee5\u4e86\uff0c\u4f46\u662f\uff0c\u5982\u679c\u662f\u591a\u6838\u7684\u60c5\u51b5\u4e0b\uff0c\u5168\u5c40\u53d8\u91cf\u80af\u5b9a\u662f\u4e0d\u884c\u7684\uff0c\u8fd9\u4e9b\u4fe1\u606f\u80af\u5b9a\u662fhart local\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u8003\u8651\u628a\u8fd9\u4e2a\u4fe1\u606f\u653e\u5230HartContext\u91cc\u9762\uff0c\u5305\u62ec\u4e0a\u9762\u7684taskid\uff0c\u80af\u5b9a\u662f\u4e0d\u80fd\u76f4\u63a5\u8bfb\u5168\u5c40\u53d8\u91cf\u7684<\/p>\n<p>\u7136\u540e\u8981\u4f7f\u5728\u8fd0\u884c\u7684\u65f6\u5019\u53ef\u4ee5\u8bbf\u95eeHartContext\uff0c\u6211\u8ba4\u4e3a\u6bd4\u8f83\u65b9\u4fbf\u7684\u65b9\u5f0f\u662f\u628aHartContext\u7684\u5730\u5740\u5b58\u5728TrapHandler\u4e2d\uff0c\u7136\u540e\u628a\u5b83\u4f5c\u4e3actx\u4f20\u7ed9fast_handler<\/p>\n<p>\u4e0d\u8fc7\u5176\u5b9e\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\uff0c\u5c31\u662f\u5728boot\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u4fe1\u606f\u662f\u5b58\u5728\u5728sscratch\u4e2d\u7684\uff0c\u5728syscall\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u4fe1\u606f\u662f\u6e38\u79bb\u7684\uff0c\u5373\u4e0d\u4f1a\u5b58\u5728\u4e00\u4e2a\u56fa\u5b9a\u7684\u5730\u65b9<\/p>\n<p>\u6240\u4ee5\u6211\u8ba4\u4e3a\u53ef\u4ee5\u5728syscall\u7684\u65f6\u5019\u591a\u4fdd\u5b58\u4e00\u4e2atp\u5bc4\u5b58\u5668\uff0c\u7136\u540e\u7528\u8fd9\u4e2atp\u5bc4\u5b58\u5668\u6307\u5411\u4e4b\u524d\u7684sscratch\uff0c\u8fd9\u6837\u6211\u53ef\u4ee5\u5c01\u88c5\u4e24\u4e2a\u5bf9\u4e8ehartContext\u7684\u65b9\u6cd5\uff0c\u4e00\u4e2a\u662fboot time\uff0c\u4e00\u4e2a\u662ftrap time\uff0c\u7136\u540e\u8bbe\u7f6e\u4e24\u5957logger\uff0c\u7136\u540e\u7528dyn\u5b9e\u73b0\u66ff\u6362\uff0c\u5c31\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u5b9e\u73b0\u6253\u5370\u51fahart id<\/p>\n<p>\u5bf9\u4e8etaskid\uff0c\u53ef\u4ee5\u5728\u6bcf\u6b21\u8fd0\u884crun_next_app\u7684\u65f6\u5019\u8bbe\u7f6e\u5bf9\u5e94\u7684HartContext\u5b57\u6bb5\uff0c\u5f53\u7136\u5c31\u4e5f\u9700\u8981\u4e24\u4e2a\u65b9\u6cd5<\/p>\n<p>\u7136\u540e\u540c\u6837\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u8fd9\u4e2a\u7cfb\u7edf\u8c03\u7528\u7f16\u53f7\u548c\u6b21\u6570\uff0c\u4f46\u662f\u8fd9\u4e2a\u6bd4\u8f83\u65b9\u4fbf\u4f7f\u7528hashmap\u6765\u8868\u793a\uff0c\u4f46\u662f\u6211\u5728core\u4e2d\u6ca1\u6709\u627e\u6253hashmap\uff0c\u4f46\u662f\u6211\u627e\u5230\u4e86\u4e00\u4e2aalloc crate\u91cc\u9762\u7684Btreemap<\/p>\n<h1>8.\u7edf\u8ba1\u5e94\u7528\u8fd0\u884c\u65f6\u95f4\uff08\u7ec3\u4e60\uff09<\/h1>\n<blockquote><p>** \u6269\u5c55\u5185\u6838\uff0c\u80fd\u591f\u7edf\u8ba1\u6bcf\u4e2a\u5e94\u7528\u6267\u884c\u540e\u7684\u5b8c\u6210\u65f6\u95f4\u3002<\/p><\/blockquote>\n<p>\u8fd9\u4e2a\u4efb\u52a1\u770b\u4e0a\u53bb\u8fd8\u633a\u56f0\u96be\u7684\u8bf4\uff0c\u56e0\u4e3a\u8981\u52a0\u4e00\u4e2a\u65b0\u7684time\u7684api<\/p>\n<p>\u6211\u4e4b\u524d\u53ea\u6709\u4e00\u4e2asleep\u7684api\uff0c\u8fd9\u4e2a\u7684\u5b9e\u73b0\u662f\u901a\u8fc7\u8bbe\u7f6e\u4e00\u6bb5\u65f6\u95f4\u7684\u95f4\u9699\uff0c\u8ba9\u5904\u7406\u5668\u8fdb\u5165idle\u6216\u8005wfi\u72b6\u6001\uff0c\u7136\u540e\u8bbe\u7f6e\u4e00\u4e2a\u65f6\u949f\u4e2d\u65ad<\/p>\n<p>\u73b0\u5728\u7684\u8bdd\uff0c\u6bd4\u8f83\u5408\u9002\u7684api\u8bbe\u8ba1\u662f\u83b7\u53d6\u5f53\u524d\u7684\u65f6\u95f4\uff0c\u6211\u8ba4\u4e3a\u8fd9\u4e2a\u7edd\u5bf9\u662f\u6709\u6307\u4ee4\u7684\uff0c\u56e0\u4e3a\u6211\u8bb0\u5f97la\u7684\u6211\u5b9e\u73b0\u8fc7<\/p>\n<p>\u5bf9\u4e8eriscv\u8c8c\u4f3c\u4e5f\u5f88\u7b80\u5355\uff0c\u5c31\u662fmtime\u5bc4\u5b58\u5668\uff0c\u4f46\u662f\u6211\u8bbf\u95ee\u4e0d\u4e86\uff0c\u4f46\u662f\u6709\u4e00\u4e2atime reg\uff0c\u8c8c\u4f3c\u5c31\u662fmtime\u7684\u6620\u5c04\uff0c\u4f46\u662f\u4e3a\u5565\u8981\u505a\u4e00\u4e2amtime\u5bc4\u5b58\u5668\uff0c\u662f\u56e0\u4e3am mode\u53ef\u5199\u4ed6\u5417<\/p>\n<p>\u603b\u4e4b\u633a\u7b80\u5355\u7684\uff0c\u7136\u540emhz\u548cns\u7684\u6362\u7b97\u662ff mhz = 1000\/f ns\uff0c\u5f53\u7136ns\u662f\u5468\u671f\uff0cmhz\u662f\u9891\u7387<\/p>\n<p>\u7136\u540e\u6211\u8fd8\u628aapp\u76f8\u5173\u7684\u4e1c\u897f\u6253\u5305\u5230app_info struct\uff0c\u7136\u540e\u76f8\u5173\u65b9\u6cd5\u4e5f\u4eceHartContext\u5206\u79bb\u5f00\u4e86\uff0c\u66f4\u6e05\u6670\u4e86<\/p>\n<h1>9.\u7edf\u8ba1\u6253\u5370\u66f4\u6e05\u6670\u7684\u7528\u6237\u7a0b\u5e8f\u9519\u8bef\u4fe1\u606f\uff08\u7ec3\u4e60\uff09<\/h1>\n<blockquote><p>*** \u6269\u5c55\u5185\u6838\uff0c\u7edf\u8ba1\u6267\u884c\u5f02\u5e38\u7684\u7a0b\u5e8f\u7684\u5f02\u5e38\u60c5\u51b5\uff08\u4e3b\u8981\u662f\u5404\u79cd\u7279\u6743\u7ea7\u6d89\u53ca\u7684\u5f02\u5e38\uff09\uff0c\u80fd\u591f\u6253\u5370\u5f02\u5e38\u7a0b\u5e8f\u7684\u51fa\u9519\u7684\u5730\u5740\u548c\u6307\u4ee4\u7b49\u4fe1\u606f\u3002<\/p><\/blockquote>\n<p>\u8fd9\u4e2a\u6253\u5370\u51fa\u51fa\u9519\u7684\u6307\u4ee4\u6709\u70b9\u96be\uff0c\u603b\u4e4b\u5982\u679c\u8981\u663e\u793a\u6307\u4ee4\uff0c\u9700\u8981\u53cd\u6c47\u7f16\uff0c\u611f\u89c9\u662f\u6709\u70b9\u9ebb\u70e6\u7684\uff0c\u56e0\u4e3a\u9700\u8981\u591a\u67b6\u6784\u7684\u53cd\u6c47\u7f16\uff0c\u751a\u81f3\u8fd8\u6709\u4e0d\u540c\u957f\u5ea6\u7684\u6307\u4ee4\uff0c\u6bd4\u5982\u538b\u7f29\u6307\u4ee4\uff0c\u6240\u4ee5\u4e0d\u6253\u5370\u6307\u4ee4\u4e86<\/p>\n<p>\u7136\u540e\u5176\u4ed6\u7684\u5c31\u589e\u52a0\u51e0\u6761sepc\uff0cstval\u7684\u6253\u5370\uff0c\u6ca1\u4ec0\u4e48\u96be\u5ea6<\/p>\n<h1>10.sys_write \u5b89\u5168\u68c0\u67e5\uff08\u7ec3\u4e60\uff09<\/h1>\n<blockquote><p>ch2 \u4e2d\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u7b2c\u4e00\u4e2a\u7cfb\u7edf\u8c03\u7528 <code>sys_write<\/code>\uff0c\u8fd9\u4f7f\u5f97\u6211\u4eec\u53ef\u4ee5\u5728\u7528\u6237\u6001\u8f93\u51fa\u4fe1\u606f\u3002\u4f46\u662f os \u5728\u63d0\u4f9b\u670d\u52a1\u7684\u540c\u65f6\uff0c\u8fd8\u6709\u4fdd\u62a4 os \u672c\u8eab\u4ee5\u53ca\u5176\u4ed6\u7528\u6237\u7a0b\u5e8f\u4e0d\u53d7\u9519\u8bef\u6216\u8005\u6076\u610f\u7a0b\u5e8f\u7834\u574f\u7684\u529f\u80fd\u3002<\/p>\n<p>\u7531\u4e8e\u8fd8\u6ca1\u6709\u5b9e\u73b0\u865a\u62df\u5185\u5b58\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u7528\u6237\u7a0b\u5e8f\u4e2d\u6307\u5b9a\u4e00\u4e2a\u5c5e\u4e8e\u5176\u4ed6\u7a0b\u5e8f\u5b57\u7b26\u4e32\uff0c\u5e76\u5c06\u5b83\u8f93\u51fa\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5408\u7406\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u8981\u5bf9 sys_write \u505a\u68c0\u67e5\uff1a<\/p>\n<ul>\n<li>sys_write \u4ec5\u80fd\u8f93\u51fa\u4f4d\u4e8e\u7a0b\u5e8f\u672c\u8eab\u5185\u5b58\u7a7a\u95f4\u5185\u7684\u6570\u636e\uff0c\u5426\u5219\u62a5\u9519\u3002<\/li>\n<\/ul>\n<h4>\u5b9e\u9a8c\u8981\u6c42<\/h4>\n<ul>\n<li>\u5b9e\u73b0\u5206\u652f: ch2-lab<\/li>\n<li>\u76ee\u5f55\u8981\u6c42\u4e0d\u53d8<\/li>\n<li>\u4e3a sys_write \u589e\u52a0\u5b89\u5168\u68c0\u67e5\n<p>\u5728 os \u76ee\u5f55\u4e0b\u6267\u884c <code>make run TEST=1<\/code> \u6d4b\u8bd5 <code>sys_write<\/code> \u5b89\u5168\u68c0\u67e5\u7684\u5b9e\u73b0\uff0c\u6b63\u786e\u6267\u884c\u76ee\u6807\u7528\u6237\u6d4b\u4f8b\uff0c\u5e76\u5f97\u5230\u9884\u671f\u8f93\u51fa\uff08\u8be6\u89c1\u6d4b\u4f8b\u6ce8\u91ca\uff09\u3002<\/p>\n<p>\u6ce8\u610f\uff1a\u5982\u679c\u8bbe\u7f6e\u9ed8\u8ba4 log \u7b49\u7ea7\uff0c\u4ece lab2 \u5f00\u59cb\u5173\u95ed\u6240\u6709 log \u8f93\u51fa\u3002<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u5373\u9700\u8981\u5bf9\u7528\u6237\u7ed9\u7684\u53c2\u6570\u8fdb\u884c\u5b89\u5168\u68c0\u67e5<\/p>\n<p>\u505a\u7684\u65f6\u5019\u771f\u7684\u53d1\u73b0\u51fa\u95ee\u9898\uff0c\u4f46\u662f\u6309\u7406\u6765\u8bf4\u4e0d\u5e94\u8be5\u51fa\u9519\u5440<\/p>\n<p>\u6709\u70b9\u50cf\u662f\u6253\u5370\u4e86Kernel stack\u7684\u4e1c\u897f<\/p>\n<p>\u54e6\u54e6\u60f3\u8d77\u6765\u4e86\uff0c\u6211\u7684user stack\u662f\u5728kernel stack\u8fb9\u4e0a\uff0c\u6240\u4ee5\u8fd8\u662f\u6211\u7684\u68c0\u6d4b\u5199\u9519\u4e86<\/p>\n<p>\u4f46\u662f\u6211\u66f4\u6539\u4e4b\u540e\u8fd8\u662f\u62a5\u9519\uff0c\u6211\u53d1\u73b0\u8c8c\u4f3c\u662f\u771f\u7684\u8d85\u8fc7\u4e86\u8303\u56f4<\/p>\n<p>\u4e4b\u540egdb\u8c03\u8bd5\u53d1\u73b0\u5728locat user stack\u7684\u65f6\u5019\uff0chartid\u672c\u6765\u662fa0\uff0c\u4f46\u662f\u7531\u4e8e\u4f7f\u7528\u4e4b\u524d\u8c03\u7528\u4e86\u53e6\u4e00\u4e2a\u51fd\u6570\uff0c\u5bfc\u81f4a0\u88ab\u8986\u76d6\u4e86\uff0c\u66f4\u6539\u4e86\u4e00\u4e0b\u987a\u5e8f\u5c31\u597d\u4e86\uff0c\u7136\u540e\u5c06\u4ed6\u7ed9\u7684\u6d4b\u8bd5\u7a0b\u5e8f\u590d\u5236\u8fc7\u6765\uff0c\u4ed6\u6d4b\u8bd5\u7a0b\u5e8f\u91cc\u9762\u6709\u4e00\u4e2a\u9a9a\u64cd\u4f5c\uff0c\u5982\u4f55\u5728\u7528\u6237\u7a0b\u5e8f\u91cc\u9762\u4ec5\u4ec5\u77e5\u9053sp\uff0c\u5c31\u53ef\u4ee5\u77e5\u9053\u6808\u7684top\u548cbottom\u5462\uff1f\u5982\u679c\u6808\u7684\u5927\u5c0f\u662f0x1000\uff0c\u90a3\u53ea\u8981\u6e05\u7a7a\u4f4e12\u4f4d\uff0c\u5c31\u662fbottom\uff0c\u4f46\u662f\u8fd9\u9700\u8981\u6808\u5c31\u662f0x1000\uff0c\u5f53\u71360x10000\u4e5f\u884c<\/p>\n<p>\u4f46\u662f\u6211\u628a\u6211\u7684kernel\u7684stack\u6539\u62100x1000\uff0c\u6211\u4ee5\u4e3a\u4e0d\u4f1a\u6709\u4ec0\u4e48\u53d8\u5316\uff0c\u4f46\u662f\u53d1\u73b0\u5361\u4f4f\u4e86\uff0c\u6539\u62100x2000\uff0c\u5361\u5728\u66f4\u524d\u9762\u4e86\uff0c\u6539\u62100x4000\u624d\u80fd\u8dd1\u8d77\u6765\uff0c\u611f\u89c9\u6709bug\uff0c\u4f46\u662f\u6709\u70b9\u6478\u4e0d\u7740\u5934\u8111\u7684\u8bf4\uff0c\u7136\u540e\u5f00\u59cbdebug\uff1a<\/p>\n<p>\u6211\u9996\u5148\u6539\u62100x1000\uff0c\u53d1\u73b0\u8dd1\u7684\u65f6\u5019\u6253\u5370\u7684hartid\u4e00\u76f4\u5728\u53d8\uff0c\u4e8e\u662f\u6211watch\u8fd9\u6bb5\u5185\u5b58\uff08\u5373stack\u7684\u6700\u4f4e\u5730\u5740\uff09\uff0c\u7136\u540e\u53d1\u73b0\u4ed6\u4f1a\u5728<code>core::alloc::layout::Layout::from_size_align_unchecked<\/code>\u4e2d\u88ab\u6539\u53d8\uff0c\u6211backtrace\u67e5\u770b\uff0c\u53d1\u73b0\u8fd9\u4e2a\u51fd\u6570\u662f\u5728\u6253\u5370log!\u4e2d\u88ab\u8c03\u7528\u7684\uff0c\u662f\u5728print\u91cc\u9762\u9700\u8981alloc\u4e00\u4e2a\u6570\u636e\u624d\u8c03\u7528\u7684\u8fd9\u4e2a\u51fd\u6570\uff0c\u6539\u6210layout asm\uff0c\u662f\u88abs0\u5373fp\u6539\u7684\uff0c\u6709\u70b9\u6478\u4e0d\u7740\u5934\u8111\uff0c\u6211\u5c1d\u8bd5\u5173\u95edfp\u8fd9\u4e2a\u5bc4\u5b58\u5668\uff0c\u53d1\u73b00x1000\u548c0x2000\u5168\u90e8\u6b7b\u5728\u6700\u524d\u9762\u4e86\uff08\u5373kernel\u6ca1\u6709\u6253\u5370\u4efb\u4f55\u4e1c\u897f\uff09<\/p>\n<p>\u4e0a\u8ff0\u4fe1\u606f\u6211\u6709\u70b9\u6000\u7591\u662f\u6211\u5728HartContext\u4e2d\u4f7f\u7528\u4e86BtreeMap\uff0c\u8fd9\u4e2a\u6570\u636e\u7ed3\u6784\u9700\u8981\u8c03\u7528alloc\uff0c\u4e8e\u662f\u6211\u628a\u4ed6\u6574\u4e2a\u5220\u6389\uff0c\u53d1\u73b0\u786e\u5b9e\u4e0d\u4f1a\u5361\u4f4f\u4e86\uff0c\u4f46\u662f0x1000\u7684\u6253\u5370hartid\u4f1a\u4e71\uff0c\u5e76\u4e14\u5728\u7b2c\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u5904panic\uff0c0x2000\u4f1a\u5728\u7b2c\u4e00\u4e2a\u6d4b\u8bd5\u7a0b\u5e8f\u90a3\u91ccpanic<\/p>\n<p>\u867d\u7136\u5f88\u4e0d\u76f8\u4fe1\uff0c\u4f46\u662f\u4e0d\u5f97\u4e0d\u6000\u7591\u662f\u4e0d\u662f\u6808\u6ea2\u51fa\uff0c\u8fd8\u771f\u662f\uff0cmd\uff0c4k byte\u5927\u5c0f\u7684\u6808\u5c31\u8fd9\u4e48\u88ab\u6ea2\u51fa\u4e86\uff0c\u7b11\u6b7b<\/p>\n<p>\u7136\u540e\u53ef\u4ee5\u8bd5\u4e00\u4e0b\uff0c\u76f4\u63a5watch $sp &lt;= \u6808\u9876\u5730\u5740\uff0c\u7136\u540ec\uff0c\u6765\u770b\u5728\u8fd0\u884c\u8fc7\u7a0b\u6709\u65e0\u6808\u6ea2\u51fa\u53d1\u751f\uff0c\u7136\u540e\u786e\u5b9e\u662f\u90fd\u7206\u4e86\uff08\u6211\u4e0d\u77e5\u9053\u7206\u63894k\u7684\u6808\u662f\u4e0d\u662f\u6b63\u5e38\u60c5\u51b5\u8bf4\u5b9e\u8bdd\uff0c\u8fd8\u662f\u8bf4rust\u5c31\u662f\u8fd9\u6837\u7684\uff09<\/p>\n<p>\u8981\u901a\u8fc7\u6d4b\u4f8b\u7684\u8bdd\uff0c\u9700\u8981\u5c06\u6808\u5927\u5c0f\u6539\u4e3a0x10000\uff0c\u7136\u540e\u6309\u716764K\u5bf9\u9f50<\/p>\n<p>\u4f46\u662f\u5176\u5b9e\u4e0d\u9700\u8981\uff0c\u6211\u662fuser stack\u548ckernel stack\u5171\u7528\u7684\u4e00\u4e2a\u5927\u5c0f\uff0c\u7136\u540e\u662f\u65f6\u5019\u5206\u5f00\u4e86\uff0c\u56e0\u4e3a\u5176\u5b9e\u4ed6\u4eec\u4e24\u4e2a\u672c\u6765\u5c31\u4e0d\u662f\u4e00\u4e2a\u7c7b\u578b\u7684\uff0c\u81f3\u5c11\u5728\u4ed6\u4eec\u8eab\u4e0a\u7684\u65b9\u6cd5\uff0c\u5f88\u591a\u90fd\u662fkernel stack\u72ec\u6709\u7684<\/p>\n<h1>\u591a\u6838\u5b9e\u73b0<\/h1>\n<blockquote><p>challenge: \u652f\u6301\u591a\u6838\uff0c\u5b9e\u73b0\u591a\u4e2a\u6838\u8fd0\u884c\u7528\u6237\u7a0b\u5e8f\u3002<\/p><\/blockquote>\n<p>\u6211\u5728\u524d\u9762\u505a\u4e86\u5f88\u591a\u65b9\u4fbf\u8fd9\u91cc\u5b9e\u73b0\u7684\u5de5\u4f5c\uff0c\u4e3b\u8981\u662f\u5bf9\u4e8ehart local\u7684\u4e00\u4e9b\u53d8\u91cf\u7684\u4e00\u4e9b\u5904\u7406\uff0c\u6bd4\u5982\u8bf4\u6b64hart\u8fd0\u884c\u7684app id\u7b49\u7b49\uff0c\u4f46\u662f\u4f9d\u7136\u6709\u4e9b\u4e1c\u897f\u4e0d\u597d\u5b9e\u73b0<\/p>\n<p>\u9996\u5148\u660e\u786e\u4e00\u4e0b\uff0c\u8fd9\u4e2a\u591a\u4e2a\u6838\u8fd0\u884c\u7528\u6237\u7a0b\u5e8f\u7684sync\u7684\u5417\uff0c\u5c31\u662f\u4ed6\u4eec\u8fd0\u884c\u7684\u662f\u6709\u5e8f\u7684\u5417\uff0c\u662f\u4e00\u4e2a\u7a0b\u5e8f\u4e00\u4e2a\u7a0b\u5e8f\u63a5\u7eed\u8fd0\u884c\uff0c\u8fd8\u662f\u5982\u679c\u67098\u4e2a\u6838\uff0c\u5c31\u80fd8\u4e2a\u7a0b\u5e8f\u540c\u65f6\u8fd0\u884c\uff0c\u6211\u8ba4\u4e3a\u524d\u8005\u6ca1\u6709\u4ec0\u4e48\u610f\u4e49\uff0c\u90a3\u6211\u5c31\u9ed8\u8ba4\u8fd9\u4e2a\u662f\u540e\u8005\u4e86<\/p>\n<p>\u540e\u8005\u51fa\u73b0\u7684\u7b2c\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4ed6\u4eec\u540c\u65f6\u8fd0\u884c\u7684\u65f6\u5019\uff0c\u4ed6\u4eec\u628a\u7a0b\u5e8f\u52a0\u8f7d\u5230\u54ea\u91cc\uff0c\u5982\u679c\u4ed6\u4eec\u7684\u52a0\u8f7d\u5730\u5740\u4e0d\u662f0x80400000\uff0c\u8fd9\u5c31\u610f\u5473\u7740\u8fd9\u4e9b\u7a0b\u5e8f\u90fd\u662f\u4f4d\u7f6e\u65e0\u5173\u7684\u7a0b\u5e8f\uff0c\u5373\u4ed6\u4eec\u4e0d\u5e94\u8be5\u4f9d\u8d56\u81ea\u5df1\u57280x80400000\u6216\u8005\u5176\u4ed6\u5730\u65b9<\/p>\n<p>\u901a\u8fc7\u641c\u7d22\uff0c\u627e\u5230\u4e86\uff0c\u8fd9\u4e2a\u5c5e\u4e8erustc\u7684codegen\u7684option\uff0c<a href=\"https:\/\/doc.rust-lang.org\/rustc\/codegen-options\/index.html#relocation-model\uff0c\u5373\u5728config.toml\u52a0\u4e00\u4e2a\">https:\/\/doc.rust-lang.org\/rustc\/codegen-options\/index.html#relocation-model\uff0c\u5373\u5728config.toml\u52a0\u4e00\u4e2a<\/a><code>\"-C\", \"relocation-model=pic\",<\/code>\u6211\u5c1d\u8bd5\u628a\u94fe\u63a5\u811a\u672c\u91cc\u9762\u76840x80400000\u5220\u6389\uff0c\u7136\u540e\u52a0\u8f7d\u5230\u8fd9\u4e2a\u5730\u5740\uff0c\u770b\u770b\u80fd\u4e0d\u80fd\u8fd0\u884c\uff0c\u770b\u8d77\u6765\u662f\u53ef\u4ee5\u7684\uff0cobjdump\u4e5f\u80fd\u770b\u5230\uff0c\u539f\u6765\u7684\u5730\u5740\u6d88\u5931\u4e86<\/p>\n<p>\u90a3\u8fd9\u4e2a\u7b2c\u4e00\u4e2a\u95ee\u9898\u5c31\u5dee\u4e0d\u591a\u89e3\u51b3\u4e86\uff0c\u7136\u540e\u5c31\u662f\u600e\u4e48\u52a0\u8f7d\uff0c\u6211\u611f\u89c9\u5c31\u53ef\u4ee5\u52a0\u8f7d\u52300x80400000\u7684\u4e00\u4e2a\u504f\u79fb\u5904\uff0c\u76f8\u5f53\u4e8e\u5e73\u79fb\uff0c\u7136\u540eload_app\u5fc5\u987b\u8fd4\u56de\u4ed6\u52a0\u8f7d\u5230\u54ea\u91cc\u4e86\uff0c\u4ece\u800c\u6307\u5bfc\u540e\u9762\u7684sepc\u7684\u8bbe\u7f6e\uff0c\u5e76\u4e14\u8fd9\u4e2a\u4fe1\u606f\u6700\u597d\u4fdd\u5b58\u5728HartContext\u7684app_info\u91cc\u9762\uff0c\u65b9\u4fbf\u4e4b\u540e\u6bd4\u5982\u8bf4check_buf_valid\u5728sys_write\u91cc\u9762\u7684\u68c0\u67e5\uff0c\u7136\u540e\u8fd9\u4e2a\u4e5f\u80fd\u89e3\u51b3\u4e86\uff0c\u4f46\u662f\u5728\u8fd0\u884c\u65f6\u53d1\u73b0\uff0c\u5728\u6253\u5370\u7684\u65f6\u5019\u89e6\u53d1\u4e86inst page fault\uff0chello world\u7a0b\u5e8f\uff1a<\/p>\n<pre><code>[kernel] WARN [ 0] - Instruction PageFault in application, kernel killed it.\n[kernel] WARN [ 0] - Illegal addr: 0x27c\n[kernel] WARN [ 0] - excption pc: 0x27c<\/code><\/pre>\n<p>\u611f\u89c9\u8fd8\u662f\u6709\u70b9\u95ee\u9898\uff0c\u7a0d\u5fae\u6709\u70b9\u8d70\u6295\u65e0\u8def\uff0c\u95ee\u4e86ai\uff0c\u8bf4\u56e0\u4e3a\u5728\u94fe\u63a5\u65f6\u6ca1\u6709\u52a0-pie\uff08\u4f46\u662f\u6587\u6863\u4e0a\u8bf4\u662f\u4f1a\u81ea\u52a8\u52a0\u7684\uff0c<strong>\u53ea\u662f<\/strong>\u5982\u679c\u4ed6\u4e0d\u652f\u6301\uff0c\u4f1a\u81ea\u52a8\u9000\u56de\uff0c\u6240\u4ee5\u5c31\u5f88\u6076\u5fc3\uff0c\u56e0\u4e3a\u4ed6\u786e\u5b9e\u4e0d\u652f\u6301\uff09\uff0c\u7136\u540e\u62a5\u9519\uff0c\u8bf4<\/p>\n<pre><code>error: linking with `rust-lld` failed: exit status: 1\n  |\n  = note:  \"rust-lld\" \"-flavor\" \"gnu\" \"\/tmp\/rustcNc8TmL\/symbols.o\" \"&lt;1 object files omitted&gt;\" \"--as-needed\" \"-Bstatic\" \"\/home\/yzs\/rcore\/PianoOS\/target\/riscv64gc-unknown-none-elf\/release\/deps\/libuser_lib-74f3c3f6da611ea3.rlib\" \"&lt;sysroot&gt;\/lib\/rustlib\/riscv64gc-unknown-none-elf\/lib\/{libcore-*,libcompiler_builtins-*}.rlib\" \"-L\" \"\/tmp\/rustcNc8TmL\/raw-dylibs\" \"-Bdynamic\" \"-z\" \"noexecstack\" \"-L\" \"\/home\/yzs\/rcore\/PianoOS\/target\/riscv64gc-unknown-none-elf\/release\/build\/user_lib-3a44cde3a76a61ed\/out\" \"-o\" \"\/home\/yzs\/rcore\/PianoOS\/target\/riscv64gc-unknown-none-elf\/release\/deps\/01store_fault-af76e34c012f3a3e\" \"--gc-sections\" \"-O1\" \"--strip-debug\" \"-T\/home\/yzs\/rcore\/PianoOS\/target\/riscv64gc-unknown-none-elf\/release\/build\/user_lib-3a44cde3a76a61ed\/out\/linker.ld\" \"-Map=\/tmp\/UserMap.map\" \"-pie\"\n  = note: some arguments are omitted. use `--verbose` to show all linker arguments\n  = note: rust-lld: error: relocation R_RISCV_64 cannot be used against symbol '.Lanon.505f3601e2136fe1a7296e3022027dc7.52'; recompile with -fPIC\n          &gt;&gt;&gt; defined in \/home\/yzs\/.rustup\/toolchains\/nightly-x86_64-unknown-linux-gnu\/lib\/rustlib\/riscv64gc-unknown-none-elf\/lib\/libcore-7bcf3123a0e9c15d.rlib(core-7bcf3123a0e9c15d.core.2ad1de27dc69bd30-cgu.0.rcgu.o)\n          &gt;&gt;&gt; referenced by core.2ad1de27dc69bd30-cgu.0\n          &gt;&gt;&gt;               core-7bcf3123a0e9c15d.core.2ad1de27dc69bd30-cgu.0.rcgu.o:(.Lanon.505f3601e2136fe1a7296e3022027dc7.295) in archive \/home\/yzs\/.rustup\/toolchains\/nightly-x86_64-unknown-linux-gnu\/lib\/rustlib\/riscv64gc-unknown-none-elf\/lib\/libcore-7bcf3123a0e9c15d.rlib<\/code><\/pre>\n<p>\u8c8c\u4f3c\u5177\u4f53\u662f\uff0c\u8fd9\u4e9blibcore\u8fd9\u4e9b\u9884\u7f16\u8bd1\u597d\u7684crate\u6ca1\u6709\u7528pic\u7f16\u8bd1\uff0c\u6240\u4ee5\u9700\u8981\u624b\u52a8\u91cd\u7f16\u8fd9\u4e9bcrate\uff0c\u53ef\u53c2\u8003\uff1a<a href=\"https:\/\/doc.rust-lang.org\/cargo\/reference\/unstable.html#build-std\">https:\/\/doc.rust-lang.org\/cargo\/reference\/unstable.html#build-std<\/a><\/p>\n<p>\u7136\u540e\u6211\u53d1\u73b0\u5176\u5b9erustsbi\u4e5f\u7528\u4e86\u8fd9\u4e2abuild-std\uff0c\u4f46\u662f\u4ed6\u4eec\u7528\u4e86\u4e00\u4e2a\u53eb\u505axtask\u7684\u4e1c\u897f\uff0c\u8fd9\u4e2a\u4e1c\u897f\u8c8c\u4f3c\u53ea\u662f\u4e00\u4e2a\u666e\u901a\u7684crate\uff0c\u53ea\u662f\u4ed6\u4f1a\u5e2e\u5fd9\u6784\u5efa\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff08\u5176\u5b9e\u611f\u89c9\u672c\u8d28\u4e0a\u5c31\u662f\u4e00\u4e2a\u5e2e\u52a9\u8c03\u7528cargo\u7684\u4e1c\u897f\uff0c\u56e0\u4e3a\u4ed6\u672c\u8d28\u5c31\u662f\u8c03\u7528\u4e86\u4e00\u4e2asub process\uff0c\u8fd9\u4e2aprocess\u5c31\u662f\u4e00\u4e2acargo\u7a0b\u5e8f\uff0c\u53ea\u662f\u4f60\u80fd\u5728\u8fd9\u4e2a\u7a0b\u5e8f\u4e2d\u9884\u5b9a\u4e49\u5f88\u591acargo\u9009\u9879\uff09\uff0c\u8fd9\u4e2a\u5176\u5b9e\u672c\u8d28\u4e0a\u548ccargo\u7684\u90a3\u4e2aconfig.toml\u662f\u4e00\u6837\u7684<\/p>\n<h2>xtask<\/h2>\n<p>\u5728rustsbi\u4e2d\u4f7f\u7528<code>cargo prototyper --jump<\/code>\u5c31\u53ef\u4ee5\u8fdb\u884c\u7f16\u8bd1\uff0c\u6700\u4e3b\u8981\u7684\u662f\u4ed6\u4eec\u7684config.toml\u5b58\u5728<\/p>\n<pre><code>[alias]\nxtask = \"run --package xtask --release --\"\nprototyper = \"xtask prototyper\"\ntest-kernel = \"xtask test\"\nbench-kernel = \"xtask bench\"<\/code><\/pre>\n<p>\u7136\u540e\u6700\u4e3b\u8981\u7684\u5c31\u662f\u8fd9\u4e2axtask\u7a0b\u5e8f\u662f\u600e\u4e48\u5199\u7684\uff0c\u7136\u540e\u6211\u6253\u7b97\u76f4\u63a5\u628a\u4ed6\u4eec\u7684\u79fb\u690d\u8fc7\u6765\uff0cxtask\u4e0d\u5e94\u8be5\u4f7f\u7528riscv\u7684target\uff0c\u4f46\u662f\u6211\u5b9e\u5728\u6ca1\u627e\u5230\u600e\u4e48\u914d\u7f6e\u8fd9\u79cd\u6709\u591a\u4e2apackage\u4f46\u662f\u4ed6\u4eec\u5404\u81ea\u7684target\u4e0d\u540c\u7684\uff0c\u53ea\u80fd\u6bcf\u6b21\u8dd1\u54ea\u4e2a\u7684\u65f6\u5019\u6539target\uff0c\u54ce<\/p>\n<p>\u7136\u540eclap\u8fd9\u4e2acrate\u786e\u5b9e\u6709\u70b9\u6076\u5fc3\uff0c\u53ef\u4ee5\u770b\u4ed6\u5b98\u65b9\u7684\u4e00\u4e9b\u4f8b\u5b50\u5b66\u4e60\uff1a<a href=\"https:\/\/docs.rs\/clap\/latest\/clap\/_derive\/_tutorial\/index.html\">https:\/\/docs.rs\/clap\/latest\/clap\/_derive\/_tutorial\/index.html<\/a><\/p>\n<p>\u5199\u7740\u5199\u7740\u53d1\u73b0\u6709\u70b9\u7406\u4e0d\u6e05\u4e86\uff0c\u6240\u4ee5\u660e\u786e\u4e00\u4e0b\uff0cxtask\u4ec5\u4ec5\u53ea\u662fcargo\u7684\u8c03\u7528\uff0c\u4f46\u662f\u771f\u7684\u7f16\u8bd1\u8fc7\u7a0b\u8fd8\u662f\u7531build.rs\u63a7\u5236\u7684\uff0c\u6240\u4ee5\u8bf4\u5c06user program\u94fe\u63a5\u8fdb\u6765\u7684\u8fd9\u4e2a\u64cd\u4f5c\u8fd8\u662f\u7531build.rs\u6765\u63a7\u5236\u7684\uff0c\u7136\u540e\u91cc\u9762\u6700\u91cd\u8981\u7684\u4e00\u6bb5\u53c2\u6570\u662f<\/p>\n<pre><code class=\"language-rust\">    let rustflags = \n        \"-C relocation-model=pie -C link-arg=-pie -C force-frame-pointers=yes\";\n\n    let status = cargo::Cargo::new(\"build\")\n        .package(USER_PACKAGE_NAME)\n        .target(arch)\n        .unstable(\"build-std\", [\"core\", \"alloc\"])<\/code><\/pre>\n<p>\u5373\u91cd\u65b0\u7f16\u8bd1core\uff0c\u4f7f\u7528rustflags\u7684\u53c2\u6570<\/p>\n<p>\u4e4b\u540e\u6253\u7b97\u7528xtask\u6765\u4e00\u952e\u8fd0\u884cqemu\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u629b\u5f03Makefile\u4e86hhh<\/p>\n<h2>\u91cd\u5b9a\u4f4d<\/h2>\n<p>\u7136\u540e\u91cd\u65b0\u7f16\u8bd1\u4e4b\u540e\u6211\u53d1\u73b0\u6bcf\u4e2a\u7a0b\u5e8f\u90fd\u4f1a\u89e6\u53d10\u5730\u5740\u8bbf\u95ee\u9519\u8bef\uff0c\u8c8c\u4f3c\u662f\u56e0\u4e3a\uff0c\u7528\u6237\u7a0b\u5e8f\u88ab\u8fd9\u6837\u7f16\u8bd1\u4e4b\u540e\uff0c\u4f1a\u53d8\u6210dyn elf\uff0c\u6b64\u65f6\u9700\u8981\u5728\u8fd0\u884c\u65f6\u91cd\u5b9a\u4f4d\u4e00\u4e9b\u4e1c\u897f\uff0crustsbi\u4e2d\u76f8\u5e94\u7684\u4ee3\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"language-rust\">\/\/ Handle relocations for position-independent code\n#[unsafe(naked)]\nunsafe extern \"C\" fn relocation_update() {\n    naked_asm!(\n        \/\/ Get load offset.\n        \"   li t0, {START_ADDRESS}\",\n        \"   lla t1, sbi_start\",\n        \"   sub t2, t1, t0\",\n\n        \/\/ Foreach rela.dyn and update relocation.\n        \"   lla t0, __rel_dyn_start\",\n        \"   lla t1, __rel_dyn_end\",\n        \"   li  t3, {R_RISCV_RELATIVE}\",\n        \"1:\",\n        \"   ld  t4, 8(t0)\",\n        \"   bne t4, t3, 2f\",\n        \"   ld t4, 0(t0)\", \/\/ Get offset\n        \"   ld t5, 16(t0)\", \/\/ Get append\n        \"   add t4, t4, t2\", \/\/ Add load offset to offset add append\n        \"   add t5, t5, t2\",\n        \"   sd t5, 0(t4)\", \/\/ Update address\n        \"   addi t0, t0, 24\", \/\/ Get next rela item\n        \"2:\",\n        \"   blt t0, t1, 1b\",\n        \"   fence.i\",\n\n        \/\/ Return\n        \"   ret\",\n        R_RISCV_RELATIVE = const R_RISCV_RELATIVE,\n        START_ADDRESS = const cfg::SBI_LINK_START_ADDRESS,\n    )\n}<\/code><\/pre>\n<p>\u7136\u540e\u5bf9\u7167\u4e00\u4e0b\u6211\u7684\u67d0\u4e2a.rela.dyn\uff1a<\/p>\n<pre><code>Relocation section '.rela.dyn' at offset 0x1de8 contains 16 entries:\n  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n000000001198  000000000003 R_RISCV_RELATIVE                     334\n0000000011a0  000000000003 R_RISCV_RELATIVE                     12b0\n0000000011a8  000000000003 R_RISCV_RELATIVE                     12b0\n0000000011b0  000000000003 R_RISCV_RELATIVE                     f68\n0000000011c0  000000000003 R_RISCV_RELATIVE                     f76\n0000000011d0  000000000003 R_RISCV_RELATIVE                     f82\n0000000011e0  000000000003 R_RISCV_RELATIVE                     f83\n0000000011f0  000000000003 R_RISCV_RELATIVE                     f85\n000000001218  000000000003 R_RISCV_RELATIVE                     27c\n000000001220  000000000003 R_RISCV_RELATIVE                     19a\n000000001228  000000000003 R_RISCV_RELATIVE                     238\n000000001248  000000000003 R_RISCV_RELATIVE                     258\n000000001250  000000000003 R_RISCV_RELATIVE                     fc6\n000000001268  000000000003 R_RISCV_RELATIVE                     fda\n000000001278  000000000003 R_RISCV_RELATIVE                     fb6\n0000000012a0  000000000003 R_RISCV_RELATIVE                     ff5<\/code><\/pre>\n<p>\u5e94\u8be5\u610f\u601d\u5c31\u662f\u628a\u7c7b\u4f3c\u7b2c\u4e00\u6761\uff1aload base addr + 1198 = load base addr + 334<\/p>\n<p>\u4f46\u662fkernel\u52a0\u8f7d\u7684\u65f6\u5019\u4f1a\u51fa\u73b0\u4f60\u4e0d\u77e5\u9053\u6bcf\u4e2a\u7528\u6237\u7a0b\u5e8f\u7684.rela.dyn\u5728\u54ea\u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u4ed6\u4eec\u5df2\u7ecf\u662fbin\u6587\u4ef6\u94fe\u63a5\u8fdb\u6765\u7684\u4e86\uff0c\u6240\u4ee5\u5176\u5b9e\u6700\u597d\u7684\u65b9\u5f0f\u662f\u8ba9kernel\u80fd\u52a0\u8f7delf\u6587\u4ef6\uff0c\u554a\u6211\u8ba8\u538c\u89e3\u6790elf\u6587\u4ef6<\/p>\n<h2>elf\u6587\u4ef6\u7684\u89e3\u6790<\/h2>\n<p>\u5176\u5b9e\u9996\u5148\u53ef\u4ee5\u628a\u4e4b\u524d\u7684app_start_addr\u8fdb\u884c\u5c01\u88c5\uff0c\u5373\u5c01\u88c5\u6bcf\u4e00\u4e2aapp\u81ea\u5df1\u7684\u6570\u636e\uff0c\u7136\u540e\u53ef\u4ee5\u7528rust\u7684elf crate\u505a\u89e3\u6790<\/p>\n<p>\u7136\u540e\u5fd8\u8bb0\u600e\u4e48load\u4e86\uff0c\u4e0d\u8fc7\u6211\u8bb0\u5f97\u4ee5\u524dpa\u7684\u8bb2\u4e49\u91cc\u5e94\u8be5\u6709\u5199\u7684\uff0c\u53ef\u4ee5\u53c2\u8003\uff1a[pa][<a href=\"https:\/\/ysyx.oscc.cc\/docs\/ics-pa\/3.3.html#\u52a0\u8f7d\u7b2c\u4e00\u4e2a\u7528\u6237\u7a0b\u5e8f]\uff0c\u6700\u4e3b\u8981\u7684\u662f\u7406\u89e3\u8fd9\u4e00\u53e5\">https:\/\/ysyx.oscc.cc\/docs\/ics-pa\/3.3.html#\u52a0\u8f7d\u7b2c\u4e00\u4e2a\u7528\u6237\u7a0b\u5e8f]\uff0c\u6700\u4e3b\u8981\u7684\u662f\u7406\u89e3\u8fd9\u4e00\u53e5<\/a>\uff1a<\/p>\n<blockquote><p>ELF\u6587\u4ef6\u63d0\u4f9b\u4e86\u4e24\u4e2a\u89c6\u89d2\u6765\u7ec4\u7ec7\u4e00\u4e2a\u53ef\u6267\u884c\u6587\u4ef6, \u4e00\u4e2a\u662f\u9762\u5411\u94fe\u63a5\u8fc7\u7a0b\u7684section\u89c6\u89d2, \u8fd9\u4e2a\u89c6\u89d2\u63d0\u4f9b\u4e86\u7528\u4e8e\u94fe\u63a5\u4e0e\u91cd\u5b9a\u4f4d\u7684\u4fe1\u606f(\u4f8b\u5982\u7b26\u53f7\u8868); \u53e6\u4e00\u4e2a\u662f\u9762\u5411\u6267\u884c\u7684segment\u89c6\u89d2, \u8fd9\u4e2a\u89c6\u89d2\u63d0\u4f9b\u4e86\u7528\u4e8e\u52a0\u8f7d\u53ef\u6267\u884c\u6587\u4ef6\u7684\u4fe1\u606f.<\/p><\/blockquote>\n<p>\u7136\u540e\u52a0\u8f7d\u4e4b\u540e\u5c31\u662f\u91cd\u5b9a\u5411\uff0c\u91cd\u5b9a\u5411\u9700\u8981\u628aaddr\u672c\u8eab\u5199\u8fdb\u9700\u8981\u5199\u5165\u7684\u5730\u5740\uff0c\u4ee3\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"language-rust\">        let rela_dyn_header = file.section_header_by_name(\".rela.dyn\")\n            .expect(\"section table should be parseable\")\n            .expect(\"should have .rela.dyn unless this elf file is not pie\");\n        let rela_dyn = file.section_data_as_relas(&amp;rela_dyn_header)\n            .expect(\"section data not found\")\n            .filter(|e| e.r_type == R_RISCV_RELATIVE);\n        for entry in rela_dyn {\n            unsafe {\n                let offset = dst_start.byte_add(entry.r_offset as usize) as *mut usize;\n                let append = dst_start.byte_add(entry.r_addend as usize) as usize;\n                *offset = append;\n                ARCH.fencei();\n            }\n\n        }<\/code><\/pre>\n<p>\u7ec8\u4e8e\u6210\u529f\u4e86<\/p>\n<h2>\u591a\u6838\u6267\u884c<\/h2>\n<p>\u7136\u540e\u5c31\u662f\u8ba9\u9664\u4e86boot hart\u7684\u5176\u4ed6harts\u4e5f\u5f00\u59cbload app\u5e76\u5f00\u59cb\u6267\u884c\uff0c\u73b0\u5728\u4ed6\u4eec\u5728\u542f\u52a8\u4e4b\u540e\u4f1a\u8fdb\u5165hart_main\uff0c\u7136\u540e\u8fdb\u5165\u6b7b\u5faa\u73af\uff0c\u7136\u540e\u628a\u4ed6\u4eec\u7684\u6b7b\u5faa\u73af\u6539\u6210\u52a0\u8f7d\u7a0b\u5e8f\uff0c\u56e0\u4e3acur_app\u6709\u9501\uff0c\u6240\u4ee5\u4e0d\u7528\u62c5\u5fc3\u7ade\u4e89\u7684\u60c5\u51b5<\/p>\n<p>\u5199\u51fa\u6765\u4e86\uff0c\u8fd0\u884c\u540e\u6709\u4e24\u4e2a\u95ee\u9898\uff0c1.\u6253\u5370\u7684\u4e1c\u897f\u6bd4\u8f83\u91cd\u5408\uff0c\u867d\u7136kernel\u6253\u5370\u7684\u65f6\u5019\u4f1a\u6807\u8bb0\u51fa\u81ea\u5df1\u7684hart number\uff0c\u4f46\u662f\u8fd8\u662f\u6709\u70b9\u4e71\uff0c\u4f46\u662f\u4f30\u8ba1\u662f\u5f88\u96be\u89e3\u51b3\u30022.\u5728\u6709\u7684hart\u8fd8\u6ca1\u6267\u884c\u5b8c\u7684\u65f6\u5019\uff0c\u67d0\u4e2ahart\u5df2\u7ecf\u5230\u4e86\u6700\u540e\u4e86\uff0c\u6240\u4ee5\u4ed6\u5c31\u628a\u6574\u4e2ashutdown\u4e86<\/p>\n<p>\u7b2c\u4e8c\u4e2a\u95ee\u9898\u4f7f\u7528\u4e00\u4e2abitmap\u6765\u6307\u793a\u662f\u5426\u5b8c\u6210\uff0c\u4f7f\u7528<code>AtomicBool<\/code>\u7684array\u5373\u53ef\uff0c\u5728\u6bcf\u4e2ahart\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u628a\u4ed6hart local\u8bb0\u5f55\u7684app id\u8bbe\u7f6e\u4e3a\u5df2\u5b8c\u6210\u5373\u53ef\uff0c\u6700\u540e\u9000\u51fa\u7684\u65f6\u5019\u9700\u8981\u68c0\u6d4b\u662f\u5426\u6240\u6709\u7a0b\u5e8f\u90fd\u5df2\u5b8c\u6210<\/p>\n<h2>\u6700\u7ec8\u8f93\u51fa<\/h2>\n<pre><code>[PianoOS-xtask] INFO  - Boot QEMU: \"qemu-system-riscv64\" \"-machine\" \"virt\" \"-smp\" \"8\" \"-bios\" \".\/bootloader\/rustsbi-qemu.bin\" \"-device\" \"loader,file=\/home\/yzs\/rcore\/PianoOS\/target\/riscv64gc-unknown-none-elf\/release\/PianoOS.bin,addr=0x80200000\" \"-nographic\"\n[RustSBI] INFO  - Hello RustSBI!\n[RustSBI] INFO  - RustSBI version 0.4.0\n[RustSBI] INFO  - .______       __    __      _______.___________.  _______..______   __\n[RustSBI] INFO  - |   _       |  |  |  |    \/       |           | \/       ||   _   |  |\n[RustSBI] INFO  - |  |_)  |    |  |  |  |   |   (----`---|  |----`|   (----`|  |_)  ||  |\n[RustSBI] INFO  - |      \/     |  |  |  |              |  |             |   _  &lt; |  |\n[RustSBI] INFO  - |  |  ----.|  `--'  |.----)   |      |  |  .----)   |   |  |_)  ||  |\n[RustSBI] INFO  - | _| `._____| ______\/ |_______\/       |__|  |_______\/    |______\/ |__|\n[RustSBI] INFO  - Initializing RustSBI machine-mode environment.\n[RustSBI] INFO  - Platform Name                 : riscv-virtio,qemu\n[RustSBI] INFO  - Platform HART Count           : 8\n[RustSBI] INFO  - Enabled HARTs                 : [0, 1, 2, 3, 4, 5, 6, 7]\n[RustSBI] INFO  - Platform IPI Extension        : SiFiveClint (Base Address: 0x2000000)\n[RustSBI] INFO  - Platform Console Extension    : Uart16550U8 (Base Address: 0x10000000)\n[RustSBI] INFO  - Platform Reset Extension      : Available (Base Address: 0x100000)\n[RustSBI] INFO  - Platform HSM Extension        : Available\n[RustSBI] INFO  - Platform RFence Extension     : Available\n[RustSBI] INFO  - Platform SUSP Extension       : Available\n[RustSBI] INFO  - Platform PMU Extension        : Available\n[RustSBI] INFO  - Memory range                  : 0x80000000 - 0x88000000\n[RustSBI] INFO  - Platform Status               : Platform initialization complete and ready.\n[RustSBI] INFO  - The patched dtb is located at 0x80054000 with length 0x3208.\n[RustSBI] INFO  - PMP Configuration\n[RustSBI] INFO  - PMP        Range      Permission      Address                       \n[RustSBI] INFO  - PMP 0:     OFF        NONE            0x00000000\n[RustSBI] INFO  - PMP 1-2:   TOR        RWX\/RWX         0x80000000 - 0x80000000\n[RustSBI] INFO  - PMP 3-5:   TOR        NONE\/NONE       0x80021000 - 0x8002e000 - 0x80069000\n[RustSBI] INFO  - PMP 6:     TOR        RWX             0x88000000\n[RustSBI] INFO  - PMP 7:     TOR        RWX             0xffffffffffffffff\n[RustSBI] INFO  - Boot HART ID                  : 5\n[RustSBI] INFO  - Boot HART Privileged Version: : Version1_12\n[RustSBI] INFO  - Boot HART MHPM Mask:          : 0x07ffff\n[RustSBI] INFO  - Redirecting hart 5 to 0x00000080200000 in Supervisor mode.\n[kernel] INFO [ 5] - Logging system init success\n[kernel] INFO [ 5] - boot hartid: 5\n[kernel] INFO [ 5] - device tree addr: 0x80054000\n[kernel] INFO [ 5] - cpu number: 8\n[kernel] INFO [ 5] - uart type is Uart16550U8, base addr is 0x10000000\n[kernel] INFO [ 5] - kernel memory map:\n[kernel] INFO [ 5] - kernel base = 0x80200000\n[kernel] INFO [ 5] - .text      : [0x80200000, 0x80214000]\n[kernel] INFO [ 5] - .rodata    : [0x80214000, 0x80218000]\n[kernel] INFO [ 5] - .data      : [0x80218000, 0x80244000]\n[kernel] INFO [ 5] - .bss.kstack: [0x80244000, 0x80264000]\n[kernel] INFO [ 5] - .bss.ustack: [0x80264000, 0x8026c000]\n[kernel] INFO [ 5] - .bss.heap  : [0x8026c000, 0x80274000]\n[kernel] INFO [ 5] - .bss       : [0x80274000, 0x80275000]\n[kernel] INFO [ 5] - kernel end = 0x80275000\n[kernel] INFO [ 5] - Kernel app number: 8\n[kernel] INFO [ 5] - app 0: [0x80219828, 0x8021e288]\n[kernel] INFO [ 5] - app 1: [0x8021e288, 0x80222e78]\n[kernel] INFO [ 5] - app 2: [0x80222e78, 0x80228118]\n[kernel] INFO [ 5] - app 3: [0x80228118, 0x8022ccf0]\n[kernel] INFO [ 5] - app 4: [0x8022ccf0, 0x802318c8]\n[kernel] INFO [ 5] - app 5: [0x802318c8, 0x80236680]\n[kernel] INFO [ 5] - app 6: [0x80236680, 0x8023cdc0]\n[kernel] INFO [ 5] - app 7: [0x8023cdc0, 0x802434c0]\nHello, world!\nInto Test store_fault, we will insert an invalid store operation...\nTry to access privileged CSR in U Mode\n[kernel] WARN [ 4][ 6] - buf out of scope\nstring from data section\nKernel should kill this application!\n[kernel] WARN [ 4][ 6] - buf addr: 0x0\n[kernel] TRACE[ 5][ 0] - ==== App(0) statistics ====\n3[kernel] WARN [ 4][ 6] - buf size: 0xa\nstrin[kernel] TRACE[ 5][ 0] - Start addr: 0x80400000\ntask id ^[kernel] TRACE[ 5][ 0] - End addr  : 0x804012b0\n[kernel] TRACE[ 3][ 4] - ==== App(4) statistics ====\nstring from stack section\n5[kernel] TRACE[ 5][ 0] - Start time: 30578400ns\nKernel should kill this application!\n[kernel] TRACE[ 5][ 0] - End time  : 31172900ns\nstrin\n[kernel] TRACE[ 3][ 4] - Start addr: 0x804134c8\n10000[kernel] TRACE[ 0][ 1] - ==== App(1) statistics ====\n[kernel] TRACE[ 1][ 5] - ==== App(5) statistics ====\n[kernel] TRACE[ 3][ 4] - End addr  : 0x80414818\n[kernel] WARN [ 4][ 6] - ustack start: 0x80268000\n[kernel] TRACE[ 3][ 4] - Start time: 30731300ns\n[kernel] TRACE[ 1][ 5] - Start addr: 0x804180a0\n\nTest write1 OK!\n[kernel] WARN [ 4][ 6] - ustack end  : 0x80269000\n[kernel] TRACE[ 0][ 1] - Start addr: 0x80404a60\n[kernel] TRACE[ 1][ 5] - End addr  : 0x80419510\n=[kernel] TRACE[ 2][ 7] - ==== App(7) statistics ====\n[kernel] TRACE[ 0][ 1] - End addr  : 0x80405dc8\n[kernel] TRACE[ 5][ 0] - Total time: 594500ns\n[kernel] TRACE[ 3][ 4] - End time  : 31830700ns\n[kernel] TRACE[ 5][ 0] - Syscall statistics --\n[kernel] TRACE[ 0][ 1] - Start time: 30655200ns\nTry to execute privileged instruction in U Mode\n[kernel] TRACE[ 1][ 5] - Start time: 30754600ns\n[kernel] TRACE[ 2][ 7] - Start addr: 0x80423598\n[kernel] TRACE[ 0][ 1] - End time  : 32548900ns\nKernel should kill this application!\n[kernel] TRACE[ 5][ 0] - Write: 1\n5079[kernel] TRACE[ 3][ 4] - Total time: 1099400ns\n[kernel] TRACE[ 6][ 3] - ==== App(3) statistics ====\n[kernel] TRACE[ 2][ 7] - End addr  : 0x804252c0\n[kernel] TRACE[ 0][ 1] - Total time: 1893700ns\n(MOD [kernel] TRACE[ 3][ 4] - Syscall statistics --\n10007[kernel] TRACE[ 1][ 5] - End time  : 32658500ns\n[kernel] TRACE[ 0][ 1] - Syscall statistics --\n[kernel] TRACE[ 2][ 7] - Start time: 30816000ns\n[kernel] TRACE[ 0][ 1] - Write: 2\n[kernel] TRACE[ 2][ 7] - End time  : 33935600ns\n[kernel] TRACE[ 5][ 0] - Exit: 1\n[kernel] TRACE[ 2][ 7] - Total time: 3119600ns\n[kernel] TRACE[ 5][ 0] - GetTaskID: 0\n[kernel] TRACE[ 6][ 3] - Start addr: 0x8040e8f0\n[kernel] TRACE[ 2][ 7] - Syscall statistics --\n)\n[kernel] TRACE[ 3][ 4] - Write: 2\n[kernel] TRACE[ 0][ 1] - Exit: 0\n[kernel] TRACE[ 2][ 7] - Write: 6\n[kernel] TRACE[ 1][ 5] - Total time: 1903900ns\n[kernel] TRACE[ 5][ 0] - == App(0) statistics end ==\n[kernel] TRACE[ 2][ 7] - Exit: 1\n[kernel] TRACE[ 3][ 4] - Exit: 0\n3[kernel] TRACE[ 1][ 5] - Syscall statistics --\n[kernel] TRACE[ 2][ 7] - GetTaskID: 0\n[kernel] INFO [ 5][ 0] - Application exited with code 0\n[kernel] TRACE[ 2][ 7] - == App(7) statistics end ==\n[kernel] TRACE[ 1][ 5] - Write: 3\n^[kernel] INFO [ 2][ 7] - Application exited with code 0\n[kernel] TRACE[ 0][ 1] - GetTaskID: 0\n20000[kernel] TRACE[ 6][ 3] - End addr  : 0x8040fc40\n[kernel] TRACE[ 3][ 4] - GetTaskID: 0\n[kernel] TRACE[ 0][ 1] - == App(1) statistics end ==\n[kernel] WARN [ 4][ 6] - app size: 0x6740\n[kernel] TRACE[ 6][ 3] - Start time: 30701500ns\n=[kernel] TRACE[ 3][ 4] - == App(4) statistics end ==\n8202[kernel] TRACE[ 1][ 5] - Exit: 1\n[kernel] TRACE[ 6][ 3] - End time  : 35626100ns\n[kernel] WARN [ 3][ 4] - IllegalInstruction in application, kernel killed it.\ntop 0x[kernel] WARN [ 0][ 1] - PageFault in application, kernel killed it.\n(MOD [kernel] TRACE[ 6][ 3] - Total time: 4924600ns\n[kernel] WARN [ 3][ 4] - excption pc: 0x804135a0\n80269000[kernel] TRACE[ 6][ 3] - Syscall statistics --\n10007[kernel] WARN [ 0][ 1] - Illegal addr: 0x0\n)\n, bottom 0x[kernel] TRACE[ 6][ 3] - Write: 2\n[kernel] TRACE[ 1][ 5] - GetTaskID: 1\n[kernel] TRACE[ 6][ 3] - Exit: 0\n3[kernel] TRACE[ 1][ 5] - == App(5) statistics end ==\n[kernel] TRACE[ 6][ 3] - GetTaskID: 0\n80268000[kernel] WARN [ 0][ 1] - excption pc: 0x80404b34\n^\n[kernel] TRACE[ 6][ 3] - == App(3) statistics end ==\n30000[kernel] WARN [ 4][ 6] - buf out of scope\n=[kernel] WARN [ 6][ 3] - IllegalInstruction in application, kernel killed it.\n8824[kernel] WARN [ 4][ 6] - buf addr: 0x80268ffb\n(MOD [kernel] INFO [ 1][ 5] - Application exited with code 0\n10007[kernel] WARN [ 4][ 6] - buf size: 0xa\n)\n[kernel] WARN [ 6][ 3] - excption pc: 0x8040e9c4\n[kernel] WARN [ 4][ 6] - ustack start: 0x80268000\n3^40000[kernel] WARN [ 4][ 6] - ustack end  : 0x80269000\n=5750[kernel] WARN [ 4][ 6] - app size: 0x6740\n(MOD 10007)\n[kernel] WARN [ 4][ 6] - buf out of scope\n3^50000[kernel] WARN [ 4][ 6] - buf addr: 0x80267ffb\n=3824[kernel] WARN [ 4][ 6] - buf size: 0xa\n(MOD [kernel] WARN [ 4][ 6] - ustack start: 0x80268000\n10007)\n[kernel] WARN [ 4][ 6] - ustack end  : 0x80269000\n3^[kernel] WARN [ 4][ 6] - app size: 0x6740\n60000=8516(MOD 10007)\nTest write0 OK!\n3^70000=2510(MOD [kernel] TRACE[ 4][ 6] - ==== App(6) statistics ====\n10007[kernel] TRACE[ 4][ 6] - Start addr: 0x8041ce58\n)\n[kernel] TRACE[ 4][ 6] - End addr  : 0x8041ebb0\n3^80000[kernel] TRACE[ 4][ 6] - Start time: 30783200ns\n=9379[kernel] TRACE[ 4][ 6] - End time  : 44848900ns\n(MOD 10007[kernel] TRACE[ 4][ 6] - Total time: 14065700ns\n)\n[kernel] TRACE[ 4][ 6] - Syscall statistics --\n3^90000[kernel] TRACE[ 4][ 6] - Write: 9\n=2621[kernel] TRACE[ 4][ 6] - Exit: 1\n(MOD [kernel] TRACE[ 4][ 6] - GetTaskID: 0\n10007[kernel] TRACE[ 4][ 6] - == App(6) statistics end ==\n)\n[kernel] INFO [ 4][ 6] - Application exited with code 0\n3^100000=2749(MOD 10007)\nTest power OK!\n[kernel] TRACE[ 7][ 2] - ==== App(2) statistics ====\n[kernel] TRACE[ 7][ 2] - Start addr: 0x80409650\n[kernel] TRACE[ 7][ 2] - End addr  : 0x8040ad10\n[kernel] TRACE[ 7][ 2] - Start time: 30679600ns\n[kernel] TRACE[ 7][ 2] - End time  : 46960800ns\n[kernel] TRACE[ 7][ 2] - Total time: 16281200ns\n[kernel] TRACE[ 7][ 2] - Syscall statistics --\n[kernel] TRACE[ 7][ 2] - Write: 81\n[kernel] TRACE[ 7][ 2] - Exit: 1\n[kernel] TRACE[ 7][ 2] - GetTaskID: 0\n[kernel] TRACE[ 7][ 2] - == App(2) statistics end ==\n[kernel] INFO [ 7][ 2] - Application exited with code 0\n[kernel] INFO [ 5][ 0] - All applications completed! Kennel shutdown<\/code><\/pre>\n<p>\u591a\u6838\u7684\u8bdd\u8f93\u51fa\u90fd\u662f\u4e71\u7684\uff0c\u6211\u4e5f\u4e0d\u77e5\u9053\u548b\u529e<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1.\u7279\u6743\u7ea7\u673a\u5236 \u8fd9\u4e2a\u5176\u5b9e\u6211\u8fd8\u662f\u5f88\u4e86\u89e3\uff0c\u6bd5\u7adf\u5199\u8fc7\u5904\u7406\u5668 \u4f46\u662f\u770b&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56,11],"tags":[],"class_list":["post-5291","post","type-post","status-publish","format-standard","hentry","category-rcore","category-cs"],"_links":{"self":[{"href":"https:\/\/www.yizishun.com\/index.php?rest_route=\/wp\/v2\/posts\/5291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yizishun.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yizishun.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yizishun.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yizishun.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5291"}],"version-history":[{"count":4,"href":"https:\/\/www.yizishun.com\/index.php?rest_route=\/wp\/v2\/posts\/5291\/revisions"}],"predecessor-version":[{"id":5297,"href":"https:\/\/www.yizishun.com\/index.php?rest_route=\/wp\/v2\/posts\/5291\/revisions\/5297"}],"wp:attachment":[{"href":"https:\/\/www.yizishun.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yizishun.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yizishun.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}