{"id":1137,"date":"2024-11-17T17:00:40","date_gmt":"2024-11-17T08:00:40","guid":{"rendered":"https:\/\/www.yanagichiaki.jp\/?p=1137"},"modified":"2024-12-24T16:41:49","modified_gmt":"2024-12-24T07:41:49","slug":"xv6-oslab24-hitsz-answers","status":"publish","type":"post","link":"https:\/\/yanagichiaki.jp\/index.php\/2024\/11\/17\/xv6-oslab24-hitsz-answers\/","title":{"rendered":"xv6-oslab24-hitsz-answers"},"content":{"rendered":"\n<p class=\"is-style-big_icon_point\">\u30cf\u30eb\u30d3\u30f3\u5de5\u696d\u5927\u5b66\uff08\u6df1\u5733\uff09\u2022 2024 \u2022 \u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0 Lab\u2022 \u306b\u304a\u3051\u308b\u89e3\u6c7a\u7b56 \u2022 HITSZ \u64cd\u4f5c\u7cfb\u7edf\u5b9e\u9a8c 2024<\/p>\n\n\n\n<p class=\"has-border -border03 is-style-icon_info\">\u5fa1\u8cea\u554f\u304c\u5fa1\u5ea7\u3044\u307e\u3057\u305f\u3089\u3001\u3053\u306e\u30da\u30fc\u30b8\u306e\u4e0b\u90e8\u306b\u3042\u308b\u30b3\u30e1\u30f3\u30c8\u6b04\u3092\u5fa1\u5229\u7528\u304f\u3060\u3055\u3044\u3002<br><span class=\"swl-marker mark_yellow\">\u4ef0\u305b\u4e8b\u6709\u4e4b\u5019\u30cf\u30cf<\/span>\u3001<span class=\"swl-marker mark_blue\">\u6b64\u4e01\u4e4b\u4e0b\u30cb\u30a2\u30eb\u610f\u898b\u4e4b\u6b04\u30f2\u7528\u30f0\u7d66\u30d8<\/span>\u3002<\/p>\n\n\n\n<p class=\"is-style-big_icon_batsu\">\u5f53\u30b5\u30a4\u30c8\u5185\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u7121\u65ad\u8ee2\u8f09\u3001\u5f15\u7528\u3001\u30b3\u30d4\u30fc\u306f\u7981\u6b62\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lab 1 Utils<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u6b21\u306e\u8cea\u554f\u3092\u7b54\u3048\u3066\u306a\u3055\u3044<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.&nbsp;<strong><code>sleep.c<\/code><strong>\u306b\u3064\u3044\u3066\u306e\u8cea\u554f<\/strong><\/strong><\/h4>\n\n\n\n<dl class=\"swell-block-faq -icon-rounded is-style-faq-box\" data-q=\"fill-custom\" data-a=\"fill-custom\">\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">1. \u30e6\u30fc\u30b6\u30fc\u304c xv6 \u306e\u30b7\u30a7\u30eb\u3067\u30b3\u30de\u30f3\u30c9<code>sleep hello world\\n<\/code>\u3092\u5165\u529b\u3057\u305f\u5834\u5408\u3001<code>sleep<\/code>\u30d7\u30ed\u30b0\u30e9\u30e0\u5185\u3067\u306e&nbsp;<code>argc<\/code>&nbsp;\u306e\u5024\u3068&nbsp;<code>argv<\/code>&nbsp;\u914d\u5217\u306e\u30b5\u30a4\u30ba\u306f\u3069\u3046\u306a\u308a\u307e\u3059\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\"><code>argc<\/code>&nbsp;\u306e\u5024\u306f&nbsp;<code><span class=\"swl-marker mark_green\">3<\/span><\/code>&nbsp;\u3067\u3001<code>argv<\/code>&nbsp;\u914d\u5217\u306e\u30b5\u30a4\u30ba\u3082&nbsp;<code><span class=\"swl-marker mark_green\">3<\/span><\/code>&nbsp;\u3067\u3059\u3002\u306a\u304a\u3001<code>argv[argc]<\/code>&nbsp;\u306f\u5e38\u306b&nbsp;<code>NULL<\/code>&nbsp;\u30dd\u30a4\u30f3\u30bf\u3092\u6307\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">2. \u4e0a\u8a18\u306e\u554f\u984c\u306b\u304a\u3044\u3066\u3001<code>sleep<\/code>&nbsp;\u30d7\u30ed\u30b0\u30e9\u30e0\u306e&nbsp;<code>main<\/code>&nbsp;\u95a2\u6570\u306b\u6e21\u3055\u308c\u308b\u5f15\u6570&nbsp;<code>argv<\/code>&nbsp;\u306e\u5404\u30dd\u30a4\u30f3\u30bf\u306f\u3069\u306e\u6587\u5b57\u5217\u3092\u6307\u3057\u3066\u304a\u308a\u3001\u305d\u308c\u305e\u308c\u306e\u610f\u5473\u306f\u4f55\u3067\u3059\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\"><code>argv[0]<\/code>&nbsp;\u306f&nbsp;<code>\"sleep\"<\/code>&nbsp;\u3092\u6307\u3057\u3001\u3053\u308c\u306f<span class=\"swl-marker mark_green\">\u5b9f\u884c\u3055\u308c\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30d1\u30b9<\/span>\u3002<br><code>argv[1]<\/code>&nbsp;\u306f&nbsp;<code>\"hello\"<\/code>&nbsp;\u3092\u6307\u3057\u3001\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u3067\u30e6\u30fc\u30b6\u30fc\u304c<span class=\"swl-marker mark_green\">\u5165\u529b\u3057\u305f\u6700\u521d\u5f15\u6570<\/span>\u3002<br><code>argv[2]<\/code>&nbsp;\u306f&nbsp;<code>\"world\"<\/code>&nbsp;\u3092\u6307\u3057\u3001\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u3067\u30e6\u30fc\u30b6\u30fc\u304c<span class=\"swl-marker mark_green\">\u5165\u529b\u3057\u305f2\u756a\u76ee\u5f15\u6570<\/span>\u3002<br>\u3055\u3089\u306b\u3001<code>argv[3]<\/code>&nbsp;\u306f&nbsp;<code>NULL<\/code>&nbsp;\u3092\u6307\u3057\u3066\u304a\u308a\u3001\u914d\u5217\u306e\u7d42\u7aef\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">3. <code>sleep<\/code>&nbsp;\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u3069\u306e\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u304c\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\"><code><span class=\"swl-marker mark_green\">sleep()<\/span><\/code>&nbsp;\u3068&nbsp;<code><span class=\"swl-marker mark_green\">exit()<\/span><\/code>&nbsp;\u306e2\u3064\u306e\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u304c\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n<\/dl>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2.&nbsp;<strong>\u30d1\u30a4\u30d7\u306b\u3064\u3044\u3066\u306e\u8cea\u554f<\/strong><\/h4>\n\n\n\n<dl class=\"swell-block-faq -icon-rounded is-style-faq-box\" data-q=\"fill-custom\" data-a=\"fill-custom\">\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">1. <code>pingpong<\/code>&nbsp;\u3067\u3001\u3069\u306e\u3088\u3046\u306b\u30d1\u30a4\u30d7\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u304b\uff1f<code>fork<\/code>&nbsp;\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3068\u7d44\u307f\u5408\u308f\u305b\u3066\u3001\u3069\u306e\u3088\u3046\u306b\u89aa\u5b50\u30d7\u30ed\u30bb\u30b9\u9593\u3067\u30c7\u30fc\u30bf\u3092\u8ee2\u9001\u3057\u307e\u3057\u305f\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\">\u30d1\u30a4\u30d7\u306f&nbsp;<code>pipe<\/code>&nbsp;\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002\u8aad\u307f\u53d6\u308a\u3068\u66f8\u304d\u8fbc\u307f\u7528\u306e\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\u3092\u683c\u7d0d\u3059\u308b\u305f\u3081\u306b\u3001\u9577\u30552\u306e\u6574\u6570\u914d\u5217\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u307e\u305a\u89aa\u30d7\u30ed\u30bb\u30b9\u306e PID \u3092\u53d6\u5f97\u3057\u3001<code>fork<\/code>&nbsp;\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3067\u5b50\u30d7\u30ed\u30bb\u30b9\u3092\u751f\u6210\u3057\u307e\u3059\u3002\u3053\u306e\u6642\u70b9\u3067\u3001\u89aa\u30d7\u30ed\u30bb\u30b9\u306e PID \u306f\u4e21\u65b9\u306e\u30d7\u30ed\u30bb\u30b9\u3067\u5171\u6709\u3055\u308c\u307e\u3059\u3002<code>fork<\/code>&nbsp;\u306e\u623b\u308a\u5024\u3092\u4f7f\u3063\u3066\u73fe\u5728\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u89aa\u304b\u5b50\u304b\u3092\u5224\u5225\u3057\u307e\u3059\u3002\u30c7\u30fc\u30bf\u3092\u8ee2\u9001\u3059\u308b\u969b\u306b\u306f\u3001\u8aad\u307f\u53d6\u308a\u5074\u306f\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u3001\u66f8\u304d\u8fbc\u307f\u5074\u306f\u8aad\u307f\u53d6\u308a\u7aef\u3092\u9589\u3058\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u66f8\u304d\u8fbc\u307f\u5074\u306f&nbsp;<code>write<\/code>&nbsp;\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u4f7f\u3063\u3066\u30d0\u30c3\u30d5\u30a1\u306b\u30c7\u30fc\u30bf\u3092\u66f8\u304d\u8fbc\u307f\u3001\u8aad\u307f\u53d6\u308a\u5074\u306f&nbsp;<code>read<\/code>&nbsp;\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u4f7f\u3063\u3066\u30d0\u30c3\u30d5\u30a1\u304b\u3089\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3059\u3002\u8aad\u307f\u66f8\u304d\u304c\u7d42\u308f\u3063\u305f\u3089\u4f7f\u7528\u3057\u305f\u30d1\u30a4\u30d7\u7aef\u3092\u9589\u3058\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">2.\u300c\u30d1\u30a4\u30d7\u300d\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u306b\u3042\u308b&nbsp;<code>wc<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u306e\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u518d\u5ea6\u8aad\u307f\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u30d1\u30a4\u30d7\u306e\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u306a\u304b\u3063\u305f\u5834\u5408\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u5b9f\u884c\u3059\u308b\u3068\u4f55\u304c\u8d77\u3053\u308b\u304b\u8aac\u660e\u3057\u306a\u3055\u3044\u3002\u3055\u3089\u306b\u3001Linux \u74b0\u5883\u3067\u5b9f\u884c\u3057\u3066&nbsp;<code>ps<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u305f\u7d50\u679c\u306b\u3064\u3044\u3066\u3082\u8aac\u660e\u3057\u306a\u3055\u3044<br><\/dt><dd class=\"faq_a\">\n<pre class=\"wp-block-code\"><code class=\"c\">#include &lt;unistd.h&gt; \nint main() \n{ \n    int p&#91;2]; \/* \u30d1\u30a4\u30d7\u306e2\u3064\u306e\u30d5\u30a1\u30a4\u30eb\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\u3092\u683c\u7d0d *\/ \n    char *argv&#91;2]; argv&#91;0] = \"wc\"; \/* \u5b9f\u884c\u3059\u308b\u30b3\u30de\u30f3\u30c9\u3092 \"wc\" \u306b\u8a2d\u5b9a *\/ \n    argv&#91;1] = 0; \/* \u5f15\u6570\u914d\u5217\u3092 NULL \u3067\u7d42\u4e86 *\/ \n    pipe(p); \/* \u30d1\u30a4\u30d7\u3092\u4f5c\u6210\u3002p&#91;0]\u306f\u8aad\u307f\u53d6\u308a\u7aef\u3001p&#91;1]\u306f\u66f8\u304d\u8fbc\u307f\u7aef *\/ \n    if (fork() == 0) { \/* \u5b50\u30d7\u30ed\u30bb\u30b9 *\/ \n        close(0); \/* \u6a19\u6e96\u5165\u529b\uff08\u30d5\u30a1\u30a4\u30eb\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf0\uff09\u3092\u9589\u3058\u308b *\/ \n        dup(p&#91;0]); \/* \u30d1\u30a4\u30d7\u306e\u8aad\u307f\u53d6\u308a\u7aef\u3092\u8907\u88fd\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf0\u306b\u5272\u308a\u5f53\u3066 *\/ \n        close(p&#91;0]); \/* \u91cd\u8907\u3057\u305f\u8aad\u307f\u53d6\u308a\u7aef\u3092\u9589\u3058\u308b *\/ \n        \/\/close(p&#91;1]); \/* \u4e0d\u8981\u306a\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u306a\u3044 *\/ \n        execv(\"\/bin\/wc\", argv); \/* \"wc\" \u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u5b9f\u884c *\/ \n    } else { \/* \u89aa\u30d7\u30ed\u30bb\u30b9 *\/ \n        close(p&#91;0]); \/* \u30d1\u30a4\u30d7\u306e\u8aad\u307f\u53d6\u308a\u7aef\u3092\u9589\u3058\u308b *\/ \n        write(p&#91;1], \"hello world\\n\", 12); \/* \u30d1\u30a4\u30d7\u306b\u30c7\u30fc\u30bf\u3092\u66f8\u304d\u8fbc\u3080 *\/ \n        close(p&#91;1]); \/* \u30d1\u30a4\u30d7\u306e\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u308b *\/ \n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"has-border -border02\"><code>wc<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u306f\u5165\u529b\u3055\u308c\u305f\u884c\u6570\u3001\u5358\u8a9e\u6570\u3001\u6587\u5b57\u6570\u3092\u7d71\u8a08\u3057\u307e\u3059\u3002\u901a\u5e38\u3001<code>wc<\/code>&nbsp;\u306f\u6a19\u6e96\u5165\u529b\u304b\u3089\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u53d6\u308a\u307e\u3059\u3002\u3053\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001\u6a19\u6e96\u5165\u529b\u306f\u30d1\u30a4\u30d7\u306e\u8aad\u307f\u53d6\u308a\u7aef\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\uff08<code>dup(p[0])<\/code>\uff09\u3002<br>\u89aa\u30d7\u30ed\u30bb\u30b9\u304c&nbsp;<code>\"hello world\\n\"<\/code>&nbsp;\u3092\u30d1\u30a4\u30d7\u306b\u66f8\u304d\u8fbc\u3093\u3060\u5f8c\u3001\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u307e\u3059\u3002\u901a\u5e38\u3001\u3059\u3079\u3066\u306e\u66f8\u304d\u8fbc\u307f\u7aef\u304c\u9589\u3058\u3089\u308c\u305f\u3068\u304d\u306b\u3001\u30d1\u30a4\u30d7\u306e\u8aad\u307f\u53d6\u308a\u7aef\u306f EOF \u3092\u53d7\u3051\u53d6\u308a\u307e\u3059\u3002\u3053\u308c\u306f\u3059\u3079\u3066\u306e\u30c7\u30fc\u30bf\u304c\u66f8\u304d\u8fbc\u307e\u308c\u305f\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002\u3057\u304b\u3057\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u306a\u304b\u3063\u305f\u5834\u5408\u3001\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u4fdd\u6301\u3057\u3066\u3044\u308b\u30d7\u30ed\u30bb\u30b9\u304c\u3042\u308b\u305f\u3081\u3001<code>wc<\/code>&nbsp;\u306f EOF \u4fe1\u53f7\u3092\u53d7\u3051\u53d6\u308b\u3053\u3068\u304c\u3067\u304d\u305a\u3001\u7121\u9650\u306b\u30d6\u30ed\u30c3\u30af\u3055\u308c\u307e\u3059\u3002<br><code>.\/pipe_closed<\/code>&nbsp;\u3067\u306f\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u305f\u5834\u5408\u3001\u89aa\u30d7\u30ed\u30bb\u30b9\u304c\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u305f\u5f8c\u306b&nbsp;<code>wc<\/code>&nbsp;\u306f EOF \u3092\u53d7\u3051\u53d6\u308a\u3001\u7d71\u8a08\u7d50\u679c\u3092\u51fa\u529b\u3057\u3066\u7d42\u4e86\u3057\u307e\u3059\u3002<br><code>.\/pipe_notclosed<\/code>&nbsp;\u3067\u306f\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u30d1\u30a4\u30d7\u306e\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u306a\u3044\u305f\u3081\u3001<code>wc<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u304c\u30c7\u30fc\u30bf\u306e\u5165\u529b\u3092\u5f85\u3061\u7d9a\u3051\u307e\u3059\u3002\u3053\u306e\u7d50\u679c\u3001<code>wc<\/code>&nbsp;\u306f\u30d6\u30ed\u30c3\u30af\u3055\u308c\u3001\u5b9f\u884c\u3092\u7d9a\u3051\u307e\u3059\u3002<code>ps<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u3067\u78ba\u8a8d\u3059\u308b\u3068\u3001<code>wc<\/code>&nbsp;\u306f\u5b9f\u884c\u4e2d\u3067\u3042\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002\u307e\u305f\u3001<code>wc<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u306e\u51fa\u529b\u304c\u8868\u793a\u3055\u308c\u306a\u3044\u306e\u3082\u540c\u3058\u7406\u7531\u306b\u3088\u308b\u3082\u306e\u3067\u3059\u3002<\/p>\n<\/dd><\/div>\n<\/dl>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e8c. \u30b3\u30fc\u30c9\u30c7\u30b6\u30a4\u30f3<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">(1) <strong>pingpong \u306e\u30c7\u30b6\u30a4\u30f3<\/strong><\/h4>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>\u30d1\u30a4\u30d7\u306e\u4f5c\u6210<\/strong><\/h5>\n\n\n\n<p><strong>\ud83c\udf1f \u30d1\u30a4\u30d7\u306e\u5ba3\u8a00:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">int pipe_parent_to_child&#91;2], pipe_child_to_parent&#91;2];<\/code><\/pre>\n\n\n\n<p>2 \u3064\u306e\u30d1\u30a4\u30d7\u3092\u5b9a\u7fa9\u3057\u307e\u3057\u305f\u3002\u305d\u308c\u305e\u308c\u89aa\u30d7\u30ed\u30bb\u30b9\u304b\u3089\u5b50\u30d7\u30ed\u30bb\u30b9\u3078\u306e\u901a\u4fe1\uff08<code>pipe_parent_to_child<\/code>\uff09\u3068\u5b50\u30d7\u30ed\u30bb\u30b9\u304b\u3089\u89aa\u30d7\u30ed\u30bb\u30b9\u3078\u306e\u901a\u4fe1\uff08<code>pipe_child_to_parent<\/code>\uff09\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\ud83c\udf1f \u30d1\u30a4\u30d7\u306e\u521d\u671f\u5316:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">pipe(pipe_parent_to_child);  \npipe(pipe_child_to_parent);<\/code><\/pre>\n\n\n\n<p><code>pipe<\/code>&nbsp;\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30a4\u30d7\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u5404\u30d1\u30a4\u30d7\u306b\u306f 2 \u3064\u306e\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\u304c\u3042\u308a\u307e\u3059\uff1a&nbsp;<code>[0]<\/code>&nbsp;\u306f\u8aad\u307f\u53d6\u308a\u7aef\u3001<code>[1]<\/code>&nbsp;\u306f\u66f8\u304d\u8fbc\u307f\u7aef\u3067\u3059\u3002<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>\u30c7\u30fc\u30bf\u306e\u9001\u53d7\u4fe1<\/strong><\/h5>\n\n\n\n<p><strong>\ud83c\udf1f \u5b50\u30d7\u30ed\u30bb\u30b9\u306e\u4f5c\u6210:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">int pid = fork();<\/code><\/pre>\n\n\n\n<p><code>fork()<\/code>&nbsp;\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3066\u5b50\u30d7\u30ed\u30bb\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<code>fork()<\/code>&nbsp;\u306e\u623b\u308a\u5024\u304c 0 \u306e\u5834\u5408\u3001\u73fe\u5728\u306f\u5b50\u30d7\u30ed\u30bb\u30b9\u5185\u3067\u5b9f\u884c\u4e2d\u3067\u3042\u308a\u3001\u6b63\u306e\u5024\u306e\u5834\u5408\u306f\u89aa\u30d7\u30ed\u30bb\u30b9\u5185\u3067\u3042\u308b\u3053\u3068\u3092\u610f\u5473\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\ud83c\udf1f \u5b50\u30d7\u30ed\u30bb\u30b9:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">if (pid == 0) {\n    close(pipe_parent_to_child&#91;1]); \/\/ Close Write End\n    read(pipe_parent_to_child&#91;0], buffer, MAXLEN);\n    printf(\"%d: received %s from pid %d\\n\", getpid(), buffer, parent_pid);\n    close(pipe_parent_to_child&#91;0]); \/\/ Close Read End\n    close(pipe_child_to_parent&#91;0]);\n    write(pipe_child_to_parent&#91;1], \"pong\", 5);\n    close(pipe_child_to_parent&#91;1]);\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u89aa\u30d7\u30ed\u30bb\u30b9\u304b\u3089\u5b50\u30d7\u30ed\u30bb\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3059\u308b\u969b\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u306f\u30d1\u30a4\u30d7\u306e\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u3001\u8aad\u307f\u53d6\u308a\u7aef\u3060\u3051\u3092\u4fdd\u6301\u3057\u3066\u89aa\u30d7\u30ed\u30bb\u30b9\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u305d\u306e\u5f8c\u3001<code>read()<\/code>&nbsp;\u3092\u4f7f\u7528\u3057\u3066\u30d1\u30a4\u30d7\u304b\u3089\u30c7\u30fc\u30bf\u3092\u30d0\u30c3\u30d5\u30a1\u306b\u8aad\u307f\u8fbc\u307f\u3001\u89aa\u30d7\u30ed\u30bb\u30b9\u304b\u3089\u53d7\u4fe1\u3057\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8868\u793a\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u5b50\u30d7\u30ed\u30bb\u30b9\u306e PID \u306f&nbsp;<code>getpid()<\/code>&nbsp;\u3092\u4f7f\u7528\u3057\u3066\u53d6\u5f97\u3057\u307e\u3059\u3002\u4e00\u65b9\u3001\u89aa\u30d7\u30ed\u30bb\u30b9\u306e PID \u306f&nbsp;<code>main<\/code>&nbsp;\u95a2\u6570\u306e\u5192\u982d\u3067&nbsp;<code>getpid()<\/code>&nbsp;\u3092\u7528\u3044\u3066\u53d6\u5f97\u3057\u3001<code>parent_pid<\/code>&nbsp;\u5909\u6570\u306b\u683c\u7d0d\u3055\u308c\u3066\u304a\u308a\u3001\u4e21\u30d7\u30ed\u30bb\u30b9\u3067\u5171\u6709\u3055\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u51e6\u7406\u3057\u305f\u5f8c\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u306f\u8aad\u307f\u53d6\u308a\u7aef\u3092\u9589\u3058\u3001\u6b21\u306b&nbsp;<code>write()<\/code>&nbsp;\u3092\u4f7f\u7528\u3057\u3066\u89aa\u30d7\u30ed\u30bb\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>\ud83c\udf1f \u89aa\u30d7\u30ed\u30bb\u30b9:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">else {\n    close(pipe_parent_to_child&#91;0]); \/\/ Close Read End\n    write(pipe_parent_to_child&#91;1], \"ping\", 5);\n    close(pipe_parent_to_child&#91;1]); \/\/ Close Write End\n    close(pipe_child_to_parent&#91;1]);\n    read(pipe_child_to_parent&#91;0], buffer, MAXLEN);\n    printf(\"%d: received %s from pid %d\\n\", getpid(), buffer, pid);\n    close(pipe_child_to_parent&#91;0]);\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u89aa\u30d7\u30ed\u30bb\u30b9\u306f\u30d1\u30a4\u30d7\u306e\u8aad\u307f\u53d6\u308a\u7aef\u3092\u9589\u3058\u3001<code>write()<\/code>&nbsp;\u3092\u7528\u3044\u3066\u5b50\u30d7\u30ed\u30bb\u30b9\u306b\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002\u9001\u4fe1\u304c\u5b8c\u4e86\u3057\u305f\u5f8c\u3001\u66f8\u304d\u8fbc\u307f\u7aef\u3092\u9589\u3058\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u305d\u306e\u5f8c\u3001<code>read()<\/code>&nbsp;\u3092\u4f7f\u7528\u3057\u3066\u5b50\u30d7\u30ed\u30bb\u30b9\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3057\u3001\u5185\u5bb9\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u89aa\u30d7\u30ed\u30bb\u30b9\u306e PID \u306f&nbsp;<code>getpid()<\/code>&nbsp;\u3067\u53d6\u5f97\u53ef\u80fd\u3067\u3042\u308a\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u306e PID \u306f&nbsp;<code>fork()<\/code>&nbsp;\u306e\u623b\u308a\u5024\u3092&nbsp;<code>pid<\/code>&nbsp;\u5909\u6570\u306b\u4fdd\u5b58\u3057\u3066\u5229\u7528\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">(2) <strong>find \u306e\u30c7\u30b6\u30a4\u30f3<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u80cc\u666f:<\/strong><br><code>ls<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u306e\u6a5f\u80fd\u306f\u3001\u6307\u5b9a\u3055\u308c\u305f\u30d1\u30b9\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3084\u30d5\u30a9\u30eb\u30c0\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u3067\u3059\u3002\u3053\u306e\u305f\u3081\u3001<code>find<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u306e\u8a2d\u8a08\u3067\u306f\u3001<code>ls<\/code>&nbsp;\u306e\u5b9f\u88c5\u3092\u53c2\u8003\u306b\u3057\u307e\u3057\u305f\u3002\u3064\u307e\u308a\u3001\u6307\u5b9a\u3055\u308c\u305f\u30d1\u30b9\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3084\u30d5\u30a9\u30eb\u30c0\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u6a5f\u80fd\u304c\u65e2\u306b\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b\u3082\u306e\u3068\u898b\u306a\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>find \u306e\u57fa\u672c\u52d5\u4f5c:<\/strong><br><code>find<\/code>&nbsp;\u30b3\u30de\u30f3\u30c9\u306e\u6838\u5fc3\u306f\u3001\u6307\u5b9a\u3055\u308c\u305f\u540d\u524d\u3068\u540c\u3058\u30d5\u30a1\u30a4\u30eb\u307e\u305f\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u898b\u3064\u3051\u308b\u3053\u3068\u3067\u3059\u3002\u3053\u308c\u306b\u306f&nbsp;<code>strcmp<\/code>&nbsp;\u3092\u7528\u3044\u305f\u6587\u5b57\u5217\u6bd4\u8f03\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u4e00\u81f4\u3057\u305f\u5834\u5408\u306f\u3001\u8a72\u5f53\u3059\u308b\u30d1\u30b9\u3092\u51fa\u529b\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u518d\u5e30\u691c\u7d22:<\/strong><br>\u691c\u7d22\u4e2d\u306b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u898b\u3064\u3051\u305f\u5834\u5408\u3001\u305d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u5bfe\u3057\u3066\u518d\u5e30\u7684\u306b\u691c\u7d22\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\u305f\u3060\u3057\u3001<code>.<\/code>&nbsp;\u3068&nbsp;<code>..<\/code>&nbsp;\u306f\u691c\u7d22\u5bfe\u8c61\u5916\u3068\u3057\u307e\u3059\u3002\u3053\u306e\u518d\u5e30\u64cd\u4f5c\u3067\u306f\u3001\u518d\u5e30\u524d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3068\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u540d\u3092\u7d50\u5408\u3057\u3066\u6b21\u306e\u5165\u529b\u30d1\u30b9\u3092\u4f5c\u6210\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u540d\u306f\u5909\u66f4\u3057\u307e\u305b\u3093\u3002<\/li>\n\n\n\n<li><strong>\u91cd\u8907\u691c\u7d22\u306e\u6392\u9664:<\/strong><br><code>switch (st.type)<\/code>&nbsp;\u306e\u4e2d\u3067\u3001<code>case T_DIR<\/code>&nbsp;\u306e\u307f\u3092\u6b8b\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u306f\u3001<code>case T_DIR<\/code>&nbsp;\u5185\u3067\u30d5\u30a1\u30a4\u30eb\u306e\u4f4d\u7f6e\u3092\u7279\u5b9a\u3067\u304d\u308b\u305f\u3081\u3001<code>case T_FILE<\/code>&nbsp;\u3092\u7279\u5225\u306b\u51e6\u7406\u3059\u308b\u5fc5\u8981\u304c\u306a\u3044\u304b\u3089\u3067\u3059\u3002<\/li>\n\n\n\n<li><strong>\u91cd\u8981\u306a\u30b3\u30fc\u30c9\u90e8\u5206:<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/FIND IMPLEMENTATION\nif (strcmp(de.name, name) == 0)\n    printf(\"%s\\n\", buf); \/\/Print the result from (result).\n\/*Recursive 'find' in sub-directory,\nmind that . and .. should not be considered as sub-directory *\/\nif (st.type == T_DIR &amp;&amp; strcmp(de.name, \".\")!=0 &amp;&amp; strcmp(de.name, \"..\")!=0)\n    find(buf, name); \/\/Start 'find' from the 'buf' just updated before\n\/\/FIND END<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">(3) <strong>xv6 \u8d77\u52d5\u30d7\u30ed\u30bb\u30b9\u306e\u5206\u6790<\/strong><\/h4>\n\n\n\n<p><code>commands.gdb<\/code>&nbsp;\u30d5\u30a1\u30a4\u30eb\u306b\u306f\u3001<code>initcode<\/code>&nbsp;\u3068&nbsp;<code>init<\/code>&nbsp;\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u540d\u524d\u3092\u51fa\u529b\u3059\u308b\u305f\u3081\u306e GDB \u30b3\u30de\u30f3\u30c9\u304c\u8a18\u8ff0\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u5b9f\u9a13\u8981\u4ef6\u3092\u6e80\u305f\u3059\u306b\u306f\u3001\u4ee5\u4e0b\u306e 6 \u884c\u306e\u30b3\u30de\u30f3\u30c9\u3060\u3051\u3067\u5341\u5206\u3067\u3059\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-plaintext\">(gdb_cmd_dump)  \n### proc \u69cb\u9020\u4f53\u306e 'name' \u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u5909\u66f4\u3055\u308c\u308b\u76f4\u524d\u306b\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u3092\u8a2d\u5b9a\ntbreak kernel\/exec.c:90  \n### init \u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u6e96\u5099\u3057\u3001qemu \u3092\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u307e\u3067\u5b9f\u884c \ncontinue\n### \u3053\u306e\u6642\u70b9\u3067\u306f 'proc' \u306f\u307e\u3060\u5909\u66f4\u3055\u308c\u3066\u304a\u3089\u305a\u3001'name' \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u51fa\u529b\nprint cpus&#91;$tp]-&gt;proc-&gt;name \n### 'safestrcpy()' \u3092\u5b9f\u884c\u3057\u3066 'proc' \u306e 'name' \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5909\u66f4  \nnext \n### \u3053\u306e\u6642\u70b9\u3067 'proc' \u304c\u5909\u66f4\u3055\u308c\u3001'name' \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u518d\u5ea6\u51fa\u529b\nprint cpus&#91;$tp]-&gt;proc-&gt;name \n### \u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3092\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5 \ndashboard <\/code><\/pre>\n\n\n\n<p>\u660e\u3089\u304b\u306b\u3001\u5f8c\u534a\u306e 5 \u884c\u306e\u30b3\u30de\u30f3\u30c9\u306f\u51fa\u529b\u30ed\u30b8\u30c3\u30af\u306b\u5fc5\u8981\u4e0d\u53ef\u6b20\u3067\u3059\u30026 \u884c\u3067\u8981\u4ef6\u3092\u6e80\u305f\u3059\u306b\u306f\u3001\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u3092 1 \u3064\u3060\u3051\u8a2d\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30dd\u30a4\u30f3\u30c8\u306f\u3001<code>proc<\/code>&nbsp;\u69cb\u9020\u4f53\u306e&nbsp;<code>name<\/code>&nbsp;\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u5909\u66f4\u3055\u308c\u308b\u77ac\u9593\u3092\u6b63\u78ba\u306b\u7279\u5b9a\u3057\u3001\u305d\u306e\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067\u3059\u3002<br>\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u3067\u5bfe\u5fdc\u3059\u308b\u30b3\u30fc\u30c9\u306e\u5b9f\u884c\u524d\u306b 1 \u56de\u51fa\u529b\u3057\u3001\u5b9f\u884c\u5f8c\u306b\u3082\u3046 1 \u56de\u51fa\u529b\u3059\u308b\u3053\u3068\u3067\u3001\u8981\u4ef6\u3092\u6e80\u305f\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br><br>\u3053\u306e\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8<code>tbreak<\/code>\u306b\u5bfe\u5fdc\u3059\u308b\u6587\u306f\u3001<code>safestrcpy(p-&gt;name, last, sizeof(p-&gt;name))<\/code>&nbsp;\u3067\u3059\u3002\u3053\u306e\u6587\u306f\u3001<code>last<\/code>\u3092&nbsp;<code>p-&gt;name<\/code>&nbsp;\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059\uff08<code>p<\/code>&nbsp;\u306f&nbsp;<code>myproc()<\/code>&nbsp;\u304b\u3089\u53d6\u5f97\u3055\u308c\u3001\u73fe\u5728\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u793a\u3057\u3066\u3044\u307e\u3059\uff09\u3002<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>\u5206\u6790\u306e\u6d41\u308c<\/strong><\/h5>\n\n\n\n<p><strong>\u76ee\u7684<\/strong>\uff1a<br><code>initcode<\/code>&nbsp;\u304c&nbsp;<code>init<\/code>&nbsp;\u306b\u5207\u308a\u66ff\u308f\u308b\u77ac\u9593\u3092\u7279\u5b9a\u3057\u3001\u3055\u3089\u306b&nbsp;<code>proc<\/code>&nbsp;\u69cb\u9020\u4f53\u306e&nbsp;<code>name<\/code>&nbsp;\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u5909\u66f4\u3055\u308c\u308b\u4f4d\u7f6e\u3092\u898b\u3064\u3051\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>xv6 \u306e\u8d77\u52d5\u30d7\u30ed\u30bb\u30b9\u3092\u89e3\u6790<\/strong>\uff1a<br>\u8d77\u52d5\u6642\u306b\u3001\u6700\u521d\u306b&nbsp;<code>userinit()<\/code>&nbsp;\u95a2\u6570\u5185\u3067&nbsp;<code>initcode<\/code>&nbsp;\u3092\u30e1\u30e2\u30ea\u306b\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002\u3053\u306e\u95a2\u6570\u3067\u306f\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30fc\u30c9\u3060\u3051\u3067\u306a\u304f\u3001<code>proc<\/code>&nbsp;\u69cb\u9020\u4f53\u306e\u5404\u7a2e\u30d1\u30e9\u30e1\u30fc\u30bf\u3082\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002\u305d\u306e\u4e2d\u306b\u306f\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u540d\u306e\u8a2d\u5b9a\u3092\u884c\u3046\u4ee5\u4e0b\u306e\u547c\u3073\u51fa\u3057\u3082\u542b\u307e\u308c\u307e\u3059\uff1a<code>safestrcpy(p-&gt;name, \"initcode\", sizeof(p-&gt;name));<\/code><\/p>\n\n\n\n<p><strong><code>initcode<\/code>&nbsp;\u304b\u3089&nbsp;<code>init<\/code>&nbsp;\u3078\u306e\u5207\u308a\u66ff\u3048<\/strong>\uff1a<br>\u3053\u306e\u5207\u308a\u66ff\u3048\u306f ECALL \u3092\u901a\u3058\u3066\u884c\u308f\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>initcode&#91;] = {\n... \n0x93, 0x08, 0x70, 0x00, \/\/ LI a7, 7   0x00700893\n0x73, 0x00, 0x00, 0x00, \/\/ ECALL      0x00000073\n...\n};\n\n# exec(init, argv)\n    LA a0, init\n    LA a1, argv\n    LI a7, SYS_exec # LI a7, 7\n    ECALL<\/code><\/pre>\n\n\n\n<p>\u305d\u306e\u5f8c\u3001\u5272\u308a\u8fbc\u307f\u30cf\u30f3\u30c9\u30e9\u306b\u5165\u308a\u3001<code>syscall<\/code>&nbsp;\u306b\u52d5\u4f5c\u304c\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\u3055\u308c\u307e\u3059\u3002<code>syscall.c<\/code>\u3067\u78ba\u8a8d\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">num = p-&gt;trapframe-&gt;a7;\np-&gt;trapframe-&gt;a0 = syscalls&#91;num](); <\/code><\/pre>\n\n\n\n<p><code>a7<\/code>&nbsp;\u306e\u5024\u306f 7 \u3067\u3042\u308a\u3001<code>syscalls[7]<\/code>&nbsp;\u304c\u6307\u3059\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u307e\u3059\u3002\u30de\u30af\u30ed&nbsp;<code>syscall.h<\/code>&nbsp;\u3092\u53c2\u7167\u3059\u308b\u3068\u3001\u95a2\u6570&nbsp;<code>extern uint64 sys_exec(void);<\/code>&nbsp;\u3092\u6307\u3057\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong><code>sys_exec<\/code>&nbsp;\u95a2\u6570\u306e\u63a2\u7d22<\/strong>\uff1a<br>\u3053\u306e\u95a2\u6570\u3092&nbsp;<code>sysfile.c<\/code>&nbsp;\u5185\u3067\u78ba\u8a8d\u3059\u308b\u3068\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u64cd\u4f5c\u304c\u3055\u3089\u306b&nbsp;<code>exec<\/code>&nbsp;\u95a2\u6570\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">uint64 sys_exec(void) {\n    char path&#91;MAXPATH], *argv&#91;MAXARG];\n    int i;\n    uint64 uargv, uarg;\n    if (argstr(0, path, MAXPATH) &lt; 0 || argaddr(1, &amp;uargv) &lt; 0) {\n        return -1;\n    }\n    memset(argv, 0, sizeof(argv));\n    for (i = 0;; i++) {\n        if (i &gt;= NELEM(argv)) {\n            goto bad;\n        }\n        if (fetchaddr(uargv + sizeof(uint64) * i, (uint64 *)&amp;uarg) &lt; 0) {\n            goto bad;\n        }\n        if (uarg == 0) {\n            argv&#91;i] = 0;\n            break;\n        }\n        argv&#91;i] = kalloc();\n        if (argv&#91;i] == 0) goto bad;\n        if (fetchstr(uarg, argv&#91;i], PGSIZE) &lt; 0) goto bad;\n    }<code>  \u2009int ret = exec(path, argv);<\/code>    for (i = 0; i &lt; NELEM(argv) &amp;&amp; argv&#91;i] != 0; i++) kfree(argv&#91;i]);\n    return ret;\n    bad:\n      for (i = 0; i &lt; NELEM(argv) &amp;&amp; argv&#91;i] != 0; i++) kfree(argv&#91;i]);\n    return -1;\n}<\/code><\/pre>\n\n\n\n<p><strong><code>exec<\/code>&nbsp;\u95a2\u6570\u306e\u5206\u6790<\/strong>\uff1a<br><code>exec.c<\/code>&nbsp;\u5185\u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30fc\u30c9\u64cd\u4f5c\u304c\u884c\u308f\u308c\u3066\u304a\u308a\u3001<code>initcode<\/code>&nbsp;\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30fc\u30c9\u6642\u3068\u540c\u69d8\u306b\u3001<code>proc<\/code>\u69cb\u9020\u4f53\u306e\u8a2d\u5b9a\u64cd\u4f5c\u3082\u884c\u308f\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u3053\u304b\u3089\u3001<code>initcode<\/code>&nbsp;\u304c&nbsp;<code>init<\/code>&nbsp;\u306b\u5207\u308a\u66ff\u308f\u308b\u4e2d\u5fc3\u7684\u306a\u51e6\u7406\u304c\u3053\u306e\u95a2\u6570\u5185\u306b\u3042\u308b\u3068\u5224\u65ad\u3067\u304d\u307e\u3059\u3002\u76ee\u6a19\u306f&nbsp;<code>proc<\/code>&nbsp;\u306e&nbsp;<code>name<\/code>&nbsp;\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u5909\u66f4\u3055\u308c\u308b\u77ac\u9593\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u306a\u306e\u3067\u3001<code>exec<\/code>&nbsp;\u5185\u3067\u305d\u306e\u5909\u66f4\u3092\u884c\u3046\u6587\u3092\u7279\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\u5909\u66f4\u7b87\u6240\u306e\u7279\u5b9a<\/strong>\uff1a<br>\u6700\u7d42\u7684\u306b\u3001\u4ee5\u4e0b\u306e\u6587\u304c 90 \u884c\u76ee\u306b\u3042\u308b\u3053\u3068\u3092\u767a\u898b\u3057\u307e\u3057\u305f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>safestrcpy(p-&gt;name, last, sizeof(p-&gt;name));<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u6587\u304c&nbsp;<code>proc<\/code>&nbsp;\u306e&nbsp;<code>name<\/code>&nbsp;\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5909\u66f4\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lab 2 Syscall<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e00\u3001\u6b21\u306e\u8cea\u554f\u3092\u7b54\u3048\u3066\u306a\u3055\u3044<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. <strong><code>kernel\/syscall.c<\/code><\/strong>\u306e\u30c8\u30e9\u30c3\u30d7<\/h4>\n\n\n\n<p><strong>\u95a2\u6570<code>syscall()<\/code>\u304c\u3069\u306e\u3088\u3046\u306b\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u756a\u53f7\u306b\u57fa\u3065\u3044\u3066\u5bfe\u5fdc\u3059\u308b\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u30cf\u30f3\u30c9\u30e9\uff08\u4f8b:&nbsp;<code>sys_fork<\/code>\uff09\u3092\u547c\u3073\u51fa\u3059\u304b\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001<code>syscall()<\/code>\u304c\u5177\u4f53\u7684\u306a\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u306e\u623b\u308a\u5024\u3092\u3069\u3053\u306b\u4fdd\u5b58\u3059\u308b\u304b\u6559\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">static uint64 (*syscalls&#91;])(void) = {\n    &#91;SYS_fork] sys_fork,   &#91;SYS_exit] sys_exit,     &#91;SYS_wait] sys_wait,     &#91;SYS_pipe] sys_pipe,\n    &#91;SYS_read] sys_read,   &#91;SYS_kill] sys_kill,     &#91;SYS_exec] sys_exec,     &#91;SYS_fstat] sys_fstat,\n    &#91;SYS_chdir] sys_chdir, &#91;SYS_dup] sys_dup,       &#91;SYS_getpid] sys_getpid, &#91;SYS_sbrk] sys_sbrk,\n    &#91;SYS_sleep] sys_sleep, &#91;SYS_uptime] sys_uptime, &#91;SYS_open] sys_open,     &#91;SYS_write] sys_write,\n    &#91;SYS_mknod] sys_mknod, &#91;SYS_unlink] sys_unlink, &#91;SYS_link] sys_link,     &#91;SYS_mkdir] sys_mkdir,\n    &#91;SYS_close] sys_close, &#91;SYS_rename] sys_rename, &#91;SYS_yield] sys_yield,\n};\n\nvoid syscall(void) {\n  int num;\n  struct proc *p = myproc();\n\n  num = p-&gt;trapframe-&gt;a7;\n  if (num &gt; 0 &amp;&amp; num &lt; NELEM(syscalls) &amp;&amp; syscalls&#91;num]) {\n    p-&gt;trapframe-&gt;a0 = syscalls&#91;num]();\n  } else {\n    printf(\"%d %s: unknown sys call %d\\n\", p-&gt;pid, p-&gt;name, num);\n    p-&gt;trapframe-&gt;a0 = -1;\n  }\n}<\/code><\/pre>\n\n\n\n<p><code>syscalls<\/code>\u306f\u95a2\u6570\u30dd\u30a4\u30f3\u30bf\u914d\u5217\u3067\u3001<code>syscall.h<\/code>\u5185\u306e\u30de\u30af\u30ed\u5b9a\u7fa9\u3055\u308c\u305f\u547c\u3073\u51fa\u3057\u756a\u53f7\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3068\u3057\u3066\u4f7f\u7528\u3057\u3001\u5bfe\u5fdc\u3059\u308b\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u95a2\u6570\u3092\u6307\u3057\u307e\u3059\u3002<br>\u4f8b\u3048\u3070<code>sys_fork<\/code>\u306e\u5834\u5408\u3001ECALL\u547d\u4ee4\u304c\u767a\u751f\u3059\u308b\u3068\u3001<code>syscall()<\/code>\u95a2\u6570\u306f\u30ec\u30b8\u30b9\u30bf<code>a7<\/code>\u304b\u3089\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u756a\u53f7<code>SYS_fork<\/code>\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<code>syscall.h<\/code>\u306b\u3088\u308b\u3068\u3001<code>SYS_fork<\/code>\u306f1\u306b\u7b49\u3057\u3044\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\u3002<br>\u6b21\u306b\u3001\u30b3\u30fc\u30c9\u306e\u4ee5\u4e0b\u306e\u90e8\u5206<br><code>p-&gt;trapframe-&gt;a0 = syscalls[num](); <\/code><br>\u3067\u306f\u3001<code>syscalls[1]<\/code>\u304c\u6307\u3059\u95a2\u6570\u304c<code>sys_fork<\/code>\u3067\u3059\u3002\u305d\u306e\u623b\u308a\u5024\uff08<code>uint64<\/code>\u578b\uff09\u306f\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30bb\u30b9\u306e\u4e2d\u65ad\u30d5\u30ec\u30fc\u30e0\u306e<code>a0<\/code>\u30ec\u30b8\u30b9\u30bf\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2.<code> kernel\/syscall.c<\/code><\/strong>\u306e\u5f15\u6570\u6e21\u3059<\/h4>\n\n\n\n<p><strong>\u3069\u306e\u95a2\u6570\u304c\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u306e\u5f15\u6570\u3092\u6e21\u3059\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u308b\u304b\u6559\u3048\u3066\u304f\u3060\u3055\u3044\u3002\u307e\u305f\u3001<code>argraw()<\/code>\u95a2\u6570\u306e\u610f\u5473\u3092\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/strong><\/p>\n\n\n\n<p><code>argraw<\/code>\u3001<code>argint<\/code>\u3001<code>argaddr<\/code>\u3001<code>argstr<\/code>\u95a2\u6570\u306f\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u5f15\u6570\u3092\u6e21\u3059\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002<br><code>argraw<\/code>\u95a2\u6570\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30bb\u30b9\u306e\u4e2d\u65ad\u30d5\u30ec\u30fc\u30e0\u306e\u7279\u5b9a\u306e\u5f15\u6570\u30ec\u30b8\u30b9\u30bf\uff08<code>a0<\/code>\uff5e<code>a5<\/code>\uff09\u306e\u5024\u3092\u305d\u306e\u307e\u307e<code>uint64<\/code>\u578b\u3068\u3057\u3066\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3. <strong><code>kernel\/proc.c<\/code>\u304a\u3088\u3073<code>proc.h<\/code><\/strong><\/h4>\n\n\n\n<p><strong>\u30d7\u30ed\u30bb\u30b9\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30d6\u30ed\u30c3\u30af\uff08PCB\uff09\u306f\u3069\u306e\u914d\u5217\u306b\u4fdd\u5b58\u3055\u308c\u3066\u3044\u307e\u3059\u304b\uff1fPCB\u5185\u306e\u3069\u306e\u30e1\u30f3\u30d0\u30fc\u304c\u30d7\u30ed\u30bb\u30b9\u306e\u72b6\u614b\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u304b\uff1f\u307e\u305f\u3001\u305d\u306e\u72b6\u614b\u306f\u4f55\u7a2e\u985e\u3042\u308a\u307e\u3059\u304b\uff1f<\/strong><\/p>\n\n\n\n<p>\u30d7\u30ed\u30bb\u30b9\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u30d6\u30ed\u30c3\u30af\u306f\u30b0\u30ed\u30fc\u30d0\u30eb\u914d\u5217<code>proc<\/code>\u306b\u4fdd\u5b58\u3055\u308c\u3066\u3044\u307e\u3059\u3002PCB\u5185\u306e<code>state<\/code>\u30e1\u30f3\u30d0\u30fc\u304c\u30d7\u30ed\u30bb\u30b9\u306e\u72b6\u614b\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002\u72b6\u614b\u306f\u4ee5\u4e0b\u306e5\u7a2e\u985e\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>UNUSED<\/li>\n\n\n\n<li>SLEEPING<\/li>\n\n\n\n<li>RUNNABLE<\/li>\n\n\n\n<li>RUNNING<\/li>\n\n\n\n<li>ZOMBIE<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4. \u3084\u304b\u307e\u3057\u3044<strong><code>$<\/code>\u8a18\u53f7<\/strong><\/h4>\n\n\n\n<p><strong>\u30bf\u30b9\u30af1\u3067\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\uff08\u30d7\u30ed\u30bb\u30b94\u30015\u30016\uff09\u306e\u51fa\u529b\u306e\u524d\u306b\u5fc5\u305a<code>$<\/code>\u8a18\u53f7\u304c\u8868\u793a\u3055\u308c\u308b\u306e\u306f\u306a\u305c\u3067\u3059\u304b\uff1f\uff08\u30d2\u30f3\u30c8:&nbsp;<code>shell<\/code>\u30d7\u30ed\u30b0\u30e9\u30e0<code>sh.c<\/code>\u306f\u3044\u3064<code>$<\/code>\u8a18\u53f7\u3092\u51fa\u529b\u3057\u307e\u3059\u304b\uff1f\uff09<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-plaintext\">\/\/shell\n$ exittest\n&#91;INFO] proc 3 exit, parent pid 2, name sh, state sleeping\n&#91;INFO] proc 3 exit, child 0, pid 4, name child0, state sleeping                                                                                                    \n&#91;INFO] proc 3 exit, child 1, pid 5, name child1, state sleeping                                                                                                    \n&#91;INFO] proc 3 exit, child 2, pid 6, name child2, state sleeping                                                                                                    \n$ &#91;INFO] proc 5 exit, parent pid 1, name init, state runnable                                                                                                      \n&#91;INFO] proc 4 exit, parent pid 1, name init, state runnable                                                                                                        \n&#91;INFO] proc 6 exit, parent pid 1, name init, state running\n<\/code><\/pre>\n\n\n\n<p>\u30b3\u30fc\u30c9<code>sh.c<\/code>\u3092\u8abf\u3079\u308b\u3068\u3001<code>$<\/code>\u8a18\u53f7\u306f<code>getcmd()<\/code>\u95a2\u6570\u306e\u307f\u3067\u51fa\u529b\u3055\u308c\u308b\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\u3002<br><code>getcmd()<\/code>\u95a2\u6570\u306f<code>sh.c<\/code>\u5185\u30671\u56de\u3060\u3051\u547c\u3073\u51fa\u3055\u308c\u3066\u304a\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b<code>while<\/code>\u30eb\u30fc\u30d7\u3067\u5b9f\u884c\u3055\u308c\u308b\u305f\u3073\u306b<code>$<\/code>\u8a18\u53f7\u3092\u51fa\u529b\u3057\u307e\u3059\uff1a<br><code>while (getcmd(buf, sizeof(buf)) &gt;= 0) { ... } <\/code><br><code>exittest<\/code>\u3092\u8aad\u3080\u3068\u3001\u89aa\u30d7\u30ed\u30bb\u30b9\uff08<code>exittest<\/code>\uff09\u306f\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u7d42\u4e86\u3059\u308b\u524d\u306b\u65e2\u306b\u7d42\u4e86\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u60c5\u5831\u306f<code>wait(0,0)<\/code>\u306b\u3088\u3063\u3066\u6355\u6349\u3055\u308c\u3001\u65b0\u3057\u3044\u30eb\u30fc\u30d7\u306b\u5165\u308a\u307e\u3059\u3002\u305d\u306e\u7d50\u679c\u3001<code>$<\/code>\u8a18\u53f7\u304c\u51fa\u529b\u3055\u308c\u307e\u3059\u3002\u6b21\u306b\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u30b9\u30ea\u30fc\u30d7\u72b6\u614b\u304b\u3089\u5fa9\u5e30\u3057\u3001\u7d42\u4e86\u3057\u307e\u3059\u3002\u305d\u306e\u305f\u3081\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u4e00\u62ec\u7d42\u4e86\u3059\u308b\u524d\u306b\u30bf\u30fc\u30df\u30ca\u30eb\u306b\u306f\u5b89\u5b9a\u7684\u306b<code>$<\/code>\u8a18\u53f7\u304c\u51fa\u529b\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5. \u4e71\u308c\u305fyield\u51fa\u529b<\/h4>\n\n\n\n<p><strong>\u30bf\u30b9\u30af3\u3067\u3001\u30c6\u30b9\u30c8\u6642\u306bCPU\u306e\u6570\u30921\u306b\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u7406\u7531\u306f\u4f55\u3067\u3059\u304b\uff1fCPU\u306e\u6570\u304c\u8907\u6570\u306e\u5834\u5408\u3001\u51fa\u529b\u7d50\u679c\u304c\u4e71\u308c\u308b\u306e\u306f\u306a\u305c\u3067\u3059\u304b\uff1f\uff08\u30d2\u30f3\u30c8: \u30de\u30eb\u30c1\u30b3\u30a2\u30b9\u30b1\u30b8\u30e5\u30fc\u30ea\u30f3\u30b0\u3068\u30b7\u30f3\u30b0\u30eb\u30b3\u30a2\u30b9\u30b1\u30b8\u30e5\u30fc\u30ea\u30f3\u30b0\u306e\u9055\u3044\u3092\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\uff09<\/strong><\/p>\n\n\n\n<p>\u30d7\u30ed\u30bb\u30b9\u30c6\u30fc\u30d6\u30eb\u306f\u30b0\u30ed\u30fc\u30d0\u30eb\u3067\u3042\u308a\u3001CPU\u30b3\u30a2\u306e\u6570\u306b\u95a2\u308f\u3089\u305a\u5171\u6709\u3055\u308c\u307e\u3059\u3002\u30d7\u30ed\u30bb\u30b9\u306f\u30b9\u30d4\u30f3\u30ed\u30c3\u30af\u3092\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u30d7\u30ed\u30bb\u30b9\u30c6\u30fc\u30d6\u30eb\u81ea\u4f53\u306b\u306f\u30ed\u30c3\u30af\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002<br><code>xv6<\/code>\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u3067\u306f\u3001\u5404CPU\u306b\u72ec\u81ea\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u304c\u5b58\u5728\u3057\u307e\u3059\u3002\u305d\u306e\u305f\u3081\u3001\u975e\u5e38\u306b\u77ed\u6642\u9593\u306e\u9593\u306b\u8907\u6570\u306eCPU\u304c\u8907\u6570\u306e<code>RUNNABLE<\/code>\u72b6\u614b\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u53d6\u5f97\u3057\u3001\u307b\u307c\u540c\u6642\u306b\u5b9f\u884c\u3092\u958b\u59cb\u3057\u307e\u3059\u3002\u3053\u306e\u7d50\u679c\u3001\u30b3\u30f3\u30bd\u30fc\u30eb\u51fa\u529b\u304c\u4e88\u6e2c\u4e0d\u53ef\u80fd\u306a\u9806\u5e8f\u3067\u884c\u308f\u308c\u3001\u51fa\u529b\u304c\u4e71\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>\u4e8c. \u30b3\u30fc\u30c9\u30c7\u30b6\u30a4\u30f3<\/strong><\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">(1) <strong><code>exit<\/code>\u306e\u30c7\u30b6\u30a4\u30f3<\/strong><\/h4>\n\n\n\n<p>\u51fa\u529b\u8981\u4ef6\u306b\u3088\u308b\u3068\u3001\u4ee5\u4e0b\u306e2\u7a2e\u985e\u306e\u60c5\u5831\u3092\u51fa\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff1a<br>\u30d7\u30ed\u30bb\u30b9\u7d42\u4e86\u6642\u306b\u305d\u306e\u89aa\u30d7\u30ed\u30bb\u30b9\u306e\u60c5\u5831\u3002\u30d7\u30ed\u30bb\u30b9\u7d42\u4e86\u6642\u306b\u305d\u306e\u5b50\u30d7\u30ed\u30bb\u30b9\u306e\u60c5\u5831\u3002<br><code>proc<\/code>\u69cb\u9020\u4f53\u3092\u898b\u308b\u3068\u3001\u5404\u30d7\u30ed\u30bb\u30b9\u306e\u8aac\u660e\u306b\u306f\u305d\u306e\u89aa\u30d7\u30ed\u30bb\u30b9\u304c<code>parent<\/code>\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u4fdd\u5b58\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/ Per-process state\nstruct proc {\n  struct spinlock lock;\n\n  \/\/ p-&gt;lock must be held when using these:\n  enum procstate state;        \/\/ Process state\n  struct proc *parent;         \/\/ Parent process\n\/\/...\n};<\/code><\/pre>\n\n\n\n<p>\u305d\u306e\u305f\u3081\u30011\u3064\u76ee\u306e\u60c5\u5831\u3092\u51fa\u529b\u3059\u308b\u5834\u5408\u3001\u30d7\u30ed\u30bb\u30b9\u304c\u7d42\u4e86\u3059\u308b\u969b\u306b<code>exit()<\/code>\u95a2\u6570\u5185\u3067<code>parent<\/code>\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u53d6\u5f97\u3057\u3066\u95a2\u9023\u60c5\u5831\u3092\u51fa\u529b\u3059\u308c\u3070\u5341\u5206\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/proc.c:exit(){...\n  \/\/ grab a copy of p-&gt;parent, to ensure that we unlock the same\n  \/\/ parent we locked. in case our parent gives us away to init while\n  \/\/ we're waiting for the parent lock. we may then race with an\n  \/\/ exiting parent, but the result will be a harmless spurious wakeup\n  \/\/ to a dead or wrong process; proc structs are never re-allocated\n  \/\/ as anything else.\n  acquire(&amp;p-&gt;lock);\n  struct proc *original_parent = p-&gt;parent;\n  exit_info(\"proc %d exit, parent pid %d, name %s, state %s\\n\", p-&gt;pid, original_parent-&gt;pid, original_parent-&gt;name, stringstate(original_parent-&gt;state));\n  release(&amp;p-&gt;lock);\n\/\/...<\/code><\/pre>\n\n\n\n<p>\u307e\u305f\u3001\u30d7\u30ed\u30bb\u30b9\u72b6\u614b\u3092\u6587\u5b57\u5217\u306b\u5bfe\u5fdc\u4ed8\u3051\u308b\u305f\u3081\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u95a2\u6570<code>stringstate()<\/code>\u3092\u8a2d\u8a08\u3057\u307e\u3057\u305f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">char* stringstate(int state){\n    char* states&#91;6]={\"unused\",\"sleeping\",\"runnable\",\"running\",\"zombie\",\"undefined\"};\n    return states&#91;state];\n}<\/code><\/pre>\n\n\n\n<p>2\u3064\u76ee\u306e\u60c5\u5831\u306b\u3064\u3044\u3066\u306f\u3001<code>exit()<\/code>\u95a2\u6570\u5185\u306e<code>reparent()<\/code>\u95a2\u6570\u3092\u53c2\u7167\u3059\u308b\u3053\u3068\u3067\u5b50\u30d7\u30ed\u30bb\u30b9\u306e\u89aa\u30d7\u30ed\u30bb\u30b9\u304c\u5909\u66f4\u3055\u308c\u308b\u30bf\u30a4\u30df\u30f3\u30b0\u3092\u7279\u5b9a\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/ Pass p's abandoned children to init.\n\/\/ Caller must hold p-&gt;lock.\nvoid reparent(struct proc *p) {\n  struct proc *pp;\n  \n  int child_num=0;\n  for (pp = proc; pp &lt; &amp;proc&#91;NPROC]; pp++) {\n    \/\/ this code uses pp-&gt;parent without holding pp-&gt;lock.\n    \/\/ acquiring the lock first could cause a deadlock\n    \/\/ if pp or a child of pp were also in exit()\n    \/\/ and about to try to lock p.\n    if (pp-&gt;parent == p) {\n      \/\/ pp-&gt;parent can't change between the check and the acquire()\n      \/\/ because only the parent changes it, and we're the parent.\n      acquire(&amp;pp-&gt;lock);\n      exit_info(\"proc %d exit, child %d, pid %d, name %s, state %s\\n\", p-&gt;pid, child_num++, pp-&gt;pid, pp-&gt;name, stringstate(pp-&gt;state));\n      pp-&gt;parent = initproc;\n      \/\/ we should wake up init here, but that would require\n      \/\/ initproc-&gt;lock, which would be a deadlock, since we hold\n      \/\/ the lock on one of init's children (pp). this is why\n      \/\/ exit() always wakes init (before acquiring any locks).\n      release(&amp;pp-&gt;lock);\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>\u3053\u306e\u30eb\u30fc\u30d7\u5185\u3067\u5b50\u30d7\u30ed\u30bb\u30b9\u60c5\u5831\u3092\u51fa\u529b\u3059\u308b\u3060\u3051\u3067\u3059\u3002\u81ea\u7136\u306b\u3001\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u7d42\u4e86\u3059\u308b\u969b\u306b\u306f\u89aa\u30d7\u30ed\u30bb\u30b9\u304c<code>init<\/code>\u3067\u3042\u308b\u60c5\u5831\u304c\u51fa\u529b\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-plaintext\">\/\/shell\n$ exittest\nexit test\nproc 3 exit, parent pid 2, name sh, state sleeping\nproc 3 exit, child 0, pid 4, name child0, state sleeping\nproc 3 exit, child 1, pid 5, name child1, state sleeping\nproc 3 exit, child 2, pid 6, name child2, state sleeping\n$ proc 4 exit, parent pid 1, name init, state runnable\nproc 5 exit, parent pid 1, name init, state runnable\nproc 6 exit, parent pid 1, name init, state running<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">(2) <strong><code>wait<\/code><strong>\u306e\u30c7\u30b6\u30a4\u30f3<\/strong><\/strong><\/h4>\n\n\n\n<p>\u6700\u521d\u306b<code>sysproc.c<\/code>\u3068<code>defs.h<\/code>\u3067<code>wait<\/code>\u95a2\u9023\u306e\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u767b\u9332\u3057\u3001\u95a2\u9023\u3059\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/defs.h\nint             wait(uint64, int);\n\/\/kernel\/sysproc.c\nuint64 sys_wait(void) {\n  uint64 p;\n  int nonblock;\n  if (argaddr(0, &amp;p) &lt; 0||argint(1, &amp;nonblock) &lt; 0) return -1;\n  return wait(p, nonblock);\n}<\/code><\/pre>\n\n\n\n<p>\u305d\u306e\u5f8c\u3001<code>wait<\/code>\u95a2\u6570\u3092\u5909\u66f4\u3057\u307e\u3059\u3002\u975e\u30d6\u30ed\u30c3\u30ad\u30f3\u30b0\u6a5f\u80fd\u3092\u8ffd\u52a0\u3059\u308b\u5834\u5408\u3001\u975e\u30d6\u30ed\u30c3\u30ad\u30f3\u30b0\u5f85\u6a5f\u304c\u547c\u3073\u51fa\u3055\u308c\u305f\u969b\u306b<code>sleep()<\/code>\u3067\u5f85\u6a5f\u3059\u308b\u524d\u306b\u30d7\u30ed\u30bb\u30b9\u30ed\u30c3\u30af\u3092\u89e3\u653e\u3059\u308c\u3070\u5341\u5206\u3067\u3059\u3002\u3053\u308c\u306f<code>wait()<\/code>\u306e\u5b9f\u88c5\u306b\u304a\u3044\u3066\u5b50\u30d7\u30ed\u30bb\u30b9\u304c\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u306e\u51e6\u7406\u65b9\u6cd5\u3068\u540c\u3058\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">int wait(uint64 addr, int nonblock) {\n\/\/...\n    \/\/ No point waiting if we don't have any children.\n    if (!havekids || p-&gt;killed) {\n      release(&amp;p-&gt;lock);\n      return -1;\n    }\n    \/\/ Non block wait\n    if (nonblock) {\n      release(&amp;p-&gt;lock);\n      return -1;\n    }\n    else\n    \/\/ Wait for a child to exit.\n    sleep(p, &amp;p-&gt;lock);  \/\/ DOC: wait-sleep\n  }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-plaintext\">\/\/shell\n$ waittest\nwait test\nno child exited yet, round 0\nno child exited yet, round 1\nno child exited yet, round 2\nproc 4 exit, parent pid 3, name waittest, state sleeping\nchild exited, pid 4\nwait test OK\nproc 3 exit, parent pid 2, name sh, state sleeping<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">(3) <strong><code>yield<\/code><strong>\u306e\u30c7\u30b6\u30a4\u30f3<\/strong><\/strong><br><\/h4>\n\n\n\n<p>\u8981\u6c42\u306b\u5f93\u3044\u3001<code>yieldtest<\/code>\u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0\u3068<code>yield<\/code>\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u767b\u9332\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/syscall.h\n#define SYS_yield  23\n\/\/kernel\/syscall.c\nextern uint64 sys_yield(void);\nstatic uint64 (*syscalls&#91;])(void) = {\n\/\/...\n&#91;SYS_yield] sys_yield,\n};\n\/\/user\/user.h\nint yield(void);\n\/\/user\/usys.pl\nentry(\"yield\")<\/code><\/pre>\n\n\n\n<p><br>\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u304c\u767a\u751f\u3059\u308b\u305f\u3073\u306b\u4ee5\u4e0b\u306e\u60c5\u5831\u3092\u51fa\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u30a2\u30c9\u30ec\u30b9\u7bc4\u56f2\uff08\u958b\u59cb\u30a2\u30c9\u30ec\u30b9\uff1a<code>&amp;(p-&gt;context)<\/code>\u3001\u7d42\u4e86\u30a2\u30c9\u30ec\u30b9\uff1a<code>(void*)&amp;(p-&gt;context) + sizeof(p-&gt;context)<\/code>\uff09\u3002<\/li>\n\n\n\n<li>\u73fe\u5728\u306e\u30d7\u30ed\u30bb\u30b9\u306e<code>pid<\/code>\u3068\u30e6\u30fc\u30b6\u30fc\u30e2\u30fc\u30c9\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u30ab\u30a6\u30f3\u30bf\uff08<code>pc<\/code>\u5024\uff09\u3002<br>\u3053\u306e\u5024\u306fECALL\u547d\u4ee4\u3092\u901a\u3058\u3066<code>epc<\/code>\u72b6\u614b\u30ec\u30b8\u30b9\u30bf\u306b\u4fdd\u5b58\u3055\u308c\u3001\u5272\u308a\u8fbc\u307f\u30d5\u30ec\u30fc\u30e0\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u6b21\u306b\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u308b\u30d7\u30ed\u30bb\u30b9\u306e<code>pid<\/code>\u3068\u305d\u306e\u30e6\u30fc\u30b6\u30fc\u30e2\u30fc\u30c9\u306e<code>pc<\/code>\u5024\u3002<br>\u30b0\u30ed\u30fc\u30d0\u30eb\u30d7\u30ed\u30bb\u30b9\u30c6\u30fc\u30d6\u30eb\u5185\u306e\u6b21\u306e<code>RUNNABLE<\/code>\u72b6\u614b\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u7279\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u3053\u306e\u30d7\u30ed\u30bb\u30b9\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">uint64 sys_yield(void) {\n  struct proc *p = myproc(), *p_yield = p;\n  acquire(&amp;p-&gt;lock);\n  printf(\"Save the context of the process to the memory region from address %p to %p\\n\", &amp;(p-&gt;context), (void*)&amp;(p-&gt;context)+sizeof(p-&gt;context));\n  printf(\"Current running process pid is %d and user pc is %p\\n\", p-&gt;pid, p-&gt;trapframe-&gt;epc);\n  release(&amp;p-&gt;lock);\n  int found = 0;\n  for (p = proc; p &lt; &amp;proc&#91;NPROC]; p = (++p == &amp;proc&#91;NPROC] ? proc : p)) {\n      if (p == p_yield) {if(found) break; else found = 1;} \n      else if (p-&gt;state == RUNNABLE &amp;&amp; found == 1) {\n        acquire(&amp;p-&gt;lock);\n        printf(\"Next runnable process pid is %d and user pc is %p\\n\", p-&gt;pid, p-&gt;trapframe-&gt;epc);\n        release(&amp;p-&gt;lock);\n        break;\n      }\n  }\n  yield();\n  return 0;\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-plaintext\">\/\/shell\n$ yieldtest\nyield test\nparent yield\nSave the context of the process to the memory region from address 0x0000000080012098 to 0x0000000080012108\nCurrent running process pid is 3 and user pc is 0x0000000000000416\nNext runnable process pid is 4 and user pc is 0x0000000000000366\nChild with PID 4 begins to run\nproc 4 exit, parent pid 3, name yieldtest, state runnable\nChild with PID 5 begins to run\nproc 5 exit, parent pid 3, name yieldtest, state runnable\nChild with PID 6 begins to run\nproc 6 exit, parent pid 3, name yieldtest, state runnable\nparent yield finished\nproc 3 exit, parent pid 2, name sh, state sleeping<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Lab 3 Lock<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u6b21\u306e\u8cea\u554f\u3092\u7b54\u3048\u3066\u306a\u3055\u3044<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.<strong><strong>\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306b\u3064\u3044\u3066\u306e\u8cea\u554f<\/strong><\/strong><\/h4>\n\n\n\n<dl class=\"swell-block-faq -icon-rounded is-style-faq-box\" data-q=\"fill-custom\" data-a=\"fill-custom\">\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">1. \u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u3068\u306f\u4f55\u3067\u3059\u304b\uff1f\u5f79\u5272\u306f\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\">\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306f\u3001\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u306e\u30ab\u30fc\u30cd\u30eb\u5185\u3067<span class=\"swl-marker mark_green\">\u7269\u7406\u30e1\u30e2\u30ea\u3092\u7ba1\u7406<\/span>\u3059\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u3059\u3002<br>\u305d\u306e\u5f79\u5272\u306f\u3001\u5272\u308a\u5f53\u3066\u6e08\u307f\u3068\u672a\u5272\u308a\u5f53\u3066\u306e\u30e1\u30e2\u30ea\u30d6\u30ed\u30c3\u30af\u3092\u8ffd\u8de1\u3057\u3001\u30e1\u30e2\u30ea\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u57fa\u3065\u3044\u3066\u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30bb\u30b9\u3001\u30ab\u30fc\u30cd\u30eb\u30b9\u30bf\u30c3\u30af\u3001\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3001\u305d\u306e\u4ed6\u306e\u30ab\u30fc\u30cd\u30eb\u304c\u5fc5\u8981\u3068\u3059\u308b\u30e1\u30e2\u30ea\u3092\u30da\u30fc\u30b8\u5358\u4f4d\u3067\u5272\u308a\u5f53\u3066\u305f\u308a\u89e3\u653e\u3057\u305f\u308a\u3059\u308b\u3053\u3068\u3067\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30b7\u30b9\u30c6\u30e0\u304c\u7269\u7406\u30e1\u30e2\u30ea\u3092\u52b9\u7387\u7684\u306b\u4f7f\u7528\u3067\u304d\u3001\u30e1\u30e2\u30ea\u306e\u65ad\u7247\u5316\u304c\u904e\u5ea6\u306b\u84c4\u7a4d\u3055\u308c\u308b\u306e\u3092\u9632\u304e\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">2. \u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306e\u30c7\u30fc\u30bf\u69cb\u9020\u306f\uff1f\u305d\u306e\u4e0a\u306e\u64cd\u4f5c\uff08\u95a2\u6570\uff09\u306b\u306f\u3069\u306e\u3088\u3046\u306a\u3082\u306e\u304c\u3042\u308a\u3001\u305d\u308c\u305e\u308c\u3069\u306e\u3088\u3046\u306a\u6a5f\u80fd\u3092\u679c\u305f\u3057\u3066\u3044\u307e\u3059\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\">\u30c7\u30fc\u30bf\u69cb\u9020:<br><code>struct run<\/code>: \u30ea\u30b9\u30c8\u30ce\u30fc\u30c9\u3001<span class=\"swl-marker mark_green\">\u7a7a\u304d\u30e1\u30e2\u30ea\u30da\u30fc\u30b8<\/span>\u3092\u8868\u3057\u3001<span class=\"swl-marker mark_green\">\u6b21\u306e\u7a7a\u30da\u30fc\u30b8\u3092\u6307\u3059\u30dd\u30a4\u30f3\u30bf<code>next<\/code><\/span>\u3092\u542b\u3093\u3067\u3044\u307e\u3059\u3002<br><code>kmem[NCPU]<\/code>: \u5404CPU\u30b3\u30a2\u306b\u306f1\u3064\u306e<code>kmem<\/code>\u69cb\u9020\u4f53\u304c\u3042\u308a\u3001\u305d\u306e\u4e2d\u306b\u306f<span class=\"swl-marker mark_green\">\u30b9\u30d4\u30f3\u30ed\u30c3\u30af<\/span><code>lock<\/code>\u3068<span class=\"swl-marker mark_green\">\u7a7a\u304d\u30da\u30fc\u30b8\u30ea\u30b9\u30c8\u306e\u30d8\u30c3\u30c9\u30dd\u30a4\u30f3\u30bf<\/span><code>freelist<\/code>\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<br>\u64cd\u4f5c\uff08\u95a2\u6570\uff09:<br><code>kalloc()<\/code>: <span class=\"swl-marker mark_green\">\u7a7a\u304d\u30da\u30fc\u30b8\u30ea\u30b9\u30c8\u304b\u30891\u30da\u30fc\u30b8\u3092\u5272\u308a\u5f53\u3066<\/span>\u307e\u3059\u3002\u5272\u308a\u5f53\u3066\u304c\u6210\u529f\u3059\u308c\u3070\u30da\u30fc\u30b8\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u8fd4\u3057\u3001\u5931\u6557\u3059\u308c\u30700\u3092\u8fd4\u3057\u307e\u3059\u3002<br><code>kinit()<\/code>: <span class=\"swl-marker mark_green\">\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u3092\u521d\u671f\u5316<\/span>\u3057\u307e\u3059\u3002\u30b0\u30ed\u30fc\u30d0\u30eb\u7a7a\u304d\u30e1\u30e2\u30ea\u30ea\u30b9\u30c8\u306b\u30ed\u30c3\u30af\u3092\u304b\u3051\u3001<code>freerange()<\/code>\u3092\u547c\u3073\u51fa\u3057\u3066<span class=\"swl-marker mark_green\">\u30e6\u30fc\u30b6\u30fc\u53ef\u7528\u30a2\u30c9\u30ec\u30b9\u7bc4\u56f2\u5185\u306e\u7269\u7406\u30e1\u30e2\u30ea\u30da\u30fc\u30b8\u3092\u89e3\u653e<\/span>\u3057\u307e\u3059\u3002<br><code>freerange(void *pa_start, void *pa_end)<\/code>: <span class=\"swl-marker mark_green\">\u6307\u5b9a\u3055\u308c\u305f\u7bc4\u56f2<\/span>\u5185\u306e\u7269\u7406\u30e1\u30e2\u30ea\u30da\u30fc\u30b8\u3092\u30da\u30fc\u30b8\u5358\u4f4d\u3067\u89e3\u653e\u3057\u3001\u5404\u30da\u30fc\u30b8\u3092<code>kfree()<\/code>\u3092\u4f7f\u3063\u3066\u30b0\u30ed\u30fc\u30d0\u30eb\u7a7a\u304d\u30da\u30fc\u30b8\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3057\u307e\u3059\u3002<br><code>kfree(void *pa)<\/code>: <span class=\"swl-marker mark_green\">\u5358\u4e00\u306e\u7269\u7406\u30e1\u30e2\u30ea\u30da\u30fc\u30b8\u3092\u89e3\u653e\u3057\u3001\u305d\u306e\u30da\u30fc\u30b8\u3092\u7a7a\u304d\u30da\u30fc\u30b8\u30ea\u30b9\u30c8\u306b\u633f\u5165\u3057\u307e\u3059<\/span>\u3002\u307e\u305f\u3001\u30da\u30fc\u30b8\u30a2\u30c9\u30ec\u30b9\u306e\u30a2\u30e9\u30a4\u30e1\u30f3\u30c8\u306a\u3069\u3092\u78ba\u8a8d\u3057\u3066\u30da\u30fc\u30b8\u306e\u6709\u52b9\u6027\u3092\u4fdd\u8a3c\u3057\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">3. \u306a\u305c\u30ac\u30a4\u30c9\u30d6\u30c3\u30af\u3067\u63d0\u6848\u3055\u308c\u3066\u3044\u308b\u6700\u9069\u5316\u65b9\u6cd5\u304c\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u306e\u3067\u3057\u3087\u3046\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\">\u5404CPU\u30b3\u30a2\u304c\u72ec\u7acb\u3057\u305f\u7a7a\u304d\u30e1\u30e2\u30ea\u30da\u30fc\u30b8\u30ea\u30b9\u30c8\u3092\u6301\u3064\u3053\u3068\u3067\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u5411\u4e0a\u3059\u308b\u4e3b\u306a\u7406\u7531\u306f\u3001<span class=\"swl-marker mark_green\">\u30ed\u30c3\u30af\u7af6\u5408\u306e\u524a\u6e1b<\/span>\u3067\u3059\u3002\u8907\u6570\u306eCPU\u30b3\u30a2\u304c\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306b\u540c\u6642\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u5834\u5408\u3001\u5171\u6709\u306e\u7a7a\u304d\u30e1\u30e2\u30ea\u30ea\u30b9\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u3068\u3001\u3059\u3079\u3066\u306eCPU\u304c\u30ea\u30b9\u30c8\u306b\u30ed\u30c3\u30af\u3092\u304b\u3051\u308b\u5fc5\u8981\u304c\u3042\u308a\u3001\u3053\u306e\u3053\u3068\u304c\u983b\u7e41\u306a\u30ed\u30c3\u30af\u7af6\u5408\u3092\u5f15\u304d\u8d77\u3053\u3057\u307e\u3059\u3002\u7279\u306b\u30de\u30eb\u30c1\u30b3\u30a2\u30b7\u30b9\u30c6\u30e0\u3067\u306f\u3001\u30ed\u30c3\u30af\u7af6\u5408\u304c\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u5927\u304d\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u307e\u3059\u3002\u72ec\u7acb\u3057\u305f\u30ea\u30b9\u30c8\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5404CPU\u30b3\u30a2\u304c\u81ea\u5206\u306e\u30e1\u30e2\u30ea\u3092\u7ba1\u7406\u3067\u304d\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u30ed\u30c3\u30af\u3092\u907f\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u3001\u4e26\u5217\u6027\u3068\u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u5927\u5e45\u306b\u5411\u4e0a\u3057\u307e\u3059\u3002<br>\u5b9f\u969b\u3001\u30ed\u30fc\u30ab\u30eb\u306a\u30e1\u30e2\u30ea\u7ba1\u7406\u3092\u7dad\u6301\u3059\u308b\u3053\u3068\u3067\u3001CPU\u9593\u3067\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u4e00\u8cab\u6027\u901a\u4fe1\u3092\u6e1b\u3089\u3057\u3001\u30e1\u30e2\u30ea\u306e\u5272\u308a\u5f53\u3066\u3068\u89e3\u653e\u306e\u52b9\u7387\u304c\u3055\u3089\u306b\u5411\u4e0a\u3057\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n<\/dl>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2.&nbsp;<strong>\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u3064\u3044\u3066\u306e\u8cea\u554f<\/strong><\/h4>\n\n\n\n<dl class=\"swell-block-faq -icon-rounded is-style-faq-box\" data-q=\"fill-custom\" data-a=\"fill-custom\">\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">1. \u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u306f\u4f55\u3067\u3059\u304b\uff1f\u5f79\u5272\u306f\uff1f<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\">\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u306f\u3001<span class=\"swl-marker mark_green\">\u30c7\u30a3\u30b9\u30af\u4e0a\u306e\u30c7\u30fc\u30bf\u30d6\u30ed\u30c3\u30af\u3092\u4e00\u6642\u7684\u306b\u30e1\u30e2\u30ea\u306b\u683c\u7d0d<\/span>\u3059\u308b\u6280\u8853\u3067\u3059\u3002<br>\u3053\u308c\u306b\u3088\u308a\u3001\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u66f8\u304d\u64cd\u4f5c\u304c\u52a0\u901f\u3055\u308c\u307e\u3059\u3002\u6700\u8fd1\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u30c7\u30a3\u30b9\u30af\u30c7\u30fc\u30bf\u30d6\u30ed\u30c3\u30af\u3092\u30e1\u30e2\u30ea\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u3053\u3068\u3067\u3001\u30c7\u30a3\u30b9\u30afI\/O\u64cd\u4f5c\u306e\u983b\u5ea6\u3092\u6e1b\u3089\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u671f\u5f85\u3055\u308c\u307e\u3059\u3002\u5177\u4f53\u7684\u306b\u306f\u4ee5\u4e0b\u306e\u70b9\u3067\u52b9\u679c\u304c\u3042\u308a\u307e\u3059\uff1a<br><span class=\"swl-marker mark_green\">\u30c7\u30fc\u30bf\u306e\u4e00\u8cab\u6027\u3092\u7dad\u6301<\/span>\uff1a\u8907\u6570\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u540c\u6642\u306b\u540c\u3058\u30c7\u30a3\u30b9\u30af\u30d6\u30ed\u30c3\u30af\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3082\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u5185\u306e\u30c7\u30fc\u30bf\u304c\u4e00\u8cab\u6027\u3092\u4fdd\u3064\u3088\u3046\u306b\u3057\u3001\u7af6\u5408\u3092\u907f\u3051\u307e\u3059\u3002<br><span class=\"swl-marker mark_green\">\u8aad\u307f\u53d6\u308a\u901f\u5ea6\u306e\u5411\u4e0a<\/span>\uff1a\u3088\u304f\u4f7f\u308f\u308c\u308b\u30c7\u30a3\u30b9\u30af\u30d6\u30ed\u30c3\u30af\u3092\u30e1\u30e2\u30ea\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u3053\u3068\u3067\u3001\u983b\u7e41\u306a\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a\u3092\u907f\u3051\u3001\u8aad\u307f\u53d6\u308a\u52b9\u7387\u3092\u9ad8\u3081\u307e\u3059\u3002<br><span class=\"swl-marker mark_green\">\u66f8\u304d\u8fbc\u307f\u9045\u5ef6\u306e\u6e1b\u5c11<\/span>\uff1a\u30c7\u30a3\u30b9\u30af\u30d6\u30ed\u30c3\u30af\u306e\u5909\u66f4\u306f\u30ad\u30e3\u30c3\u30b7\u30e5\u5185\u3067\u884c\u3044\u3001\u5f8c\u3067\u307e\u3068\u3081\u3066\u30c7\u30a3\u30b9\u30af\u306b\u66f8\u304d\u8fbc\u3080\u3053\u3068\u3067\u3001\u66f8\u304d\u8fbc\u307f\u6642\u306e\u5f85\u6a5f\u6642\u9593\u3092\u6e1b\u3089\u3057\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">2. \u306a\u305c<code>buf<\/code>\u69cb\u9020\u4f53\u306b\u306f<code>prev<\/code>\u3068<code>next<\/code>\u3068\u3044\u30462\u3064\u306e\u30e1\u30f3\u30d0\u304c\u3042\u308b\u306e\u3067\u3057\u3087\u3046\u304b\uff1f\u305d\u308c\u3089\u306e\u5229\u70b9\u3092\u5206\u6790\u3057\u3066\u304f\u3060\u3055\u3044\uff08\u30d2\u30f3\u30c8\uff1a2\u3064\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u4f7f\u3063\u3066\u30ea\u30b9\u30c8\u3092\u8d70\u67fb\u3059\u308b\u5177\u4f53\u7684\u306a\u30b7\u30ca\u30ea\u30aa\u3092\u8003\u3048\u3066\u307f\u3066\u304f\u3060\u3055\u3044\uff09\u3002<br><\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\"><code>buf<\/code>\u69cb\u9020\u4f53\u306e<code>prev<\/code>\u3068<code>next<\/code>\u306f\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u53cc\u65b9\u5411\u306e\u5faa\u74b0\u30ea\u30b9\u30c8\u306b\u30ea\u30f3\u30af\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002\u53cc\u65b9\u5411\u30ea\u30b9\u30c8\u306e\u8a2d\u8a08\u306f\u3001\u30ea\u30b9\u30c8\u306e\u4e21\u7aef\u304b\u3089\u8d70\u67fb\u3067\u304d\u308b\u3053\u3068\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002<span class=\"swl-marker mark_green\">LRU\uff08\u6700\u5c0f\u4f7f\u7528\u983b\u5ea6\uff09\u30d6\u30ed\u30c3\u30af\u3092\u63a2\u3059\u5834\u5408\u3001\u30ea\u30b9\u30c8\u306e\u672b\u5c3e\u304b\u3089\u63a2\u7d22<\/span>\u3092\u59cb\u3081\u308b\u5fc5\u8981\u304c\u3042\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002<span class=\"swl-marker mark_green\">\u666e\u901a\u3067\u3001\u30ed\u30fc\u30c9\u3055\u308c\u305f\u30d6\u30ed\u30c3\u30af\u3092\u63a2\u3059\u3053\u3068\u306b\u306f\u3001\u30ea\u30b9\u30c8\u5148\u982d\u304b\u3089\u3067\u3044\u3044\u3002<\/span><br>\u53cc\u65b9\u5411\u30ea\u30b9\u30c8\u306f\u53cc\u65b9\u5411\u8d70\u67fb\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u304c\u3001\u5358\u65b9\u5411\u30ea\u30b9\u30c8\u3067\u306f\u30ea\u30b9\u30c8\u306e\u5148\u982d\u304b\u3089\u3057\u304b\u904d\u6b74\u3067\u304d\u305a\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">3. \u30cf\u30c3\u30b7\u30e5\u30c6\u30fc\u30d6\u30eb\u304c\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u7406\u7531\u306f\u4f55\u3067\u3059\u304b\uff1f\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306e\u6700\u9069\u5316\u65b9\u6cd5\u3092\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6700\u9069\u5316\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u3059\u304b\uff1f\u305d\u306e\u7406\u7531\u3092\u8aac\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br><\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\">\u30cf\u30c3\u30b7\u30e5\u30c6\u30fc\u30d6\u30eb\u304c\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5411\u4e0a\u3055\u305b\u308b\u7406\u7531\u306f\u4e3b\u306b\u4ee5\u4e0b\u3067\u3059\uff1a<br>1. <span class=\"swl-marker mark_green\">\u9ad8\u901f\u306a\u691c\u7d22<\/span>\u3068<span class=\"swl-marker mark_green\">\u885d\u7a81\u306e\u524a\u6e1b<\/span>\uff1a\u30ea\u30b9\u30c8\u3092\u8d70\u67fb\u3059\u308b\u4ee3\u308f\u308a\u306b\u3001\u30cf\u30c3\u30b7\u30e5\u30c6\u30fc\u30d6\u30eb\u306f\u30d6\u30ed\u30c3\u30af\u756a\u53f7<code>blockno<\/code>\u3092\u30cf\u30c3\u30b7\u30e5\u5024\u306b\u30de\u30c3\u30d4\u30f3\u30b0\u3057\u3066\u3001\u5bfe\u5fdc\u3059\u308b\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u9ad8\u901f\u306b\u691c\u7d22\u3067\u304d\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30ea\u30b9\u30c8\u3092\u8d70\u67fb\u3059\u308b\u8907\u96d1\u3055\u304c\u6e1b\u308a\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u306e\u691c\u7d22\u52b9\u7387\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002\u3055\u3089\u306b\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u306e\u691c\u7d22\u3084\u7f6e\u63db\u306e\u969b\u306e\u885d\u7a81\u304c\u6e1b\u5c11\u3057\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30a2\u30af\u30bb\u30b9\u52b9\u7387\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002<br>2. <span class=\"swl-marker mark_green\">\u4e26\u884c\u51e6\u7406<\/span>\u306e\u5b9f\u73fe\uff1a\u30cf\u30c3\u30b7\u30e5\u30d0\u30b1\u30c4\u3092\u4f7f\u7528\u3057\u3001\u5404\u30d0\u30b1\u30c4\u306b\u72ec\u7acb\u3057\u305f\u30ed\u30c3\u30af\u3092\u5272\u308a\u5f53\u3066\u308b\u3053\u3068\u3067\u3001\u7570\u306a\u308b\u30d7\u30ed\u30bb\u30b9\u304c\u7570\u306a\u308b\u30cf\u30c3\u30b7\u30e5\u30d0\u30b1\u30c4\u5185\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u4e26\u884c\u3057\u3066\u64cd\u4f5c\u3067\u304d\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u30ed\u30c3\u30af\u306b\u3088\u308b\u9ad8\u3044\u30ed\u30c3\u30af\u7af6\u5408\u306e\u554f\u984c\u3092\u6e1b\u5c11\u3055\u305b\u307e\u3059\u3002<br>\u4e00\u65b9\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u30ea\u30b9\u30c8\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u3001\u3059\u3079\u3066\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u64cd\u4f5c\u304c\u30b0\u30ed\u30fc\u30d0\u30eb\u30ed\u30c3\u30af\u3092\u4f7f\u3063\u3066\u540c\u671f\u3055\u308c\u308b\u5fc5\u8981\u304c\u3042\u308a\u3001\u30ed\u30c3\u30af\u7af6\u5408\u304c\u767a\u751f\u3057\u3084\u3059\u304f\u306a\u308a\u307e\u3059\u3002<br>\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306e\u6700\u9069\u5316\u65b9\u6cd5\u3092\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u306b<span class=\"swl-marker mark_orange\">\u5b8c\u5168\u306b\u9069\u7528<\/span>\u3059\u308b\u3053\u3068\u306f<span class=\"swl-marker mark_green\">\u3067\u304d\u307e\u305b\u3093<\/span>\u3002\u307e\u305a\u3001CPU\u30ea\u30bd\u30fc\u30b9\u3068\u30da\u30fc\u30b8\u5358\u4f4d\u306e\u30e1\u30e2\u30ea\u30ea\u30bd\u30fc\u30b9\u306f\u30d7\u30ed\u30bb\u30b9\u306b\u3088\u3063\u3066\u76f8\u5bfe\u7684\u306b\u72ec\u7acb\u3057\u3066\u4f7f\u7528\u3067\u304d\u307e\u3059\u304c\u3001\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u306f\u8907\u6570\u306eCPU\u3067\u5b9f\u884c\u3055\u308c\u308b\u30d7\u30ed\u30bb\u30b9\u9593\u3067\u5171\u6709\u3055\u308c\u308b\u5fc5\u8981\u304c\u3042\u308b\u305f\u3081\u3001\u5358\u7d14\u7684\u306bCPU\u306e\u6570\u3067\u30c7\u30a3\u30b9\u30af\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5206\u5272\u3059\u308b\u3053\u3068\u306f\u610f\u5473\u304c\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\n<\/dd><\/div>\n<\/dl>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e8c. \u30b3\u30fc\u30c9\u30c7\u30b6\u30a4\u30f3<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">(1) <strong>\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306e\u30c7\u30b6\u30a4\u30f3<\/strong><\/h4>\n\n\n\n<p>\u3053\u306e\u30bf\u30b9\u30af\u306e\u6982\u8981\u306f\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u3067\u3042\u308b <code>kmem<\/code> \u3092\u8907\u6570\u306e\u90e8\u5206\u306b\u5206\u5272\u3057\u3001\u305d\u308c\u305e\u308c\u306e\u90e8\u5206\u3092\u5404CPU\u306b\u5272\u308a\u5f53\u3066\u308b\u3053\u3068\u3067\u3059\u3002\u8a00\u3044\u63db\u3048\u308c\u3070\u3001\u5404CPU\u306f\u72ec\u81ea\u306e\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u3092\u6301\u3064\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<br>\u5404\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306b\u306f\u3001\u521d\u671f\u5316\u3001\u30da\u30fc\u30b8\u306e\u5272\u5f53\u3001\u304a\u3088\u3073\u30da\u30fc\u30b8\u306e\u89e3\u653e\u6a5f\u80fd\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<p>\ud83c\udf1f<strong>\u521d\u671f\u5316<\/strong><br>\u307e\u305a\u3001CPU\u306e\u6570\u3068\u540c\u3058\u6570\u306e <code>kmem<\/code> \u69cb\u9020\u4f53\u3092\u5b9a\u7fa9\u3057\u3001\u3053\u308c\u3089\u304c\u4ee5\u524d\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u3092\u7f6e\u304d\u63db\u3048\u308b\u5f62\u306b\u3057\u307e\u3059\u3002\u305d\u3057\u3066\u3001<code>kinit()<\/code> \u95a2\u6570\u5185\u3067\u305d\u308c\u3089\u3092\u521d\u671f\u5316\u3057\u307e\u3059\u3002\u3053\u3053\u3067\u306f\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306e\u521d\u671f\u5316\u624b\u9806\u3092\u53c2\u8003\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6700\u5f8c\u306b\u3001\u7a7a\u3044\u3066\u3044\u308b\u30e1\u30e2\u30ea\u3092 <code>freerange<\/code> \u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u308bCPU\u306b\u5272\u308a\u5f53\u3066\u307e\u3059\u3002\u4e00\u822c\u7684\u306b\u3001\u3053\u308c\u306fCPU0\u3067\u3042\u308b\u3079\u304d\u3067\u3059\u3002\u3053\u306e\u3088\u3046\u306b\u3059\u308b\u3053\u3068\u3067\u3001<code>freerange<\/code> \u95a2\u6570\u3092\u5909\u66f4\u3059\u308b\u5fc5\u8981\u304c\u306a\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/kalloc.c\nstruct {\n  struct spinlock lock;\n  struct run *freelist;\n} kmem&#91;NCPU];\nvoid kinit()\n{\n  char s&#91;10];\n  for(int i = 0; i &lt; NCPU; i++){\n    snprintf(s, 10, \"kmem %d\", i); \/\/Lock name with cpuid\n    initlock(&amp;kmem&#91;i].lock, s);\n  }\n  freerange(end, (void*)PHYSTOP); \/\/free mem for a core\n}<\/code><\/pre>\n\n\n\n<p>\ud83c\udf1f<strong>\u30da\u30fc\u30b8\u306e\u5272\u5f53<\/strong><br>\u6b21\u306b<code>kalloc()<\/code> \u3002\u3059\u3067\u306b\u30b0\u30ed\u30fc\u30d0\u30eb\u30e1\u30e2\u30ea\u30a2\u30ed\u30b1\u30fc\u30bf\u306f\u8907\u6570\u306e\u90e8\u5206\u306b\u5206\u5272\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u307e\u305a\u3001\u3069\u306eCPU\u304c\u30e1\u30e2\u30ea\u3092\u8981\u6c42\u3057\u3066\u3044\u308b\u304b\u3092\u78ba\u8a8d\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u8981\u6c42\u3055\u308c\u305fCPU\u306e\u30e1\u30e2\u30ea\u7a7a\u9593\u304b\u3089\u30e1\u30e2\u30ea\u3092\u78ba\u4fdd\u3057\u3088\u3046\u3068\u8a66\u307f\u307e\u3059\u3002\u3053\u306e\u9593\u306f\u30ed\u30c3\u30af\u3092\u4fdd\u6301\u3057\u307e\u3059\u3002\u3082\u3057\u3001CPU\u304c\u5229\u7528\u53ef\u80fd\u306a\u30e1\u30e2\u30ea\u9818\u57df\u3092\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u305f\u3089\u3001\u305d\u306e\u30e1\u30e2\u30ea\u3092\u5272\u308a\u5f53\u3066\u3001\u30ed\u30c3\u30af\u3092\u89e3\u653e\u3057\u3066\u30e1\u30e2\u30ea\u3092\u521d\u671f\u5316\u3057\u307e\u3059\u3002\u3053\u306e\u30ed\u30b8\u30c3\u30af\u306f\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u5b8c\u5168\u306b\u540c\u3058\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3082\u3057\u3001\u8981\u6c42\u3055\u308c\u305fCPU\u306e\u7a7a\u304d\u30da\u30fc\u30b8\u30ea\u30b9\u30c8\u306b\u7a7a\u304d\u304c\u306a\u3044\u5834\u5408\u3001\u4ed6\u306eCPU\u304b\u3089\u30e1\u30e2\u30ea\u3092\u596a\u3046\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002\u307e\u305a\u3001\u73fe\u5728\u4fdd\u6301\u3057\u3066\u3044\u308b\u30ed\u30c3\u30af\u3092\u89e3\u653e\u3057\u3001\u3069\u306eCPU\u304c\u7a7a\u304d\u30e1\u30e2\u30ea\u3092\u6301\u3063\u3066\u3044\u308b\u304b\u3092\u30eb\u30fc\u30d7\u3067\u78ba\u8a8d\u3057\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u81ea\u5206\u306b\u5bfe\u3059\u308b\u518d\u30c1\u30a7\u30c3\u30af\u306f\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002\u4ed6\u306eCPU\u3092\u78ba\u8a8d\u3059\u308b\u969b\u306b\u306f\u3001\u305d\u306eCPU\u306e\u30ed\u30c3\u30af\u3092\u4fdd\u6301\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u7a7a\u304d\u30e1\u30e2\u30ea\u304c\u898b\u3064\u304b\u308c\u3070\u3001\u305d\u308c\u3092\u5272\u308a\u5f53\u3066\u307e\u3059\u3002\u3082\u3057\u898b\u3064\u304b\u3089\u306a\u3051\u308c\u3070\u3001\u6b21\u306eCPU\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u3059\u3079\u3066\u306eCPU\u306b\u7a7a\u304d\u30e1\u30e2\u30ea\u304c\u306a\u3051\u308c\u3070\u30010\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/kalloc.c\nvoid* kalloc(void)\n{\n  struct run *r;\n\n  \/\/ cpuid now:\n  push_off();\n  int CPUID = cpuid();\n  pop_off();\n  \n  \/\/ Try to get mem from CPUID space\n  acquire(&amp;kmem&#91;CPUID].lock);\n  r = kmem&#91;CPUID].freelist;\n  if(r){\n    kmem&#91;CPUID].freelist = r-&gt;next;\n    release(&amp;kmem&#91;CPUID].lock);\n    memset((char*)r, 5, PGSIZE); \/\/ fill with junk\n    return (void*)r;\n  }\n  else {\/\/ No space on CPUID, steal\n    release(&amp;kmem&#91;CPUID].lock);\n    for(int i = 0; i &lt; NCPU; i++){\n      if(i==CPUID) continue;\n      acquire(&amp;kmem&#91;i].lock);\n      r= kmem&#91;i].freelist;\n      if(r){\n        kmem&#91;i].freelist = r-&gt;next;\n        release(&amp;kmem&#91;i].lock);\n        memset((char*)r, 5, PGSIZE); \/\/ fill with junk\n        return (void*)r;\n      }\n      else release(&amp;kmem&#91;i].lock); \n    }\n    return 0;\n  }\n}<\/code><\/pre>\n\n\n\n<p>\ud83c\udf1f<strong>\u30da\u30fc\u30b8\u306e\u89e3\u653e<\/strong><br><code>kfree()<\/code> \u3001\u5b9f\u969b\u306b\u306f\u3001\u3069\u306eCPU\u304c <code>kfree()<\/code> \u3092\u547c\u3073\u51fa\u3057\u305f\u304b\u3092\u78ba\u8a8d\u3057\u3001\u305d\u306e\u30da\u30fc\u30b8\u3092\u305d\u306eCPU\u306e\u7a7a\u304d\u30da\u30fc\u30b8\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3059\u308b\u3060\u3051\u3067\u3059\u3002\u30ed\u30b8\u30c3\u30af\u306f\u3001\u5143\u306e <code>kfree()<\/code> \u3068\u5b8c\u5168\u306b\u540c\u3058\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/kalloc.c\nvoid kfree(void *pa)\n{\n  struct run *r;\n\n  if(((uint64)pa % PGSIZE) != 0 || (char*)pa &lt; end || (uint64)pa &gt;= PHYSTOP)\n    panic(\"kfree\");\n\n  \/\/ Fill with junk to catch dangling refs.\n  memset(pa, 1, PGSIZE);\n\n  r = (struct run*)pa;\n\n  \/\/ cpuid now:\n  push_off();\n  int CPUID = cpuid();\n  pop_off();\n  \/\/ free mem:\n  acquire(&amp;kmem&#91;CPUID].lock);\n  r-&gt;next = kmem&#91;CPUID].freelist;\n  kmem&#91;CPUID].freelist = r;\n  release(&amp;kmem&#91;CPUID].lock);\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">(2) <strong>Buffer Cache \u306e\u30c7\u30b6\u30a4\u30f3<\/strong><\/h4>\n\n\n\n<p>\u3053\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u306f\u3001\u30cf\u30c3\u30b7\u30e5\u30d0\u30b1\u30c3\u30c8\u3068\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u305a\u3001\u30cf\u30c3\u30b7\u30e5\u30d0\u30b1\u30c3\u30c8\u3092\u5b9f\u88c5\u3057\u3001<code>bcache<\/code>\uff08\u30ad\u30e3\u30c3\u30b7\u30e5\uff09\u306b\u30ed\u30c3\u30af\u3068\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u4ed8\u304d\u306e\u30d0\u30b1\u30c3\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u3001LRU\uff08\u6700\u3082\u9577\u304f\u4f7f\u308f\u308c\u3066\u3044\u306a\u3044\uff09\u3092\u691c\u7d22\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002\u305d\u3057\u3066\u3001<code>binit()<\/code> \u95a2\u6570\u5185\u3067\u305d\u308c\u3092\u521d\u671f\u5316\u3057\u307e\u3059\u3002\u3053\u306e\u30ed\u30b8\u30c3\u30af\u306f\u3001\u5143\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306b\u4f3c\u3066\u3044\u307e\u3059\u304c\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u30ed\u30c3\u30af\u306e\u521d\u671f\u5316\u306b\u52a0\u3048\u3066\u3001\u30d0\u30b1\u30c3\u30c8\u3068\u30d0\u30b1\u30c3\u30c8\u30ed\u30c3\u30af\u3082\u521d\u671f\u5316\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u521d\u671f\u306e\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306b\u306f0\u3092\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kerner\/buf.h:struct buf {...\n  int timestamp;\n};\n\n\/\/kernel\/bio.c\nextern uint ticks;\n\n#define NBUCKET 13\nstruct {\n  struct spinlock lock;\n  struct buf buf&#91;NBUF];\n\n  \/\/ Linked list of all buffers, through prev\/next.\n  \/\/ Sorted by how recently the buffer was used.\n  \/\/ headOfbucket.next is most recent, head.prev is least.\n  struct buf headOfbucket&#91;NBUCKET]; \/\/Add buckets\n  struct spinlock lockOf&#91;NBUCKET];  \/\/Add buckets' locks.\n} bcache;\n\nvoid binit(void)\n{\n  struct buf *b;\n\/\/ INIT bcache\n  initlock(&amp;bcache.lock, \"bcache X\");  \/\/bcache lock\n  char s&#91;10];\n  for(int i = 0; i &lt; NBUCKET; i++){\n    snprintf(s, 10, \"bcache %d\", i); \/\/Lock name with bucketid\n    initlock(&amp;bcache.lockOf&#91;i], s);  \/\/bucket lock\n    bcache.headOfbucket&#91;i].next = &amp;bcache.headOfbucket&#91;i]; \/\/Ringed Linked List\n    bcache.headOfbucket&#91;i].prev = &amp;bcache.headOfbucket&#91;i]; \/\/Ringed Linked List\n  }\n\/\/FIRSTLY we should place the blocks to a certain place.\n  for(int i = 0; i &lt; NBUF; i++){\n    b = &amp;bcache.buf&#91;i];        \/\/At least 1 cpu:0\n    initsleeplock(&amp;b-&gt;lock, \"buffer lk\");  \/\/Lock\n    b-&gt;next = bcache.headOfbucket&#91;0].next; \/\/Link After\n    b-&gt;prev = &amp;bcache.headOfbucket&#91;0];     \/\/Link Head\n    bcache.headOfbucket&#91;0].next-&gt;prev = b; \/\/After Link Me\n    bcache.headOfbucket&#91;0].next = b;       \/\/Head Link Me\n    b-&gt;refcnt = 0;                         \/\/No reference at first\n    b-&gt;timestamp = 0;                      \/\/0 at beginning\n  }\n\/\/ headOfbucket&#91;0]:29-&gt;28-&gt;...-&gt;3-&gt;2-&gt;1-&gt;0-&gt;29\n\/\/ headOfbucket&#91;1]:NULL\n\/\/ ...\n\/\/ headOfbucket&#91;12]:NULL\n}<\/code><\/pre>\n\n\n\n<p><strong>bget()\u95a2\u6570<\/strong><br>\u307e\u305a\u3001\u30d6\u30ed\u30c3\u30af\u756a\u53f7\u3092\u8a08\u7b97\u3057\u3066\u5f97\u3089\u308c\u308b\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u30d0\u30b1\u30c3\u30c8\u756a\u53f7\u3068\u3057\u3066\u4f7f\u7528\u3057\u3066\u3001\u8a72\u5f53\u3059\u308b\u30d0\u30b1\u30c3\u30c8\u3092\u691c\u7d22\u3057\u307e\u3059\u3002<br>\u53d6\u5f97\u3057\u305f\u30d0\u30b1\u30c3\u30c8\u3092\u30ed\u30c3\u30af\u3057\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30d2\u30c3\u30c8\u3092\u78ba\u8a8d\u3059\u308b\u969b\u306e\u30a2\u30c8\u30df\u30c3\u30af\u6027\u3092\u78ba\u4fdd\u3057\u307e\u3059\u3002\u3082\u3057\u691c\u7d22\u3059\u308b\u30d6\u30ed\u30c3\u30af\u304c\u3059\u3067\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u3001\u305d\u306e\u53c2\u7167\u30ab\u30a6\u30f3\u30c8\u3092\u30a4\u30f3\u30af\u30ea\u30e1\u30f3\u30c8\u3057\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u30b9\u30ea\u30fc\u30d7\u30ed\u30c3\u30af\u3067\u30ed\u30c3\u30af\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/bio.c\n\/\/ Part 1 Start\n\/\/...\nuint hash(uint blockno){return blockno % NBUCKET;}\n\/\/...\n\/\/ Look through buffer cache for block on device dev.\n\/\/ If not found, allocate a buffer.\n\/\/ In either case, return locked buffer.\nstatic struct buf* bget(uint dev, uint blockno)\n{\n  struct buf *b;\n\n  uint hashval = hash(blockno);\n\n  \/\/ First, try to find the buffer in the target bucket.\n  acquire(&amp;bcache.lockOf&#91;hashval]); \/\/ Lock the target bucket.\n\n  \/\/ Is the block already cached?\n  for(b = bcache.headOfbucket&#91;hashval].next; b != &amp;bcache.headOfbucket&#91;hashval]; b = b-&gt;next){\n    if(b-&gt;dev == dev &amp;&amp; b-&gt;blockno == blockno){\n      b-&gt;refcnt++;\n      release(&amp;bcache.lockOf&#91;hashval]); \/\/ Unlock the bucket.\n      acquiresleep(&amp;b-&gt;lock); \/\/ Lock the buffer.\n      return b;\n    }\n  }\n\/\/...... Part 1 End<\/code><\/pre>\n\n\n\n<p>\u3082\u3057\u3001\u305d\u306e\u30d0\u30b1\u30c3\u30c8\u306b\u30d6\u30ed\u30c3\u30af\u304c\u898b\u3064\u304b\u3089\u306a\u304b\u3063\u305f\u5834\u5408\u3001\u30d0\u30b1\u30c3\u30c8\u30ed\u30c3\u30af\u3092\u89e3\u653e\u3057\u3001LRU\u6226\u7565\u3092\u4f7f\u7528\u3057\u3066\u9069\u5207\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u7f6e\u304d\u63db\u3048\u308b\u5834\u6240\u3092\u63a2\u3057\u307e\u3059\u3002\u3053\u306e\u6642\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u30ed\u30c3\u30af <code>bcache.lock<\/code> \u3092\u53d6\u5f97\u3057\u3066\u3001\u4ed6\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u5229\u7528\u53ef\u80fd\u306a\u30d0\u30c3\u30d5\u30a1\u3092\u691c\u7d22\u4e2d\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5909\u66f4\u3057\u306a\u3044\u3088\u3046\u306b\u3057\u307e\u3059\u3002<br>LRU\u306e\u691c\u7d22\u306f\u3059\u3079\u3066\u306e\u30d0\u30b1\u30c3\u30c8\u3092\u5bfe\u8c61\u306b\u884c\u308f\u308c\u307e\u3059\u3002\u5404\u30d0\u30b1\u30c3\u30c8\u3092\u30ed\u30c3\u30af\u3057\u3001\u305d\u306e\u4e2d\u306e\u30d0\u30c3\u30d5\u30a1\u3092\u9006\u9806\u306b\u8fbf\u3063\u3066\u3001\u53c2\u7167\u30ab\u30a6\u30f3\u30c8\u304c0\u3067\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u304c\u6700\u5c0f\u306e\u30d0\u30c3\u30d5\u30a1\u3092\u63a2\u3057\u307e\u3059\u3002\u3082\u3057\u3001\u3042\u308b\u30d0\u30b1\u30c3\u30c8\u3092\u691c\u7d22\u3057\u3066\u3044\u308b\u6700\u4e2d\u306b\u3001\u898b\u3064\u304b\u3063\u305f\u7f6e\u63db\u5bfe\u8c61\u306e\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3088\u308a\u3082\u5927\u304d\u3044\u3082\u306e\u304c\u3042\u308c\u3070\u3001\u305d\u306e\u30d0\u30b1\u30c3\u30c8\u5168\u4f53\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u691c\u7d22\u52b9\u7387\u3092\u9ad8\u3081\u307e\u3059\u3002\u6700\u7d42\u7684\u306b\u7f6e\u304d\u63db\u3048\u53ef\u80fd\u306a\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u304c\u898b\u3064\u304b\u308c\u3070\u3001\u3053\u3053\u30672\u3064\u306e\u30d0\u30b1\u30c3\u30c8\u30ed\u30c3\u30af\u3092\u4fdd\u6301\u3059\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002LRU\u304c\u898b\u3064\u304b\u3089\u306a\u304b\u3063\u305f\u5834\u5408\u30012\u3064\u76ee\u306e\u30d0\u30b1\u30c3\u30c8\u30ed\u30c3\u30af\u306f\u305d\u306e\u30eb\u30fc\u30d7\u306e\u6700\u5f8c\u3067\u89e3\u653e\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/...... Part 2 Start\n  release(&amp;bcache.lockOf&#91;hashval]); \/\/ Unlock the bucket.\n\n  \/\/ Not cached.\n  \/\/ Recycle the least recently used (LRU) unused buffer.\n\n  \/\/ Acquire global lock to prevent other processes from modifying the cache.\n  acquire(&amp;bcache.lock);\n\n  struct buf *lru_buf = 0;\n  uint lru_timestamp = 0xFFFFFFFF;\n  int lru_bucket = -1;\n\n  \/\/ Search for the LRU buffer.\n  for(int i = 0; i &lt; NBUCKET; i++){\n    acquire(&amp;bcache.lockOf&#91;i]); \/\/ Lock bucket i.\n\n    for(b = bcache.headOfbucket&#91;i].prev; b != &amp;bcache.headOfbucket&#91;i]; b = b-&gt;prev){\n      if(b-&gt;timestamp &gt; lru_timestamp)\n          goto Nextbucket;\n      if(b-&gt;refcnt == 0){\n        if(b-&gt;timestamp &lt; lru_timestamp){\n          \/\/ Found a better LRU buffer.\n          if(lru_buf != 0 &amp;&amp; lru_bucket != hashval &amp;&amp; lru_bucket != i){\n          \t\/\/ Release the previous lru_bucket lock.\n            release(&amp;bcache.lockOf&#91;lru_bucket]); \n          }\n          lru_buf = b;\n          lru_timestamp = b-&gt;timestamp;\n          lru_bucket = i;\n        }\n      }\n    }\nNextbucket:\n    if(lru_bucket != i &amp;&amp; i != hashval){\n      \/\/ Release bucket i if it's not the lru_bucket or target bucket.\n      release(&amp;bcache.lockOf&#91;i]); \n    }\n  }\n  if(lru_buf == 0){\n    if(lru_bucket != -1 &amp;&amp; lru_bucket != hashval){\n      release(&amp;bcache.lockOf&#91;lru_bucket]);\n    }\n    release(&amp;bcache.lock);\n    panic(\"bget: no buffers\");\n  }\n\/\/...... Part 2 End<\/code><\/pre>\n\n\n\n<p>\ud83c\udf1f<strong>\u6ce8\u610f<\/strong><br>\u3053\u306e\u6642\u70b9\u3067\u306f\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u30ed\u30c3\u30af\u30682\u3064\u306e\u30d0\u30b1\u30c3\u30c8\u30ed\u30c3\u30af\u3092\u4fdd\u6301\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>LRU\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u898b\u3064\u3051\u305f\u5f8c\u3001\u691c\u7d22\u4e2d\u306b\u4ed6\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u30bf\u30fc\u30b2\u30c3\u30c8\u30d0\u30b1\u30c3\u30c8\u306b\u30d6\u30ed\u30c3\u30af\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u305f\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u7af6\u5408\u72b6\u614b\u3092\u56de\u907f\u3059\u308b\u305f\u3081\u3067\u30012\u3064\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u540c\u3058\u30d6\u30ed\u30c3\u30af\u756a\u53f7\u306b\u5bfe\u3057\u3066\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u5272\u308a\u5f53\u3066\u3088\u3046\u3068\u3059\u308b\u5834\u5408\u3092\u9632\u304e\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/...... Part 3 Start\n  \/\/ Now, we hold locks on \n  \/\/ bcache.lock, bcache.lockOf&#91;hashval], and bcache.lockOf&#91;lru_bucket].\n\n  \/\/ Check whether another process has cached the buffer in the target bucket.\n  for(b = bcache.headOfbucket&#91;hashval].next; b != &amp;bcache.headOfbucket&#91;hashval]; b = b-&gt;next){\n    if(b-&gt;dev == dev &amp;&amp; b-&gt;blockno == blockno){\n      b-&gt;refcnt++;\n      if(lru_bucket != hashval)\n        \/\/ Release lru_bucket lock if different.\n        release(&amp;bcache.lockOf&#91;lru_bucket]); \n      release(&amp;bcache.lockOf&#91;hashval]); \/\/ Release target bucket lock.\n      release(&amp;bcache.lock); \/\/ Release global lock.\n      acquiresleep(&amp;b-&gt;lock); \/\/ Lock the buffer.\n      return b;\n    }\n  }\n\/\/...... Part 3 End<\/code><\/pre>\n\n\n\n<p>\u3082\u3057\u3001\u30d6\u30ed\u30c3\u30af\u304c\u4ed6\u306e\u30d7\u30ed\u30bb\u30b9\u306b\u3088\u3063\u3066\u30ad\u30e3\u30c3\u30b7\u30e5\u3055\u308c\u3066\u3044\u305f\u5834\u5408\u3001\u305d\u306e<span class=\"swl-marker mark_orange\">\u507d<\/span>\u300cLRU\u30d0\u30c3\u30d5\u30a1\u300d\u306f\u7834\u68c4\u3055\u308c\u3001\u3059\u3067\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3055\u308c\u3066\u3044\u308b\u30d6\u30ed\u30c3\u30af\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002\u6b63\u3057\u3044\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u306f\u30b9\u30ea\u30fc\u30d7\u30ed\u30c3\u30af\u3067\u30ed\u30c3\u30af\u3055\u308c\u3001\u53c2\u7167\u30ab\u30a6\u30f3\u30c8\u304c\u5897\u52a0\u3057\u307e\u3059\u3002<br>\u4ed6\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u305d\u306e\u30d6\u30ed\u30c3\u30af\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3057\u3066\u3044\u306a\u3051\u308c\u3070\u3001LRU\u30d0\u30c3\u30d5\u30a1\u3092\u5143\u306e\u30d0\u30b1\u30c3\u30c8\u304b\u3089\u53d6\u308a\u9664\u304d\u3001\u30bf\u30fc\u30b2\u30c3\u30c8\u30d0\u30b1\u30c3\u30c8\u306b\u633f\u5165\u3057\u307e\u3059\u3002\u30d0\u30b1\u30c3\u30c8\u9593\u306e\u4ea4\u63db\u306b\u3088\u308a\u3001\u30d0\u30c3\u30d5\u30a1\u304c\u6b63\u3057\u304f\u30cf\u30c3\u30b7\u30e5\u30c1\u30a7\u30fc\u30f3\u306b\u914d\u7f6e\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/...... Part 4 Start\n  \/\/ Remove lru_buf from its current bucket.\n  lru_buf-&gt;prev-&gt;next = lru_buf-&gt;next;\n  lru_buf-&gt;next-&gt;prev = lru_buf-&gt;prev;\n\n  \/\/ Add lru_buf to the target bucket.\n  lru_buf-&gt;next = bcache.headOfbucket&#91;hashval].next;\n  lru_buf-&gt;prev = &amp;bcache.headOfbucket&#91;hashval];\n  bcache.headOfbucket&#91;hashval].next-&gt;prev = lru_buf;\n  bcache.headOfbucket&#91;hashval].next = lru_buf;\n\n  \/\/ Initialize lru_buf.\n  lru_buf-&gt;dev = dev;\n  lru_buf-&gt;blockno = blockno;\n  lru_buf-&gt;valid = 0;\n  lru_buf-&gt;refcnt = 1;\n\/\/...... Part 4 End<\/code><\/pre>\n\n\n\n<p>\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u66f4\u65b0\u3057\u305f\u5f8c\u3001\u3059\u3079\u3066\u306e\u30ed\u30c3\u30af\u3092\u9806\u756a\u306b\u89e3\u653e\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30d7\u30ed\u30bb\u30b9\u5168\u4f53\u306e\u30a2\u30c8\u30df\u30c3\u30af\u6027\u304c\u78ba\u4fdd\u3055\u308c\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u30b9\u30ea\u30fc\u30d7\u30ed\u30c3\u30af\u3092\u4f7f\u3063\u3066\u30ad\u30e3\u30c3\u30b7\u30e5\u30d6\u30ed\u30c3\u30af\u3092\u30ed\u30c3\u30af\u3057\u3001return\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/...... Part 5 Start\n  \/\/ Release locks.\n  if(lru_bucket != hashval)\n    release(&amp;bcache.lockOf&#91;lru_bucket]); \/\/ Release lru_bucket lock if different.\n  release(&amp;bcache.lockOf&#91;hashval]); \/\/ Release target bucket lock.\n  release(&amp;bcache.lock); \/\/ Release global lock.\n\n  acquiresleep(&amp;lru_buf-&gt;lock); \/\/ Lock the buffer.\n  return lru_buf;\n}\n\/\/...... Part 5 End<\/code><\/pre>\n\n\n\n<p><code>brelse<\/code> \u95a2\u6570\u3067\u306f\u3001\u30e1\u30e2\u30ea\u30d6\u30ed\u30c3\u30af\u3092\u89e3\u653e\u3059\u308b\u969b\u306b\u3001\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570 <code>ticks<\/code> \u3092\u4f7f\u3063\u3066\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3092\u66f4\u65b0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br>\u3055\u3089\u306b\u3001<code>bpin<\/code> \u3068 <code>bunpin<\/code> \u95a2\u6570\u306b\u306f\u30cf\u30c3\u30b7\u30e5\u6a5f\u80fd\u3092\u5c0e\u5165\u3059\u308b\u3060\u3051\u3067\u3001\u305d\u306e\u4ed6\u306e\u30ed\u30b8\u30c3\u30af\u306e\u5909\u66f4\u306f\u306a\u3044\u3002<br>\u30b3\u30fc\u30c9\u306f\u4e0b\u8a18\u306b\u793a\u3059\u901a\u308a\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">void brelse(struct buf *b)\n{\n  if(!holdingsleep(&amp;b-&gt;lock))\n    panic(\"brelse\");\n\n  releasesleep(&amp;b-&gt;lock);\n\n  uint hashval = hash(b-&gt;blockno);\n  acquire(&amp;bcache.lockOf&#91;hashval]); \/\/Lock the bucket\n  b-&gt;refcnt--;\n  if (b-&gt;refcnt == 0) {\n    \/\/ no one is waiting for it.\n    b-&gt;next-&gt;prev = b-&gt;prev;\n    b-&gt;prev-&gt;next = b-&gt;next;\n    b-&gt;next = bcache.headOfbucket&#91;hashval].next;\n    b-&gt;prev = &amp;bcache.headOfbucket&#91;hashval];\n    bcache.headOfbucket&#91;hashval].next-&gt;prev = b;\n    bcache.headOfbucket&#91;hashval].next = b;\n    b-&gt;timestamp = ticks;\n  }\n  \n  release(&amp;bcache.lockOf&#91;hashval]); \/\/Unlock the bucket\n}\n\nvoid bpin(struct buf *b) {\n  uint hashval = hash(b-&gt;blockno);\n  acquire(&amp;bcache.lockOf&#91;hashval]); \/\/Lock the bucket\n  b-&gt;refcnt++;\n  release(&amp;bcache.lockOf&#91;hashval]); \/\/Unlock the bucket\n}\n\nvoid bunpin(struct buf *b) {\n  uint hashval = hash(b-&gt;blockno);\n  acquire(&amp;bcache.lockOf&#91;hashval]); \/\/Lock the bucket\n  b-&gt;refcnt--;\n  release(&amp;bcache.lockOf&#91;hashval]); \/\/Unlock the bucket\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lab 4 Page Table<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u6b21\u306e\u8cea\u554f\u3092\u7b54\u3048\u3066\u306a\u3055\u3044<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong><strong>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u6a5f\u69cb<strong><strong>\u306b<\/strong><\/strong>\u3064\u3044\u3066\u306e\u8cea\u554f<\/strong><\/strong><\/h4>\n\n\n\n<dl class=\"swell-block-faq -icon-rounded is-style-faq-box\" data-q=\"fill-custom\" data-a=\"fill-custom\">\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">1. \u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u6a5f\u69cb\u306f\u306a\u305c\u767a\u660e\u3055\u308c\u3001\u3069\u306e\u3088\u3046\u306a\u5229\u70b9\u304c\u3042\u308b\u306e\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<p>\ud83c\udf1f \u306a\u305c\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u6a5f\u69cb\u304c\u767a\u660e\u3055\u308c\u305f\u306e\u304b\uff1f<\/p>\n\n\n\n<p class=\"has-border -border02\">\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u6a5f\u69cb\u306f\u3001\u5f93\u6765\u306e\u30e1\u30e2\u30ea\u7ba1\u7406\u306b\u304a\u3051\u308b\u65ad\u7247\u5316\u3001\u30a2\u30c9\u30ec\u30b9\u7a7a\u9593\u306e\u5206\u96e2\u3001\u67d4\u8edf\u6027\u306e\u6b20\u5982\u306a\u3069\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081\u306b\u958b\u767a\u3055\u308c\u3001\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30b7\u30b9\u30c6\u30e0\u3067\u4eee\u60f3\u30e1\u30e2\u30ea\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002<br><strong><span class=\"swl-marker mark_green\">\u30e1\u30e2\u30ea\u306e\u65ad\u7247\u5316\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081<\/span><\/strong><br>\u9023\u7d9a\u3057\u305f\u30e1\u30e2\u30ea\u5272\u308a\u5f53\u3066\u304c\u5916\u90e8\u65ad\u7247\u5316\u3092\u5f15\u304d\u8d77\u3053\u3059\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306f\u30da\u30fc\u30b8\u30f3\u30b0\u6280\u8853\u3092\u6d3b\u7528\u3057\u3001\u30e1\u30e2\u30ea\u3092\u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30da\u30fc\u30b8\u3068\u30da\u30fc\u30b8\u30d5\u30ec\u30fc\u30e0\u306b\u5206\u5272\u3059\u308b\u3053\u3068\u3067\u5916\u90e8\u65ad\u7247\u5316\u3092\u56de\u907f\u3057\u307e\u3059\u3002<br><strong><span class=\"swl-marker mark_green\">\u4eee\u60f3\u30e1\u30e2\u30ea\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u305f\u3081<\/span><\/strong><br>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u6a5f\u69cb\u306f\u3001\u4f7f\u7528\u983b\u5ea6\u306e\u4f4e\u3044\u30da\u30fc\u30b8\u3092\u30c7\u30a3\u30b9\u30af\u306b\u4fdd\u5b58\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30e1\u30e2\u30ea\u306b\u30ed\u30fc\u30c9\u3059\u308b\u3053\u3068\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u4eee\u60f3\u30e1\u30e2\u30ea\u304c\u62e1\u5f35\u3055\u308c\u3001\u5b9f\u884c\u6642\u306e\u5fc5\u8981\u30e1\u30e2\u30ea\u7a7a\u9593\u304c\u7269\u7406\u30e1\u30e2\u30ea\u3088\u308a\u3082\u5927\u5e45\u306b\u5927\u304d\u304f\u306a\u308a\u307e\u3059\u3002<br><strong><span class=\"swl-marker mark_green\">\u30e1\u30e2\u30ea\u5171\u6709\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u305f\u3081<\/span><\/strong><br>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306f\u975e\u9023\u7d9a\u7684\u306a\u30e1\u30e2\u30ea\u5272\u308a\u5f53\u3066\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u9023\u7d9a\u3059\u308b\u7269\u7406\u30e1\u30e2\u30ea\u3092\u4f7f\u7528\u3059\u308b\u5fc5\u8981\u304c\u306a\u304f\u306a\u308a\u307e\u3059\u3002\u307e\u305f\u3001\u540c\u3058\u7269\u7406\u30da\u30fc\u30b8\u30d5\u30ec\u30fc\u30e0\u3092\u30de\u30c3\u30d4\u30f3\u30b0\u3059\u308b\u3053\u3068\u3067\u3001\u30d7\u30ed\u30bb\u30b9\u9593\u3067\u306e\u30e1\u30e2\u30ea\u5171\u6709\u3092\u53ef\u80fd\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\ud83c\udf1f \u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u6a5f\u69cb\u306e\u4e3b\u306a\u5229\u70b9<\/p>\n\n\n\n<p class=\"has-border -border02\"><strong><span class=\"swl-marker mark_green\">\u30e1\u30e2\u30ea\u5171\u6709\u3068\u30b3\u30d4\u30fc\u30aa\u30f3\u30e9\u30a4\u30c8<\/span><\/strong><br>\u8aad\u307f\u53d6\u308a\u5c02\u7528\u30c7\u30fc\u30bf\uff08\u4f8b: \u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\uff09\u3092\u8907\u6570\u306e\u30d7\u30ed\u30bb\u30b9\u3067\u5171\u6709\u3057\u305f\u308a\u3001\u66f8\u304d\u8fbc\u307f\u6642\u306b\u72ec\u7acb\u3057\u305f\u30b3\u30d4\u30fc\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u3067\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u52b9\u7387\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002<br><strong><span class=\"swl-marker mark_green\">\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u7c21\u7565\u5316<\/span><\/strong><br>\u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30da\u30fc\u30b8\u3068\u30da\u30fc\u30b8\u30d5\u30ec\u30fc\u30e0\u3092\u4f7f\u3063\u305f\u5272\u308a\u5f53\u3066\u306b\u3088\u308a\u3001\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u8907\u96d1\u3055\u304c\u8efd\u6e1b\u3055\u308c\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u52b9\u7387\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002<br><strong><span class=\"swl-marker mark_green\">\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u3068\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u306e\u5909\u63db\u3092\u30b5\u30dd\u30fc\u30c8<\/span><\/strong><br>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306f\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u3068\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u306e\u9593\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u8868\u3068\u3057\u3066\u6a5f\u80fd\u3057\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u72ec\u81ea\u306e\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u7a7a\u9593\u3092\u4f7f\u7528\u3057\u306a\u304c\u3089\u3001\u7269\u7406\u30e1\u30e2\u30ea\u306e\u5834\u6240\u3092\u610f\u8b58\u3059\u308b\u5fc5\u8981\u304c\u306a\u304f\u306a\u308a\u307e\u3059\u3002<br><strong><span class=\"swl-marker mark_green\">\u30b7\u30b9\u30c6\u30e0\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5411\u4e0a<\/span><\/strong><br>\u5404\u30d7\u30ed\u30bb\u30b9\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306f\u72ec\u7acb\u3057\u3066\u304a\u308a\u3001\u30d7\u30ed\u30bb\u30b9\u304c\u4ed6\u306e\u30d7\u30ed\u30bb\u30b9\u306e\u30e1\u30e2\u30ea\u306b\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3053\u3068\u3092\u9632\u3050\u3053\u3068\u3067\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u9ad8\u3081\u307e\u3059\u3002<br><strong><span class=\"swl-marker mark_green\">\u30aa\u30f3\u30c7\u30de\u30f3\u30c9\u30da\u30fc\u30b8\u30f3\u30b0<\/span><\/strong><br>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30da\u30fc\u30b8\u304c\u5b9f\u969b\u306b\u4f7f\u7528\u3055\u308c\u308b\u969b\u306b\u306e\u307f\u30e1\u30e2\u30ea\u306b\u30ed\u30fc\u30c9\u3055\u308c\u308b\u305f\u3081\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u52b9\u7387\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">2. SV39\u6a19\u6e96\u3067\u4eee\u60f3\u30a2\u30c9\u30ec\u30b90xFFFFFFE789ABCDEF\u304c\u6700\u7d42\u7684\u306a\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u306b\u306a\u308b\u307e\u3067\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u8aac\u660e\u306a\u3055\u3044\u3002PTE\u306e\u5185\u5bb9\u306f\u304a\u597d\u304d\u306e\u307e\u307e\u306b\u3002<\/dt><dd class=\"faq_a\">\n<figure class=\"wp-block-image size-full is-style-browser_mac\"><img decoding=\"async\" width=\"2350\" height=\"1390\" src=\"https:\/\/www.yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-1.png\" alt=\"\" class=\"wp-image-1840\" srcset=\"https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-1.png 2350w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-1-300x177.png 300w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-1-1024x606.png 1024w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-1-768x454.png 768w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-1-1536x909.png 1536w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-1-2048x1211.png 2048w\" sizes=\"(max-width: 2350px) 100vw, 2350px\" \/><\/figure>\n\n\n\n<div class=\"swell-block-step\" data-num-style=\"circle\">\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u304b\u3089Extended\u30d3\u30c3\u30c8\u3092\u9664\u53bb<\/div><div class=\"swell-block-step__body\">\n<p>SV39\u3067\u306f\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306e\u9ad8\u4f4d\u30d3\u30c3\u30c8\uff08Extended\u90e8\u5206\uff09\u306f\u9664\u53bb\u3055\u308c\u307e\u3059\u3002<br>\u3057\u305f\u304c\u3063\u3066\u3001\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306f\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff1a <code>0x6789ABCDEF<\/code><br>\u30d0\u30a4\u30ca\u30ea\u8868\u73fe: <code><span class=\"swl-marker mark_orange\">110 0111 10<\/span><span class=\"swl-marker mark_green\">00 1001 101<\/span><span class=\"swl-marker mark_blue\">0 1011 1100<\/span> 1101 1110 1111<\/code><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">\u4e0a\u4f4d\u30da\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30a8\u30f3\u30c8\u30ea\u306e\u691c\u7d22<\/div><div class=\"swell-block-step__body\">\n<p>SATP\u30ec\u30b8\u30b9\u30bf\u60c5\u5831\u3092\u53c2\u7167\u3057\u3001\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306e\u4e0a\u4f4d\u30da\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u756a\u53f7\uff08<code>Page Directory Number<\/code>\uff09\u3092\u7279\u5b9a\u3057\u307e\u3059\u3002<br>\u756a\u53f7\uff1a<code><span class=\"swl-marker mark_orange\">110 0111 10<\/span><\/code> = <code>0x19E<\/code><br>\u4e0a\u4f4d\u30da\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u8a72\u5f53\u3059\u308b\u30a8\u30f3\u30c8\u30ea\u3092\u691c\u7d22\u3057\u3001\u3042\u308b\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u307e\u3059\u3001\u4f8b\u3048\u3070 <code>0x0000011B78A000<\/code>\u3002<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">\u4e2d\u4f4d\u30da\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30a8\u30f3\u30c8\u30ea\u306e\u691c\u7d22<\/div><div class=\"swell-block-step__body\">\n<p id=\"block-a631bf8a-14af-4b98-9f3d-9ca218d8d8f0\">\u4e2d\u4f4d\u306e\u30da\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u756a\u53f7\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<br><code><span class=\"swl-marker mark_green\">00 1001 101<\/span><\/code> = <code>0x04D<\/code><br>\u4e2d\u4f4d\u30da\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u8a72\u5f53\u3059\u308b\u30a8\u30f3\u30c8\u30ea\u3092\u691c\u7d22\u3057\u3001\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u307e\u3059\uff1a <code>0x0000011A799000<\/code>\u3002<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">\u4e0b\u4f4d\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u30a8\u30f3\u30c8\u30ea\u306e\u691c\u7d22<\/div><div class=\"swell-block-step__body\">\n<p>\u4e0b\u4f4d\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u756a\u53f7\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<br><code><span class=\"swl-marker mark_blue\">0 1011 1100<\/span><\/code> = <code>0x0BC<\/code><br>\u4e0b\u4f4d\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u304b\u3089\u8a72\u5f53\u3059\u308b\u30a8\u30f3\u30c8\u30ea\u3092\u691c\u7d22\u3057\u3001\u7269\u7406\u30d5\u30ec\u30fc\u30e0ID\u3092\u53d6\u5f97\u3057\u307e\u3059\uff1a<code>0x00000000E83<\/code>\u3002<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">\u30aa\u30d5\u30bb\u30c3\u30c8\u3092\u52a0\u7b97\u3057\u3066\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97<\/div><div class=\"swell-block-step__body\">\n<p>\u30aa\u30d5\u30bb\u30c3\u30c8\u90e8\u5206\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<br><code>1101 1110 1111<\/code> = <code>0xDEF<\/code><br>\u6700\u7d42\u7684\u306a\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u306f\u6b21\u306e\u901a\u308a\u3067\u3059\uff1a<br><code>0x00000000E83DEF<\/code><\/p>\n<\/div><\/div>\n<\/div>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">3. SV39\u6a19\u6e96\u306b\u304a\u3051\u308b\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306eL2\u3001L1\u3001L0\u304c\u305d\u308c\u305e\u308c9\u30d3\u30c3\u30c8\u3067\u3042\u308b\u306e\u306f\u8a2d\u8a08\u4e0a\u306e\u5fc5\u7136\u3067\u3059\u3002\u305d\u308c\u3089\u304c9\u30d3\u30c3\u30c8\u3067\u306a\u3051\u308c\u3070\u306a\u3089\u305a\u300110\u30d3\u30c3\u30c8\u30848\u30d3\u30c3\u30c8\u306b\u3067\u304d\u306a\u3044\u7406\u7531\u3092\u8aac\u660e\u3057\u307e\u3059\uff08\u30d2\u30f3\u30c8\uff1a\u30da\u30fc\u30b8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u30b5\u30a4\u30ba\u306f\u30da\u30fc\u30b8\u30b5\u30a4\u30ba\u3068\u540c\u3058\u3067\u3042\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff09\u3002<\/dt><dd class=\"faq_a\">\n<p class=\"has-border -border02\">SV39\u3067\u306f\u30011\u3064\u306ePage Table Entry\u306f64\u30d3\u30c3\u30c8\uff088\u30d0\u30a4\u30c8\uff09\u3067\u3059\u3002\u4e00\u822c\u7684\u306b1\u30da\u30fc\u30b8\u306e\u30b5\u30a4\u30ba\u306f4KB\uff084096\u30d0\u30a4\u30c8\uff09\u3067\u3059\u30021\u30da\u30fc\u30b8\u306b\u683c\u7d0d\u3067\u304d\u308bPage Table Entry\u306e\u6700\u5927\u6570\u306f\u6b21\u306e\u3088\u3046\u306b\u8a08\u7b97\u3055\u308c\u307e\u3059\uff1a $\\frac{4096 \\, \\text{bytes}}{8 \\, \\text{bytes\/entry}} = 512 \\, \\text{entries}$ 512\u30a8\u30f3\u30c8\u30ea\u306f\u3001\u30d3\u30c3\u30c8\u6570\u3067\u8868\u3059\u3068 $\\log_2 512 = 9$ \u3067\u3059\u3002<br><span class=\"swl-marker mark_green\">10\u30d3\u30c3\u30c8\u30848\u30d3\u30c3\u30c8\u3067\u306f\u306a\u3044\u7406\u7531<\/span><br><strong>10\u30d3\u30c3\u30c8\u306e\u5834\u5408<\/strong>\uff1a<br>1\u3064\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u304c\u6700\u59271024\u30a8\u30f3\u30c8\u30ea\u3092\u6307\u305b\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u3053\u308c\u306f\u30da\u30fc\u30b8\u30b5\u30a4\u30ba\u3092\u8d85\u3048\u308b\u305f\u3081\u4e0d\u53ef\u80fd\u3067\u3059\u3002<br><strong>8\u30d3\u30c3\u30c8\u306e\u5834\u5408<\/strong>\uff1a<br>\u6700\u5927256\u30a8\u30f3\u30c8\u30ea\u3057\u304b\u683c\u7d0d\u3067\u304d\u305a\u3001\u30da\u30fc\u30b8\u30b5\u30a4\u30ba\u306e\u534a\u5206\u304c\u7121\u99c4\u306b\u306a\u308a\u307e\u3059\u3002<br>\u305d\u306e\u305f\u3081\u3001\u6700\u5927\u9650\u52b9\u7387\u7684\u306a9\u30d3\u30c3\u30c8\u304c\u9078\u3070\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/dd><\/div>\n\n\n\n<div class=\"swell-block-faq__item\"><dt class=\"faq_q\">4. SV39\u306e\u300c39\u300d\u304c\u4f55\u3092\u610f\u5473\u3059\u308b\u304b\u306f\u3059\u3067\u306b\u7406\u89e3\u3057\u3066\u3044\u307e\u3059\u3002\u3057\u304b\u3057\u3001\u3082\u3046\u4e00\u3064\u306e\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306e\u898f\u683c\u3067\u3042\u308b<strong>SV48<\/strong>\u3068\u3044\u3046\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u306f\u30013\u968e\u5c64\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u4f7f\u7528\u3059\u308bSV39\u3068\u306f\u7570\u306a\u308a\u3001<strong>4\u968e\u5c64\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb<\/strong>\u3092\u63a1\u7528\u3057\u3066\u3044\u307e\u3059\u3002SV39\u306e\u6a21\u5f0f\u56f3\u3092\u53c2\u8003\u306b\u3057\u306a\u304c\u3089\u3001SV48\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u30c7\u30fc\u30bf\u69cb\u9020\u3068\u30a2\u30c9\u30ec\u30b9\u5909\u63db\u30d5\u30ed\u30fc\u3092\u793a\u3059\u6a21\u5f0f\u56f3\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u304b\uff1f<\/dt><dd class=\"faq_a\">\n<figure class=\"wp-block-image size-full is-style-browser_mac\"><img decoding=\"async\" width=\"2694\" height=\"1386\" src=\"https:\/\/www.yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-2.png\" alt=\"\" class=\"wp-image-1841\" srcset=\"https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-2.png 2694w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-2-300x154.png 300w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-2-1024x527.png 1024w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-2-768x395.png 768w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-2-1536x790.png 1536w, https:\/\/yanagichiaki.jp\/wp-content\/uploads\/2024\/11\/xv6-oslab24-hitsz-answers-4-2-2048x1054.png 2048w\" sizes=\"(max-width: 2694px) 100vw, 2694px\" \/><\/figure>\n<\/dd><\/div>\n<\/dl>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u4e8c. \u30b3\u30fc\u30c9\u30c7\u30b6\u30a4\u30f3<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">(1) <strong>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u51fa\u529b<\/strong><\/h4>\n\n\n\n<p>\u3053\u306e\u30bf\u30b9\u30af\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306b\u3001\u4ee5\u4e0b\u306e2\u3064\u306e\u88dc\u52a9\u95a2\u6570\u3092\u8a2d\u8a08\u3057\u307e\u3057\u305f\u3002<br>1\u3064\u76ee\u306f<strong>\u6587\u5b57\u5217\u7d50\u5408\u95a2\u6570 <code>concat<\/code><\/strong>\u3001\u3082\u30461\u3064\u306f<strong>\u30da\u30fc\u30b8\u306e\u6a29\u9650\u30d5\u30e9\u30b0\u60c5\u5831\u3092\u51fa\u529b\u3059\u308b\u95a2\u6570<\/strong> <code>PTE2STR<\/code>\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">void concat(char r&#91;], char a&#91;], char b&#91;]) {\n\tint i = 0, j = 0;\n\tfor (i = 0; a&#91;i] != '\\0'; i++) r&#91;i] = a&#91;i];\n\tfor (j = 0; b&#91;j] != '\\0'; j++) r&#91;i + j] = b&#91;j];\n\tr&#91;i + j] = '\\0';\n}\n\nchar* PTE2STR(pte_t PTE) {\n  static char flagstr&#91;5] = \"----\";\n  flagstr&#91;0] = (PTE &amp; PTE_R) ? 'r' : '-';\n  flagstr&#91;1] = (PTE &amp; PTE_W) ? 'w' : '-';\n  flagstr&#91;2] = (PTE &amp; PTE_X) ? 'x' : '-';\n  flagstr&#91;3] = (PTE &amp; PTE_U) ? 'u' : '-';\n  return flagstr;\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>concat<\/code>\u306f\u6587\u5b57\u5217\u3092\u7d50\u5408\u3059\u308b\u3060\u3051\u306e\u7c21\u5358\u306a\u95a2\u6570\u306a\u306e\u3067\u3001\u8a73\u7d30\u306f\u5272\u611b\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><code>PTE2STR<\/code>\u306f\u3001PTE\u5185\u306e4\u3064\u306e\u30d5\u30e9\u30b0\u3092\u78ba\u8a8d\u3057\u3001\u8a72\u5f53\u30d3\u30c3\u30c8\u304c1\u306e\u5834\u5408\u306b\u5bfe\u5fdc\u3059\u308b\u6a29\u9650\u304c\u3042\u308b\u3053\u3068\u3092\u51fa\u529b\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u9010\u6b21\u51fa\u529b<\/strong><\/p>\n\n\n\n<p>\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u6bb5\u968e\u7684\u306b\u51fa\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u305f\u3081\u3001\u518d\u5e30\u7684\u306b\u51e6\u7406\u3092\u884c\u3046\u95a2\u6570<code>vmprint_level<\/code>\u3092\u8003\u3048\u3002\u3053\u306e\u95a2\u6570\u306f\u3001<code>freewalk<\/code>\u306e\u30b3\u30fc\u30c9\u3092\u53c2\u8003\u306b\u3057\u3001\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u8d70\u67fb\u3059\u308b\u30ed\u30b8\u30c3\u30af\u3092\u53d6\u308a\u5165\u308c\u3066\u3044\u307e\u3059\u3002\u30da\u30fc\u30b8\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001\u305d\u306e512\u500b\u306ePTE\u3092\u8d70\u67fb\u3057\u3066\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\u518d\u5e30\u30ed\u30b8\u30c3\u30af\u306e\u5177\u4f53\u7684\u306a\u624b\u9806<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u73fe\u5728\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e512\u500b\u306e\u30a8\u30f3\u30c8\u30ea\u3092\u8d70\u67fb\u3059\u308b<\/strong><br>\u5404\u30a8\u30f3\u30c8\u30ea\uff08PTE\uff09\u306e\u6709\u52b9\u30d3\u30c3\u30c8\uff08PTE_V\uff09\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u6b21\u306e\u30ec\u30d9\u30eb\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u6307\u3057\u3066\u3044\u308b\u5834\u5408<\/strong><br>PTE\u306b<code>PTE_R | PTE_W | PTE_X<\/code>\u6a29\u9650\u304c\u306a\u3044\u5834\u5408\u3001\u305d\u306ePTE\u306f\u6b21\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u6307\u3057\u3066\u3044\u308b\u3068\u307f\u306a\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u3068\u304d\u3001<code>PTE2PA()<\/code>\u3092\u4f7f\u7528\u3057\u3066\u6b21\u306e\u30ec\u30d9\u30eb\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3001\u6307\u3057\u3066\u3044\u308b\u60c5\u5831\u3068\u30d5\u30e9\u30b0\u3092\u51fa\u529b\u3057\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u305d\u306e\u7269\u7406\u30da\u30fc\u30b8\u306b\u5bfe\u3057\u3066\u518d\u5e30\u7684\u306b<code>vmprint_level<\/code>\u3092\u547c\u3073\u51fa\u3057\u3001\u3055\u3089\u306b\u6df1\u3044\u30ec\u30d9\u30eb\u306e\u5185\u5bb9\u3092\u51e6\u7406\u3057\u307e\u3059\u3002\u3053\u306e\u3068\u304d\u3001\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306f\u73fe\u5728\u306e\u57fa\u6e96\u304b\u30899\u30d3\u30c3\u30c8\u5de6\u30b7\u30d5\u30c8\u3055\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u7269\u7406\u30da\u30fc\u30b8\u3092\u6307\u3057\u3066\u3044\u308b\u5834\u5408<\/strong><br>PTE\u306b<code>PTE_R | PTE_W | PTE_X<\/code>\u306e\u3044\u305a\u308c\u304b\u306e\u6a29\u9650\u304c\u3042\u308b\u5834\u5408\u3001\u305d\u306ePTE\u306f\u7269\u7406\u30da\u30fc\u30b8\u3092\u6307\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u5834\u5408\u3001\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u306f<code>(bvaddr + i) &lt;&lt; 12<\/code>\uff08\u4e0b\u4f4d\u30d3\u30c3\u30c8\u30920\u3067\u57cb\u3081\u3066\u30da\u30fc\u30b8\u5883\u754c\u306b\u63c3\u3048\u308b\uff09\u3067\u8a08\u7b97\u3055\u308c\u3001\u4eee\u60f3\u30a2\u30c9\u30ec\u30b9\u304b\u3089\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u3078\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u304c\u51fa\u529b\u3055\u308c\u307e\u3059\u3002\u6700\u5f8c\u306b\u30d5\u30e9\u30b0\u3092\u51fa\u529b\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">void \nvmprint_level(pagetable_t pagetable, char* bars, int level, uint64 bvaddr)\n{\n  if(level>3) return;\n  for(int i = 0; i &lt; 512; i++){\n      pte_t pte = pagetable&#91;i];\n      if(pte &amp; PTE_V){\n        if((pte &amp; (PTE_R|PTE_W|PTE_X)) == 0){\n          \/\/ this PTE points to a lower-level page table.\n          uint64 child = PTE2PA(pte);\n          printf(\"%sidx: %d: pa: %p, flags: %s\\n\", bars, i, PTE2PA(pte), PTE2STR(pte));\n          char d&#91;10];\n          concat(d, dots,\"   ||\");\n          vmprint_level((pagetable_t)child, d, level + 1, (bvaddr+i) &lt;&lt; 9);\n        } else {\n          printf(\"%sidx: %d: va: %p -> pa: %p, flags: %s\\n\", bars, i,  (bvaddr+i)&lt;&lt;12, PTE2PA(pte), PTE2STR(pte));\n        }\n      }\n  }\n}<\/code><\/pre>\n\n\n\n<p><strong>\u51fa\u529b\u30d5\u30a9\u30fc\u30de\u30c3\u30c8<\/strong><\/p>\n\n\n\n<p>\u968e\u5c64\u69cb\u9020\u3092\u8868\u73fe\u3059\u308b<code>||<\/code>\u8a18\u53f7\u306f\u6587\u5b57\u5217\u7d50\u5408\u64cd\u4f5c\u3067\u5b9f\u73fe\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u90e8\u5206\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306f\u6bd4\u8f03\u7684\u5358\u7d14\u306a\u306e\u3067\u3001\u8a73\u7d30\u306f\u7701\u7565\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u306f\u3001<code>vmprint_level<\/code>\u95a2\u6570\u3092\u5b9f\u88c5\u3059\u308b\u95a2\u6570\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">void vmprint(pagetable_t pagetable){\n  printf(\"page table %p\\n\", pagetable);\n  \/\/ there are 2^9 = 512 PTEs in a page table.\n  vmprint_level(pagetable, \"||\", 1, 0);\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">(2) <strong>\u30d7\u30ed\u30bb\u30b9\u5c02\u7528\u306e\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb<\/strong><\/h4>\n\n\n\n<p>\u672c\u30bf\u30b9\u30af\u306e\u76ee\u6a19\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a\u5404\u30d7\u30ed\u30bb\u30b9\u304c\u72ec\u81ea\u306e\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u6301\u3064\u3088\u3046\u306b\u3059\u308b\u3053\u3068\u3067\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30ab\u30fc\u30cd\u30eb\u304c\u30e6\u30fc\u30b6\u30fc\u30b9\u30da\u30fc\u30b9\u306e\u30dd\u30a4\u30f3\u30bf\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u969b\u3001\u8ffd\u52a0\u306e\u7269\u7406\u30a2\u30c9\u30ec\u30b9\u5909\u63db\u3092\u884c\u308f\u305a\u306b\u76f4\u63a5\u30c7\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u5404\u30d7\u30ed\u30bb\u30b9\u306b\u72ec\u81ea\u306e\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u6301\u305f\u305b\u308b\u305f\u3081\u306b\u306f\u3001\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u53c2\u7167\u3092\u30d7\u30ed\u30bb\u30b9\u5236\u5fa1\u30d6\u30ed\u30c3\u30af\uff08PCB\uff09\u306b\u7d44\u307f\u8fbc\u3080\u3053\u3068\u304c\u81ea\u7136\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u3068\u3057\u3066\u8003\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/proc.h\nstruct proc {\n\/\/...\n  pagetable_t pagetable;       \/\/ User page table\n  pagetable_t kernel_pagetable;\n\/\/...<\/code><\/pre>\n\n\n\n<p>\u53c2\u7167\u3092\u8a2d\u5b9a\u3057\u305f\u5f8c\u3001<code>allocproc<\/code>\u3067\u30d7\u30ed\u30bb\u30b9\u306e\u521d\u671f\u5316\u6642\u306b\u3053\u306e\u53c2\u7167\u304c\u6307\u3059\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u307e\u3059\u3002\u3053\u306e\u969b\u3001\u30e6\u30fc\u30b6\u30fc\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u53c2\u7167\u8a2d\u5b9a\u3092\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u3092\u53c2\u8003\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092OS\u30ec\u30d9\u30eb\u304b\u3089\u30d7\u30ed\u30bb\u30b9\u30ec\u30d9\u30eb\u306b\u79fb\u884c\u3059\u308b\u306b\u3042\u305f\u308a\u3001\u30ab\u30fc\u30cd\u30eb\u30b9\u30bf\u30c3\u30af\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u3082\u518d\u8a2d\u8a08\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u5f93\u6765\u306e\u30ed\u30b8\u30c3\u30af\u3067\u306f\u3001OS\uff08<code>procinit<\/code>\uff09\u304c64\u500b\u306e\u30d7\u30ed\u30bb\u30b9\u7528\u306e\u30ab\u30fc\u30cd\u30eb\u30b9\u30bf\u30c3\u30af\u4f4d\u7f6e\u3092\u76f4\u63a5\u8a2d\u5b9a\u3057\u3066\u304a\u308a\u3001\u305d\u306e\u9593\u3092\u30ac\u30fc\u30c9\u30da\u30fc\u30b8\u3067\u5206\u96e2\u3057\u3066\u5883\u754c\u8d85\u904e\u3092\u9632\u3044\u3067\u3044\u307e\u3057\u305f\u3002\u3057\u304b\u3057\u3001\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u304c\u5171\u6709\u3055\u308c\u306a\u304f\u306a\u308b\u305f\u3081\u3001\u30ab\u30fc\u30cd\u30eb\u30b9\u30bf\u30c3\u30af\u306e\u5272\u308a\u5f53\u3066\u3092\u30d7\u30ed\u30bb\u30b9\u521d\u671f\u5316\u6642\u306b\u884c\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u305f\u3081\u3001\u95a2\u9023\u30b3\u30fc\u30c9\u3092\u305d\u306e\u7b87\u6240\u306b\u79fb\u52d5\u3059\u308b\u3060\u3051\u3067\u5bfe\u5fdc\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/proc.c:allocproc{...\n  \/\/ An empty user page table.\n  p->pagetable = proc_pagetable(p);\n  if(p->pagetable == 0){\n    freeproc(p);\n    release(&amp;p->lock);\n    return 0;\n  }\n  \n  p->kernel_pagetable = ukvminit();\n  if(p->kernel_pagetable == 0){\n    freeproc(p);\n    release(&amp;p->lock);\n    return 0;\n  }\n  \n  char *pa = kalloc();\n  if(pa == 0)\n    panic(\"kalloc\");\n  uint64 va = KSTACK((int) (p - proc));\n  mappages(p->kernel_pagetable, va, PGSIZE, (uint64)pa, PTE_R | PTE_W);\n  p->kstack = va;\n\/\/...}<\/code><\/pre>\n\n\n\n<p>\u4ee5\u4e0a\u306e\u30bf\u30b9\u30af\u3092\u5b8c\u4e86\u3057\u305f\u5f8c\u3001\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u306b\u6ce8\u76ee\uff1a<em>\u4f5c\u6210\u3001\u4f7f\u7528\u3001\u89e3\u653e<\/em>\u3002<\/p>\n\n\n\n<p><strong>\u4f5c\u6210<\/strong>\u306b\u3064\u3044\u3066\u306f\u3001\u5171\u6709\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u4f5c\u6210\u3059\u308b\u65b9\u6cd5\uff08<code>kvminit<\/code>\uff09\u3092\u53c2\u8003\u306b\u3057\u307e\u3059\u3002\u5f93\u6765\u306e\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306f\u5168\u30d7\u30ed\u30bb\u30b9\u3067\u5171\u6709\u3055\u308c\u3066\u3044\u305f\u305f\u3081\u3001\u4e00\u90e8\u306e\u8a73\u7d30\u3092\u8abf\u6574\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001<code>kvmmap<\/code>\u3092\u4f7f\u3044\u7d9a\u3051\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002\u3053\u308c\u306fOS\u306e\u5b9f\u884c\u4e2d\u306b\u4e00\u5ea6\u3057\u304b\u4f7f\u7528\u3067\u304d\u306a\u3044\u305f\u3081\u3067\u3059\u3002\u3053\u306e\u7b87\u6240\u3067\u306f\u901a\u5e38\u306e<code>mappages<\/code>\u3092\u4f7f\u7528\u3057\u3001\u5f15\u6570\u306e\u5024\u306f\u5909\u66f4\u3057\u306a\u304f\u3066\u3082\u554f\u984c\u3042\u308a\u307e\u305b\u3093\u3002\u305f\u3060\u3057\u3001CLINT\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u7121\u52b9\u5316\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u306fCLINT\u304cPLIC\u306e\u4e0b\u306b\u4f4d\u7f6e\u3057\u3066\u3044\u308b\u305f\u3081\u3067\u3059\u3002\u3053\u306e\u5bfe\u5fdc\u3092\u6020\u308b\u3068\u3001\u30bf\u30b9\u30af3\u3092\u5b8c\u4e86\u3059\u308b\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/vm.c\npagetable_t\nukvminit()\n{\n  pagetable_t ukernel_pagetable = uvmcreate();\n  memset(ukernel_pagetable, 0, PGSIZE);\n  \/\/ uart registers\n  mappages(ukernel_pagetable, UART0, PGSIZE, UART0, PTE_R | PTE_W);\n  \/\/ virtio mmio disk interface\n  mappages(ukernel_pagetable, VIRTIO0, PGSIZE, VIRTIO0, PTE_R | PTE_W);\n  \/\/ CLINT\n  \/\/mappages(ukernel_pagetable, CLINT, 0x10000, CLINT, PTE_R | PTE_W);\n  \/\/ PLIC\n  mappages(ukernel_pagetable, PLIC, 0x400000, PLIC, PTE_R | PTE_W);\n  \/\/ map kernel text executable and read-only.\n  mappages(ukernel_pagetable, KERNBASE, (uint64)etext-KERNBASE, KERNBASE, PTE_R | PTE_X);\n  \/\/ map kernel data and the physical RAM we'll make use of.\n  mappages(ukernel_pagetable, (uint64)etext, PHYSTOP-(uint64)etext, (uint64)etext, PTE_R | PTE_W);\n  \/\/ map the trampoline for trap entry\/exit to\n  \/\/ the highest virtual address in the kernel.\n  mappages(ukernel_pagetable, TRAMPOLINE, PGSIZE, (uint64)trampoline, PTE_R | PTE_X);\n  return ukernel_pagetable;\n}<\/code><\/pre>\n\n\n\n<p><strong>\u4f7f\u7528<\/strong>\u306b\u95a2\u3057\u3066\u306f\u3001\u30d7\u30ed\u30bb\u30b9\u5207\u308a\u66ff\u3048\u6642\u306b\u5bfe\u5fdc\u3059\u308b\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u5207\u308a\u66ff\u3048\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u5185\u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u5207\u308a\u66ff\u3048\u308b\u524d\u306b\u3001\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u5207\u308a\u66ff\u3048\u308b\u5b9f\u88c5\u3092\u884c\u3044\u307e\u3059\u3002\u30aa\u30ea\u30b8\u30ca\u30eb\u7248\uff082020\u5e74\u7248\uff09xv6\u306e\u5b9f\u9a13\u3092\u53c2\u8003\u306b\u3057\u3001\u30d7\u30ed\u30bb\u30b9\u304c\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u306b\u306f\u5171\u6709\u30e1\u30e2\u30ea\u306e\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306b\u623b\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/proc.c\nextern pagetable_t kernel_pagetable;\n\nvoid\nscheduler(void)\n{\n\/\/...\n        p->state = RUNNING;\n        c->proc = p;\n        w_satp(MAKE_SATP(p->kernel_pagetable));\n        sfence_vma();\n        swtch(&amp;c->context, &amp;p->context);\n        kvminithart();\n\/\/...\n#if !defined (LAB_FS)\n    if(found == 0) {\n      w_satp(MAKE_SATP(kernel_pagetable));\n      sfence_vma();\n      intr_on();\n      asm volatile(\"wfi\");\n    }\n#else\n    ;\n#endif\n  }\n}<\/code><\/pre>\n\n\n\n<p><strong>\u89e3\u653e<\/strong>\u306b\u95a2\u3057\u3066\u306f\u3001\u30d7\u30ed\u30bb\u30b9\u304c\u7d42\u4e86\u3057\u305f\u5834\u5408\u3001\u305d\u306e\u30d7\u30ed\u30bb\u30b9\u306b\u7d10\u3065\u304f\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3068\u30ab\u30fc\u30cd\u30eb\u30b9\u30bf\u30c3\u30af\u3092\u89e3\u653e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u3092\u884c\u308f\u306a\u3044\u3068\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u304c\u767a\u751f\u3057\u307e\u3059\u3002\u89e3\u653e\u306e\u969b\u306b\u306f\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3092\u518d\u5e30\u7684\u306b\u89e3\u653e\u3059\u308b\u3053\u3068\u3092\u6ce8\u610f\u3057\u307e\u3059\u304c\u3001\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u30ea\u30fc\u30d5\u306b\u3042\u308b\u7269\u7406\u30da\u30fc\u30b8\u3092\u89e3\u653e\u3057\u306a\u3044\u3088\u3046\u306b\u3057\u307e\u3059\u3002\u3053\u308c\u3092\u6020\u308b\u3068\u30ab\u30fc\u30cd\u30eb\u304c\u30af\u30e9\u30c3\u30b7\u30e5\u3059\u308b\u539f\u56e0\u306b\u306a\u308a\u307e\u3059\u3002<code>freewalk<\/code>\u95a2\u6570\u3092\u53c2\u8003\u306b\u3057\u3066\u3053\u306e\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002\u6700\u5f8c\u306b<code>freeproc<\/code>\u5185\u3067\u3053\u306e\u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u3001\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3068\u30ab\u30fc\u30cd\u30eb\u30b9\u30bf\u30c3\u30af\u3092\u524a\u9664\u3059\u308c\u3070\u5b8c\u4e86\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/proc.c\n\/\/Free the table but keep the mem alive\nvoid\nproc_freekernelpagetable(pagetable_t pagetable)\n{\n  \/\/ there are $2^9$ = 512 PTEs in a page table.\n  for(int i = 0; i &lt; 512; i++){\n    pte_t pte = pagetable&#91;i];\n    if((pte &amp; PTE_V) &amp;&amp; (pte &amp; (PTE_R|PTE_W|PTE_X)) == 0){\n      \/\/ this PTE points to a lower-level page table.\n      uint64 child = PTE2PA(pte);\n      proc_freekernelpagetable((pagetable_t)child);\n      pagetable&#91;i] = 0;\n    }\n  }\n  kfree((void*)pagetable);\n}\n\n\/\/kernel\/proc.c:freeproc()\\{...\n  if(p->kernel_pagetable) {\n    uvmunmap(p->kernel_pagetable, p->kstack, 1, 1); \/\/p->kstack no mono wo free suru\n    proc_freekernelpagetable(p->kernel_pagetable);\n  }\n  p->kernel_pagetable = 0;\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">(3) copyin\/copyinstr \u306e\u7c21\u7d20\u5316<\/h4>\n\n\n\n<p>\u672c\u30bf\u30b9\u30af\u306e\u76ee\u7684\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u4e0a\u306e\u5185\u5bb9\u3092\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306b\u540c\u671f\u3055\u305b\u308b\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<p><code>uvmcopy<\/code>\u95a2\u6570\u304c\u3053\u306e\u76ee\u7684\u306b\u9069\u3057\u305f\u4fee\u6b63\u30dd\u30a4\u30f3\u30c8\u3068\u306a\u308a\u307e\u3059\u3002\u3053\u306e\u95a2\u6570\u3092\u5229\u7528\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u4e0a\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u95a2\u4fc2\u3092\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306b\u7d71\u5408\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059\u3002\u540c\u671f\u3057\u3066\u7d71\u5408\u3059\u308b\u6a5f\u80fd\u304c\u3042\u308b\u4ee5\u4e0a\u3001\u540c\u671f\u3057\u3066\u89e3\u9664\u3059\u308b\u6a5f\u80fd\u3082\u8a2d\u8a08\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u969b\u3001<code>uvmdealloc<\/code>\u95a2\u6570\u3092\u53c2\u8003\u306b\u3057\u3066\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u7279\u306b\u3001\u4e0a\u8a18\u306e\u7d71\u5408\u304a\u3088\u3073\u89e3\u9664\u306f\u91cd\u8907\u3059\u308b\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u6271\u3046\u3082\u306e\u3067\u3042\u308b\u305f\u3081\u3001\u3053\u308c\u3089\u306e\u30b3\u30fc\u30c9\u5b9f\u88c5\u306b\u304a\u3044\u3066\u7269\u7406\u30e1\u30e2\u30ea\u3092\u8aa4\u3063\u3066\u64cd\u4f5c\u3057\u306a\u3044\u3088\u3046\u306b\u6ce8\u610f\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/vm.c\nint\nuvmcopy_k(pagetable_t user_pt, pagetable_t kernel_pt, uint64 start, uint64 sz)\n{\n  pte_t *pte;\n  uint64 pa, i;\n  uint flags;\n\n  for(i = PGROUNDUP(start); i &lt; start + sz; i += PGSIZE){\n    if((pte = walk(user_pt, i, 0)) == 0)\n      panic(\"uvmcopy_k: pte should exist\");\n    if((*pte &amp; PTE_V) == 0)\n      panic(\"uvmcopy_k: page not present\");\n    pa = PTE2PA(*pte);\n    flags = PTE_FLAGS(*pte);\n    if(mappages(kernel_pt, i, PGSIZE, (uint64)pa, flags &amp; ~PTE_U) != 0) \/\/clear U\n      goto err;\n  }\n  return 0;\n\n err:\n  uvmunmap(kernel_pt, 0, (i-start) \/ PGSIZE, 0);\/\/No physical mem removal\n  return -1;\n}\n\nuint64\nuvmdealloc_k(pagetable_t pagetable, uint64 oldsz, uint64 newsz)\n{\n  if(newsz >= oldsz)\n    return oldsz;\n\n  if(PGROUNDUP(newsz) &lt; PGROUNDUP(oldsz)){\n    int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) \/ PGSIZE;\n    uvmunmap(pagetable, PGROUNDUP(newsz), npages, 0);\n  }\n\n  return newsz;\n}\n<\/code><\/pre>\n\n\n\n<p><code>uvmcopy<\/code>\u3092\u53c2\u8003\u306b\u3059\u308b\u5834\u5408\u3001\u30da\u30fc\u30b8\u306e\u5272\u308a\u5f53\u3066\u3084\u30da\u30fc\u30b8\u306e\u30af\u30ea\u30a2\u306b\u95a2\u3059\u308b\u30b3\u30fc\u30c9\u3092\u524a\u9664\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u307e\u305f\u3001PTE\u3092\u30b3\u30d4\u30fc\u3059\u308b\u969b\u306b\u306f\u3001\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306f<code>PTE_U<\/code>\u30d5\u30e9\u30b0\u304c\u4ed8\u4e0e\u3055\u308c\u305f\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u3053\u306e\u30d5\u30e9\u30b0\u3092\u6d88\u53bb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u304c\u3053\u308c\u3089\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u3067\u3059\u3002<\/p>\n\n\n\n<p><code>uvmdealloc<\/code>\u3092\u53c2\u8003\u306b\u3059\u308b\u5834\u5408\u3001\u5185\u90e8\u3067\u4f7f\u7528\u3055\u308c\u308b<code>uvmunmap<\/code>\u547c\u3073\u51fa\u3057\u306e\u8abf\u6574\u304c\u5fc5\u8981\u3067\u3059\u3002\u7269\u7406\u30da\u30fc\u30b8\u3092\u89e3\u653e\u3057\u306a\u3044\u3088\u3046\u306b\u4fee\u6b63\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>2\u3064\u306e\u95a2\u6570\u3092\u5b8c\u6210\u3055\u305b\u305f\u5f8c\u306f\u3001\u5fc5\u8981\u306a\u7b87\u6240\u3067\u9069\u5207\u306b\u547c\u3073\u51fa\u3057\u3092\u8ffd\u52a0\u3059\u308b\u3060\u3051\u3067\u3059\u3002\u3053\u3053\u3067\u5fc5\u8981\u306a\u7b87\u6240\u3068\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u304c\u5909\u66f4\u3055\u308c\u308b\u5168\u3066\u306e\u7b87\u6240\u3092\u6307\u3057\u307e\u3059\u3002\u30b3\u30fc\u30c9\u3092\u78ba\u8a8d\u3057\u305f\u7d50\u679c\u3001\u4ee5\u4e0b\u306e\u7b87\u6240\u3067\u5909\u66f4\u304c\u5fc5\u8981\u3067\u3059\uff1a<code>userinit<\/code>\u3001<code>fork<\/code>\u3001<code>growproc<\/code>\u3001<code>exec<\/code>\u3002<code>uvmcopy_k<\/code>\u3068<code>uvmdealloc_k<\/code>\u306e\u4f7f\u7528\u65b9\u6cd5\u306f\u30aa\u30ea\u30b8\u30ca\u30eb\u7248\u306b\u975e\u5e38\u306b\u4f3c\u3066\u3044\u308b\u305f\u3081\u3001\u540c\u69d8\u306e\u65b9\u6cd5\u3067\u547c\u3073\u51fa\u3059\u3060\u3051\u3067\u554f\u984c\u3042\u308a\u307e\u305b\u3093\u3002\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u898b\u308c\u3070\u5206\u304b\u308b\u901a\u308a\u3001\u57fa\u672c\u7684\u306b\u30b3\u30d4\u30fc\uff06\u30da\u30fc\u30b9\u30c8\u4f5c\u696d\u306b\u306a\u308b\u305f\u3081\u3001\u8a73\u7d30\u306a\u8aac\u660e\u306f\u3053\u3053\u3067\u5272\u611b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/proc.c\nvoid\nuserinit(void)\n{\n\/\/...\n  uvminit(p->pagetable, initcode, sizeof(initcode));\n  uvmcopy_k(p->pagetable, p->kernel_pagetable, 0, PGSIZE);\n\/\/...\n}\n\nint\nfork(void)\n{\n\/\/...\n  \/\/ Copy user memory from parent to child.\n  if(uvmcopy(p->pagetable, np->pagetable, p->sz) &lt; 0){\n    freeproc(np);\n    release(&amp;np->lock);\n    return -1;\n  }\n  np->sz = p->sz;\n  if(uvmcopy_k(np->pagetable,np->kernel_pagetable,0 , np->sz) &lt; 0){\n    freeproc(np);\n    release(&amp;np->lock);\n    return -1;\n  }\n\/\/...}\n\nint\ngrowproc(int n)\n{\n\/\/...\n  if(n > 0){\n    if((sz = uvmalloc(p->pagetable, sz, sz + n)) == 0) {\n      return -1;\n    }\n    if(uvmcopy_k(p->pagetable,p->kernel_pagetable, p->sz, n) &lt; 0) {\n      return -1;\n    }\n  } else if(n &lt; 0){\n    uvmdealloc(p->pagetable, sz, sz + n);\n    sz = uvmdealloc_k(p->kernel_pagetable, sz, sz + n);\n  }\n  p->sz = sz;\n  return 0;\n}\n\n\/\/kernel\/exec.c:exec(){...\n  \/\/ Commit to the user image.\n  oldpagetable = p->pagetable;\n  p->pagetable = pagetable;\n  p->sz = sz;\n  p->trapframe->epc = elf.entry;  \/\/ initial program counter = main\n  p->trapframe->sp = sp; \/\/ initial stack pointer\n  proc_freepagetable(oldpagetable, oldsz);\n  uvmunmap(p->kernel_pagetable, 0, oldsz\/PGSIZE, 0);\n  uvmcopy_k(p->pagetable, p->kernel_pagetable, 0, p->sz);\n  if(p->pid==1) vmprint(p->pagetable);\n  return argc; \/\/ this ends up in a0, the first argument to main(argc, argv)\n\/\/...\n}<\/code><\/pre>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u3068\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u306e\u4e92\u63db\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30a2\u30c9\u30ec\u30b9\u304cPLIC\u3092\u8d85\u3048\u306a\u3044\u3088\u3046\u306b\u5236\u9650\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u5236\u9650\u306f<code>uvmalloc<\/code>\u5185\u3067\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/vm.c\nuint64\nuvmalloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)\n{\n  char *mem;\n  uint64 a;\n\n  if(newsz &lt; oldsz)\n    return oldsz;\n  if(newsz >= PLIC)\n    return 0;\n\/\/...}<\/code><\/pre>\n\n\n\n<p>\u6700\u5f8c\u306f\u3001<code>kvmpa<\/code>\u3067\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u304c\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b\u3002\u3053\u3053\u3067\u306f\u3001\u30ab\u30fc\u30cd\u30eb\u30da\u30fc\u30b8\u30c6\u30fc\u30d6\u30eb\u304c\u30d7\u30ed\u30bb\u30b9\u5c02\u7528\u3067\u3042\u308b\u305f\u3081\u3001<code>walk<\/code>\u547c\u3073\u51fa\u3057\u306e\u5f15\u6570\u3092\u8abf\u6574\u3057\u3066\u3053\u306e\u554f\u984c\u306b\u5bfe\u5fdc\u3057\u3066\u3067\u3044\u3044\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"c\">\/\/kernel\/vm.c\nuint64\nkvmpa(uint64 va)\n{\n  uint64 off = va % PGSIZE;\n  pte_t *pte;\n  uint64 pa;\n  \n  pte = walk(myproc()->kernel_pagetable, va, 0);\n  if(pte == 0)\n    panic(\"kvmpa\");\n  if((*pte &amp; PTE_V) == 0)\n    panic(\"kvmpa\");\n  pa = PTE2PA(*pte);\n  return pa+off;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Lab 5 File System<\/h2>\n\n\n<div class=\"swell-block-postLink\">\t\t\t<div class=\"p-blogCard -external\" data-type=\"type3\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u7d42\u308f\u3089\u306a\u3044\u79cb\u98a8<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img decoding=\"async\" src=\"https:\/\/www.yanagichiaki.jp\/wp-content\/uploads\/2024\/06\/logo.png\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/www.yanagichiaki.jp\/index.php\/2024\/11\/30\/simplified-ext2-on-fuse\/\" target=\"_blank\" rel=\"noopener noreferrer\">Simplified EXT2 On FUSE|\u7d42\u308f\u3089\u306a\u3044\u79cb\u98a8<\/a>\n\t\t\t\t\t\t<span class=\"p-blogCard__excerpt\">\u30cf\u30eb\u30d3\u30f3\u5de5\u696d\u5927\u5b66\uff08\u6df1\u5733\uff09\u2022 2024 \u2022 \u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0 Lab\u2022 \u306b\u304a\u3051\u308b\u89e3\u6c7a\u7b56 \u2022 HITSZ \u54c8\u5c14\u6ee8\u5de5\u4e1a\u5927\u5b66\uff08\u6df1\u5733\uff09 \u64cd\u4f5c\u7cfb\u7edf\u5b9e\u9a8c 2024 \u57fa\u4e8eFUSE\u7684\u9752\u6625\u7248EXT2\u6587\u4ef6\u7cfb\u7edf<\/span>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n\n<p class=\"has-text-align-center is-style-kakko_box\">\u4ee5\u4e0a\u3067\u3059<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>\u30cf\u30eb\u30d3\u30f3\u5de5\u696d\u5927\u5b66\uff08\u6df1\u5733\uff09 2024  \u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0 Lab \u306b\u304a\u3051\u308b\u89e3\u6c7a\u7b56\u306e\u4e00\u3064<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[88],"tags":[],"class_list":["post-1137","post","type-post","status-publish","format-standard","hentry","category-operating-system"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/posts\/1137","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/comments?post=1137"}],"version-history":[{"count":84,"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/posts\/1137\/revisions"}],"predecessor-version":[{"id":1913,"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/posts\/1137\/revisions\/1913"}],"wp:attachment":[{"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/media?parent=1137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/categories?post=1137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yanagichiaki.jp\/index.php\/wp-json\/wp\/v2\/tags?post=1137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}