{"id":446838,"date":"2025-02-02T09:05:30","date_gmt":"2025-02-02T09:05:30","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=446838"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=446838","title":{"rendered":"<span>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 1 000 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 (\u0447\u0430\u0441\u0442\u044c 3)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/876360\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/7u\/l1\/9e\/7ul19eer6syvbsa41ly4kbbhg9u.png\" data-src=\"https:\/\/habrastorage.org\/webt\/7u\/l1\/9e\/7ul19eer6syvbsa41ly4kbbhg9u.png\"\/><\/div>\n<p><\/a><br \/> \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u044c\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u041e\u0421. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0435\u0451 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u0432\u044b\u0448\u0435\u0434\u0448\u0438\u043c \u0447\u0430\u0441\u0442\u044f\u043c<\/font><\/h2>\n<p> <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/874154\/\">\u0427\u0430\u0441\u0442\u044c 1<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/875776\/\">\u0427\u0430\u0441\u0442\u044c 2<\/a><\/li>\n<li>\u0427\u0430\u0441\u0442\u044c 3 &lt; \u2014 \u0432\u044b \u0437\u0434\u0435\u0441\u044c<\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a> <\/p>\n<h2><font color=\"#3AC1EF\">\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/font><\/h2>\n<p> \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u2013 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u044f\u0434\u0440\u0443 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438 (\u043e\u0442\u043a\u0430\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446), \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b.<\/p>\n<p> \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u043e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 <code>try-catch<\/code> \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 C++ \u0438\u043b\u0438 Java. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0443\u044e \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u044f\u0434\u0440\u0430. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043e\u0442 <code>try-catch<\/code> \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438, \u0433\u0434\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e. \u041a\u0440\u0443\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u0435 \u0442\u0430\u043a \u043b\u0438?<\/p>\n<p> \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u044f\u0434\u0440\u0430 \u0438 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443. \u0415\u0441\u043b\u0438 QEMU \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f, \u0438\u043b\u0438 \u044f\u0434\u0440\u043e \u043d\u0430\u0447\u043d\u0451\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0431\u043e\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u043b\u0438\u0441\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0447\u043d\u043e \u043f\u0430\u043d\u0438\u043a\u043e\u0439 \u044f\u0434\u0440\u0430. \u042d\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u043e \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 <code>unhandledrejection<\/code> \u0432 JavaScript. <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0426\u0438\u043a\u043b \u0436\u0438\u0437\u043d\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/font><\/h3>\n<p> \u0412 RISC-V \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>medeleg<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 OpenSBI \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 U-Mode\/S-mode \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0440\u0435\u0436\u0438\u043c\u0430 S-Mode.<\/li>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b) \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 CSR (\u0441\u043c. \u043d\u0438\u0436\u0435).<\/li>\n<li>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>stvec<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044f\u0441\u044c \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u044f\u0434\u0440\u0430. <\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>sret<\/code> \u0434\u043b\u044f \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/li>\n<\/ol>\n<p> \u041d\u0438\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b CSR, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 2. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u044f\u0434\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tbody>\n<tr>\n<td><b>\u0420\u0435\u0433\u0438\u0441\u0442\u0440<\/b><\/td>\n<td><b>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435<\/b><\/td>\n<\/tr>\n<tr>\n<td>scause<\/td>\n<td>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u042f\u0434\u0440\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/td>\n<\/tr>\n<tr>\n<td>stval<\/td>\n<td>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435). \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/td>\n<\/tr>\n<tr>\n<td>sepc<\/td>\n<td>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/td>\n<\/tr>\n<tr>\n<td>sstatus<\/td>\n<td>\u0420\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b (U-Mode\/S-Mode) \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439<\/font><\/h3>\n<p> \u041d\u0443 \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u041d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0432 <code>stvec<\/code>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">kernel.c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">kernel.c  __attribute__((naked)) __attribute__((aligned(4))) void kernel_entry(void) {     __asm__ __volatile__(         \"csrw sscratch, sp\\n\"         \"addi sp, sp, -4 * 31\\n\"         \"sw ra,  4 * 0(sp)\\n\"         \"sw gp,  4 * 1(sp)\\n\"         \"sw tp,  4 * 2(sp)\\n\"         \"sw t0,  4 * 3(sp)\\n\"         \"sw t1,  4 * 4(sp)\\n\"         \"sw t2,  4 * 5(sp)\\n\"         \"sw t3,  4 * 6(sp)\\n\"         \"sw t4,  4 * 7(sp)\\n\"         \"sw t5,  4 * 8(sp)\\n\"         \"sw t6,  4 * 9(sp)\\n\"         \"sw a0,  4 * 10(sp)\\n\"         \"sw a1,  4 * 11(sp)\\n\"         \"sw a2,  4 * 12(sp)\\n\"         \"sw a3,  4 * 13(sp)\\n\"         \"sw a4,  4 * 14(sp)\\n\"         \"sw a5,  4 * 15(sp)\\n\"         \"sw a6,  4 * 16(sp)\\n\"         \"sw a7,  4 * 17(sp)\\n\"         \"sw s0,  4 * 18(sp)\\n\"         \"sw s1,  4 * 19(sp)\\n\"         \"sw s2,  4 * 20(sp)\\n\"         \"sw s3,  4 * 21(sp)\\n\"         \"sw s4,  4 * 22(sp)\\n\"         \"sw s5,  4 * 23(sp)\\n\"         \"sw s6,  4 * 24(sp)\\n\"         \"sw s7,  4 * 25(sp)\\n\"         \"sw s8,  4 * 26(sp)\\n\"         \"sw s9,  4 * 27(sp)\\n\"         \"sw s10, 4 * 28(sp)\\n\"         \"sw s11, 4 * 29(sp)\\n\"          \"csrr a0, sscratch\\n\"         \"sw a0, 4 * 30(sp)\\n\"          \"mv a0, sp\\n\"         \"call handle_trap\\n\"          \"lw ra,  4 * 0(sp)\\n\"         \"lw gp,  4 * 1(sp)\\n\"         \"lw tp,  4 * 2(sp)\\n\"         \"lw t0,  4 * 3(sp)\\n\"         \"lw t1,  4 * 4(sp)\\n\"         \"lw t2,  4 * 5(sp)\\n\"         \"lw t3,  4 * 6(sp)\\n\"         \"lw t4,  4 * 7(sp)\\n\"         \"lw t5,  4 * 8(sp)\\n\"         \"lw t6,  4 * 9(sp)\\n\"         \"lw a0,  4 * 10(sp)\\n\"         \"lw a1,  4 * 11(sp)\\n\"         \"lw a2,  4 * 12(sp)\\n\"         \"lw a3,  4 * 13(sp)\\n\"         \"lw a4,  4 * 14(sp)\\n\"         \"lw a5,  4 * 15(sp)\\n\"         \"lw a6,  4 * 16(sp)\\n\"         \"lw a7,  4 * 17(sp)\\n\"         \"lw s0,  4 * 18(sp)\\n\"         \"lw s1,  4 * 19(sp)\\n\"         \"lw s2,  4 * 20(sp)\\n\"         \"lw s3,  4 * 21(sp)\\n\"         \"lw s4,  4 * 22(sp)\\n\"         \"lw s5,  4 * 23(sp)\\n\"         \"lw s6,  4 * 24(sp)\\n\"         \"lw s7,  4 * 25(sp)\\n\"         \"lw s8,  4 * 26(sp)\\n\"         \"lw s9,  4 * 27(sp)\\n\"         \"lw s10, 4 * 28(sp)\\n\"         \"lw s11, 4 * 29(sp)\\n\"         \"lw sp,  4 * 30(sp)\\n\"         \"sret\\n\"     ); }<\/code><\/pre>\n<p> <\/div>\n<\/p><\/div>\n<p> \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>sscratch<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0412\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u044d\u0442\u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. <\/li>\n<li>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043d\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u0445 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043e\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. <\/li>\n<li>\u0412 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <code>a0<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>handle_trap<\/code>. \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u0434\u0440\u0435\u0441, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0434\u0451\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u0447\u0442\u043e \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0434\u0430\u043b\u0435\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>trap_flame<\/code>. <\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>__attribute__((aligned(4)))<\/code> \u0432\u0435\u0434\u0451\u0442 \u043a \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0432 4 \u0431\u0430\u0439\u0442\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>stvec<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0444\u043b\u0430\u0433\u0438 \u0432 \u0434\u0432\u0443\u0445 \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0431\u0438\u0442\u0430\u0445, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c.<\/li>\n<\/ul>\n<p> <\/p>\n<blockquote><p><i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/i><\/p>\n<p> \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445 \u0438, \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0447\u0430\u0441\u0442\u0435\u0439 \u044f\u0434\u0440\u0430. \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u044f \u043a\u043e\u0434, \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a\u0435, \u0434\u0430\u0436\u0435 <code>sp<\/code> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>sscratch<\/code>.<\/p>\n<p> \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>a0<\/code>, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c \u0432\u0440\u043e\u0434\u0435 \u00ab\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d\u00bb. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0439\u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0441\u0443\u0431\u0431\u043e\u0442\u043d\u044e\u044e \u043d\u043e\u0447\u044c \u0437\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439.<\/p><\/blockquote>\n<p> \u0412 \u0442\u043e\u0447\u043a\u0435 \u0432\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>handle_trap<\/code>:<\/p>\n<pre><code class=\"cs\">kernel.c  void handle_trap(struct trap_frame *f) {     uint32_t scause = READ_CSR(scause);     uint32_t stval = READ_CSR(stval);     uint32_t user_pc = READ_CSR(sepc);      PANIC(\"unexpected trap scause=%x, stval=%x, sepc=%x\\n\", scause, stval, user_pc); }<\/code><\/pre>\n<p> \u041e\u043d\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043d\u0438\u043a\u0443 \u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<br \/> \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0432 <code>kernel.h<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">kernel.h<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">kernel.h  #include \"common.h\"  struct trap_frame {     uint32_t ra;     uint32_t gp;     uint32_t tp;     uint32_t t0;     uint32_t t1;     uint32_t t2;     uint32_t t3;     uint32_t t4;     uint32_t t5;     uint32_t t6;     uint32_t a0;     uint32_t a1;     uint32_t a2;     uint32_t a3;     uint32_t a4;     uint32_t a5;     uint32_t a6;     uint32_t a7;     uint32_t s0;     uint32_t s1;     uint32_t s2;     uint32_t s3;     uint32_t s4;     uint32_t s5;     uint32_t s6;     uint32_t s7;     uint32_t s8;     uint32_t s9;     uint32_t s10;     uint32_t s11;     uint32_t sp; } __attribute__((packed));  #define READ_CSR(reg)                                                          \\     ({                                                                         \\         unsigned long __tmp;                                                   \\         __asm__ __volatile__(\"csrr %0, \" #reg : \"=r\"(__tmp));                  \\         __tmp;                                                                 \\     })  #define WRITE_CSR(reg, value)                                                  \\     do {                                                                       \\         uint32_t __tmp = (value);                                              \\         __asm__ __volatile__(\"csrw \" #reg \", %0\" ::\"r\"(__tmp));                \\     } while (0)<\/code><\/pre>\n<p> <\/div>\n<\/p><\/div>\n<p> \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>trap_frame<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0435 \u0432 <code>kernel_entry<\/code>. \u041f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0435\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u044b <code>READ_CSR<\/code> \u0438 <code>WRITE_CSR<\/code> \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0447\u0442\u0435\u043d\u0438\u0435\\\u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 CSR.<\/p>\n<p> \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043d\u0443\u0436\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>stvec<\/code> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>kernel_main<\/code>:<\/p>\n<pre><code class=\"cs\">kernel.c  void kernel_main(void) {     memset(__bss, 0, (size_t) __bss_end - (size_t) __bss);      WRITE_CSR(stvec, (uint32_t) kernel_entry); \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e     __asm__ __volatile__(\"unimp\"); \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e<\/code><\/pre>\n<p> \u041f\u043e\u043c\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>stvec<\/code>, \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0441\u0435\u0432\u0434\u043e-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>unimp<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<blockquote><p><i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: unimp \u2013 \u044d\u0442\u043e \u00ab\u043f\u0441\u0435\u0432\u0434\u043e\u00bb-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/i><\/p>\n<p> \u0412 <a href=\"https:\/\/github.com\/riscv-non-isa\/riscv-asm-manual\/blob\/main\/src\/asm-manual.adoc#instruction-aliases\">RISC-V Assembly Manual<\/a> \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 <code>unimp<\/code> \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"plaintext\">csrrw x0, cycle, x0<\/code><\/pre>\n<p> \u041e\u043d\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>cycle<\/code> \u0432 <code>x0<\/code>. \u0418 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>cycle<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u044d\u0442\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043a\u0430\u043a \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0443\u044e \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/p><\/blockquote>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/font><\/h3>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"plaintext\">$ .\/run.sh Hello World! PANIC: kernel.c:47: unexpected trap scause=00000002, stval=ffffff84, sepc=8020015e<\/code><\/pre>\n<p> \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>scause<\/code> \u0440\u0430\u0432\u043d\u043e 2, \u044d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u00ab\u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u044b\u0442\u0430\u043b\u0430\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u0418 \u044d\u0442\u043e \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>unimp<\/code>.<\/p>\n<p> \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0443\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>sepc<\/code>. \u0415\u0441\u043b\u0438 \u043e\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>unimp<\/code>, \u0442\u043e \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<pre><code class=\"plaintext\">$ llvm-addr2line -e kernel.elf 8020015e \/Users\/seiya\/os-from-scratch\/kernel.c:129<\/code><\/pre>\n<p> <\/p>\n<h2><font color=\"#3AC1EF\">\u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438<\/font><\/h2>\n<p> \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0441\u043a\u0440\u0438\u043f\u0442\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u0430<\/font><\/h3>\n<p> \u041f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c:<\/p>\n<pre><code class=\"bash\">kernel.ld      . = ALIGN(4);     . += 128 * 1024; \/* 128KB *\/     __stack_top = .;      . = ALIGN(4096);     __free_ram = .;     . += 64 * 1024 * 1024; \/* 64MB *\/     __free_ram_end = .; }<\/code><\/pre>\n<p> \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u2014 <code>__free_ram<\/code> \u0438 <code>__free_ram_end<\/code> \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0435\u043a\u0430. \u0420\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 (64 \u041c\u0411) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u0435\u043d, \u0438 <code>. = ALIGN(4096)<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 4 \u041a\u0411.<\/p>\n<p> \u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u044d\u0442\u043e \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0436\u0451\u0441\u0442\u043a\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u043c\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0438\u0437\u0431\u0435\u0433\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u044f\u0434\u0440\u0430.<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0434 x86-64 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 UEFI <code>GetMemoryMap<\/code>).<\/p><\/blockquote>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432 \u043c\u0438\u0440\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438<\/font><\/h3>\n<p> \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u0435\u0451 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442 <code>malloc<\/code>, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u00ab\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\u00bb. \u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 4 \u041a\u0411 (4096 \u0431\u0430\u0439\u0442).<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> <code>4 \u041a\u0411 = 4096 = 0x1000<\/code> (\u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435). \u0417\u043d\u0430\u0447\u0438\u0442, \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0434\u0440\u0435\u0441\u0430 \u0431\u0443\u0434\u0443\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p><\/blockquote>\n<p> \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0430\u044f \u0434\u0430\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>alloc_pages<\/code> \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 <code>n<\/code> \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441:<\/p>\n<pre><code class=\"cs\">kernel.c  extern char __free_ram[], __free_ram_end[];  paddr_t alloc_pages(uint32_t n) {     static paddr_t next_paddr = (paddr_t) __free_ram;     paddr_t paddr = next_paddr;     next_paddr += n * PAGE_SIZE;      if (next_paddr &gt; (paddr_t) __free_ram_end)         PANIC(\"out of memory\");      memset((void *) paddr, 0, n * PAGE_SIZE);     return paddr; }<\/code><\/pre>\n<p> <code>PAGE_SIZE<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u043e \u0432 <code>common.h<\/code>:<\/p>\n<pre><code class=\"cs\">common.h  #define PAGE_SIZE 4096<\/code><\/pre>\n<p> \u0412\u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 <code>alloc_pages<\/code>:<\/p>\n<ul>\n<li><code>next_paddr<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>static<\/code>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043e\u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f.<\/li>\n<li><code>next_paddr<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u00ab\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\u00bb (\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438). \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 <code>next_paddr<\/code> \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443, \u0440\u0430\u0432\u043d\u0443\u044e \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.<\/li>\n<li><code>next_paddr<\/code> \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0430\u0434\u0440\u0435\u0441 <code>__free_ram<\/code>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 <code>__free_ram<\/code>.<\/li>\n<li><code>__free_ram<\/code>, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f <code>ALIGN(4096)<\/code> \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u0430, \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 4 \u041a\u0411. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>alloc_pages<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441, \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e 4 \u041a\u0411.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 <code>__free_ram_end<\/code>, \u0438\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0430\u043d\u0438\u043a\u0430 \u044f\u0434\u0440\u0430. <\/li>\n<li>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>memset<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442m \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u043d\u0443\u043b\u044f\u043c\u0438. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e.<\/li>\n<\/ul>\n<p> \u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u0432\u0440\u043e\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e? \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u0430 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f. \u0425\u043e\u0442\u044f \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u041e\u0421 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u043a \u00ab\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u00bb, \u0438 \u043e\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u043a\u043e\u0434\u0430.<\/p><\/blockquote>\n<p> \u041f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430 \u0431\u0430\u0437\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0438\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u043c\u0435\u0442\u043e\u0434 \u0431\u043b\u0438\u0437\u043d\u0435\u0446\u043e\u0432\u00bb.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438<\/font><\/h3>\n<p> \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438. \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 <code>kernel_main<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cs\">kernel.c  void kernel_main(void) {     memset(__bss, 0, (size_t) __bss_end - (size_t) __bss);      paddr_t paddr0 = alloc_pages(2);     paddr_t paddr1 = alloc_pages(1);     printf(\"alloc_pages test: paddr0=%x\\n\", paddr0);     printf(\"alloc_pages test: paddr1=%x\\n\", paddr1);      PANIC(\"booted!\"); }<\/code><\/pre>\n<p> \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 (<code>paddr0<\/code>) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0434\u0440\u0435\u0441\u0443 <code>__free_ram<\/code>, \u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 (<code>paddr1<\/code>) \u2014 \u0430\u0434\u0440\u0435\u0441\u0443, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u043d\u0430 8 \u041a\u0411 \u043f\u043e\u0437\u0430\u0434\u0438 <code>paddr0<\/code>:<\/p>\n<pre><code class=\"plaintext\">$ .\/run.sh Hello World! alloc_pages test: paddr0=80221000 alloc_pages test: paddr1=80223000<\/code><\/pre>\n<p> <\/p>\n<pre><code class=\"plaintext\">$ llvm-nm kernel.elf | grep __free_ram 80221000 R __free_ram 84221000 R __free_ram_end<\/code><\/pre>\n<p> <\/p>\n<h2><font color=\"#3AC1EF\">\u041f\u0440\u043e\u0446\u0435\u0441\u0441<\/font><\/h2>\n<p> \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u2014 \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<blockquote><p><i>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/i><\/p>\n<p> \u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u043f\u043e\u0442\u043e\u043a\u00bb. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432 \u044d\u0442\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u0430\u043a \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a.<\/p><\/blockquote>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0411\u043b\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c<\/font><\/h3>\n<p> \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0430\u044f \u043d\u0438\u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>process<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u043a\u0430\u043a \u00abProcess Control Block (PCB)\u00bb.<\/p>\n<pre><code class=\"cs\">#define PROCS_MAX 8       \/\/\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.  #define PROC_UNUSED   0   \/\/ \u041d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. #define PROC_RUNNABLE 1   \/\/ \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441.  struct process {     int pid;             \/\/ ID \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.     int state;           \/\/ \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: PROC_UNUSED \u0438\u043b\u0438 PROC_RUNNABLE     vaddr_t sp;          \/\/ \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430.     uint8_t stack[8192]; \/\/ \u0421\u0442\u0435\u043a \u044f\u0434\u0440\u0430. };<\/code><\/pre>\n<p> \u0421\u0442\u0435\u043a \u044f\u0434\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 (\u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0451\u043b \u0432\u044b\u0437\u043e\u0432) \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0432 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f\/\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430. <\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u00ab\u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430\u00bb. \u0412 \u043d\u0451\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (\u0438\u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u0430) \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0441\u0442\u0435\u043a \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440. \u0422\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/trustworthy.systems\/publications\/theses_public\/05\/Warton%3Abe.abstract\">seL4<\/a>.<\/p>\n<p> \u042d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0442\u0435\u043c \u00ab\u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b\u00bb \u0442\u0430\u043a\u0436\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0430\u0445 Go \u0438 Rust. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u043c\u0435, \u0438\u0449\u0438\u0442\u0435 \u0432 \u0441\u0435\u0442\u0438 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u00abstackless async\u00bb.<\/p><\/blockquote>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/font><\/h3>\n<p> \u0421\u043c\u0435\u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u00bb. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u044b \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>switch_context<\/code>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">kernel.c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">kernel.c  __attribute__((naked)) void switch_context(uint32_t *prev_sp,                                            uint32_t *next_sp) {     __asm__ __volatile__(         \/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0432 \u0441\u0442\u0435\u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.         \"addi sp, sp, -13 * 4\\n\" \/\/ \u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0441\u0442\u0435\u043a\u0430 \u0434\u043b\u044f 13 4-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.         \"sw ra,  0  * 4(sp)\\n\"   \/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.         \"sw s0,  1  * 4(sp)\\n\"         \"sw s1,  2  * 4(sp)\\n\"         \"sw s2,  3  * 4(sp)\\n\"         \"sw s3,  4  * 4(sp)\\n\"         \"sw s4,  5  * 4(sp)\\n\"         \"sw s5,  6  * 4(sp)\\n\"         \"sw s6,  7  * 4(sp)\\n\"         \"sw s7,  8  * 4(sp)\\n\"         \"sw s8,  9  * 4(sp)\\n\"         \"sw s9,  10 * 4(sp)\\n\"         \"sw s10, 11 * 4(sp)\\n\"         \"sw s11, 12 * 4(sp)\\n\"          \/\/ \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430.         \"sw sp, (a0)\\n\"         \/\/ *prev_sp = sp;         \"lw sp, (a1)\\n\"         \/\/ \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430 (sp) \u0441\u044e\u0434\u0430.          \/\/ \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.         \"lw ra,  0  * 4(sp)\\n\"  \/\/ \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.         \"lw s0,  1  * 4(sp)\\n\"         \"lw s1,  2  * 4(sp)\\n\"         \"lw s2,  3  * 4(sp)\\n\"         \"lw s3,  4  * 4(sp)\\n\"         \"lw s4,  5  * 4(sp)\\n\"         \"lw s5,  6  * 4(sp)\\n\"         \"lw s6,  7  * 4(sp)\\n\"         \"lw s7,  8  * 4(sp)\\n\"         \"lw s8,  9  * 4(sp)\\n\"         \"lw s9,  10 * 4(sp)\\n\"         \"lw s10, 11 * 4(sp)\\n\"         \"lw s11, 12 * 4(sp)\\n\"         \"addi sp, sp, 13 * 4\\n\"  \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u043b\u0438 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 13 4-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.         \"ret\\n\"     ); }<\/code><\/pre>\n<p> <\/div>\n<\/p><\/div>\n<p> <code>switch_context<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0432 \u0441\u0442\u0435\u043a, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0435\u043a\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432 <code>struct process<\/code>, \u043d\u043e \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0435.<\/p>\n<p> \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u2014 \u044d\u0442\u043e \u0442\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0447\u044c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412 RISC-V \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043e\u0442 <code>s0<\/code> \u0434\u043e <code>s11<\/code>. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <code>a0<\/code>, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u0438 \u043e\u043d\u043e \u0443\u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438\u043c \u0432 \u0441\u0442\u0435\u043a. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>switch_context<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.<\/p>\n<p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442 <code>naked<\/code> \u043f\u0440\u043e\u0441\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434, \u043a\u0440\u043e\u043c\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430. \u0412\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430.<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i> <\/p>\n<p> \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439\/\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 <a href=\"https:\/\/riscv.org\/wp-content\/uploads\/2015\/01\/riscv-calling.pdf\">\u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0438 \u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0445<\/a>, \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0434 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f. <\/p><\/blockquote>\n<p> \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, <code>create_process<\/code>. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0442\u043e\u0447\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>process<\/code>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">struct process<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">struct process procs[PROCS_MAX]; \/\/ \u0412\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438.  struct process *create_process(uint32_t pc) {     \/\/ \u041f\u043e\u0438\u0441\u043a \u0431\u043b\u043e\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.      struct process *proc = NULL;     int i;     for (i = 0; i &lt; PROCS_MAX; i++) {         if (procs[i].state == PROC_UNUSED) {             proc = &amp;procs[i];             break;         }     }      if (!proc)         PANIC(\"no free process slots\");      \/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0441\u0442\u0435\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 switch_context.     uint32_t *sp = (uint32_t *) &amp;proc-&gt;stack[sizeof(proc-&gt;stack)];     *--sp = 0;                      \/\/ s11     *--sp = 0;                      \/\/ s10     *--sp = 0;                      \/\/ s9     *--sp = 0;                      \/\/ s8     *--sp = 0;                      \/\/ s7     *--sp = 0;                      \/\/ s6     *--sp = 0;                      \/\/ s5     *--sp = 0;                      \/\/ s4     *--sp = 0;                      \/\/ s3     *--sp = 0;                      \/\/ s2     *--sp = 0;                      \/\/ s1     *--sp = 0;                      \/\/ s0     *--sp = (uint32_t) pc;          \/\/ ra      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0435\u0439.     proc-&gt;pid = i + 1;     proc-&gt;state = PROC_RUNNABLE;     proc-&gt;sp = (uint32_t) sp;     return proc; }<\/code><\/pre>\n<p> <\/div>\n<\/p><\/div>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/font><\/h3>\n<p> \u0412\u043e\u0442 \u043c\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">kernel.c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">kernel.c  void delay(void) {     for (int i = 0; i &lt; 30000000; i++)         __asm__ __volatile__(\"nop\"); \/\/ do nothing }  struct process *proc_a; struct process *proc_b;  void proc_a_entry(void) {     printf(\"starting process A\\n\");     while (1) {         putchar('A');         switch_context(&amp;proc_a-&gt;sp, &amp;proc_b-&gt;sp);         delay();     } }  void proc_b_entry(void) {     printf(\"starting process B\\n\");     while (1) {         putchar('B');         switch_context(&amp;proc_b-&gt;sp, &amp;proc_a-&gt;sp);         delay();     } }  void kernel_main(void) {     memset(__bss, 0, (size_t) __bss_end - (size_t) __bss);      WRITE_CSR(stvec, (uint32_t) kernel_entry);      proc_a = create_process((uint32_t) proc_a_entry);     proc_b = create_process((uint32_t) proc_b_entry);     proc_a_entry();      PANIC(\"unreachable here!\"); }<\/code><\/pre>\n<p> <\/div>\n<\/p><\/div>\n<p> \u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>proc_a_entry<\/code> \u0438 <code>proc_b_entry<\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0432\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 A \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 B \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>putchar<\/code> \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>switch_context<\/code>.<\/p>\n<p> \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>delay<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0439 \u0446\u0438\u043a\u043b, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>nop<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\u00bb. \u041e\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u0438\u043b \u044d\u0442\u043e\u0442 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u0439 \u0446\u0438\u043a\u043b. <\/p>\n<p> \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0447\u0435\u0440\u0435\u0434\u0430 <code>\u00abABABAB...\u00bb<\/code>:<\/p>\n<pre><code class=\"plaintext\">$ .\/run.sh  starting process A Astarting process B BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAQE<\/code><\/pre>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a<\/font><\/h3>\n<p> \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435 \u043c\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>switch_context<\/code> \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u00ab\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u00bb. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0418 \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u00ab\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u00bb, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u044f\u0434\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c.<\/p>\n<p> \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u044b \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0439 \u043d\u0438\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>yield<\/code>.<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0421\u043b\u043e\u0432\u043e \u00abyield\u00bb \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d\u0438 API, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443.<\/p><\/blockquote>\n<p> <\/p>\n<pre><code class=\"cs\">kernel.c  struct process *current_proc; \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. struct process *idle_proc;    \/\/ \u0411\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.  void yield(void) {     \/\/ \u041f\u043e\u0438\u0441\u043a \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.     struct process *next = idle_proc;     for (int i = 0; i &lt; PROCS_MAX; i++) {         struct process *proc = &amp;procs[(current_proc-&gt;pid + i) % PROCS_MAX];         if (proc-&gt;state == PROC_RUNNABLE &amp;&amp; proc-&gt;pid &gt; 0) {             next = proc;             break;         }     }      \/\/ \u0415\u0441\u043b\u0438 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0435\u0442, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.     if (next == current_proc)         return;      \/\/ \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.     struct process *prev = current_proc;     current_proc = next;     switch_context(&amp;prev-&gt;sp, &amp;next-&gt;sp); }<\/code><\/pre>\n<p> \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0432\u043e\u0434\u0438\u043c \u0434\u0432\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435: <code>current_proc<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 <code>idle_proc<\/code> \u2014 \u043d\u0430 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u00ab\u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u00bb. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>idle_proc<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441 ID <code>-1<\/code> \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">kernel.c  void kernel_main(void) {     memset(__bss, 0, (size_t) __bss_end - (size_t) __bss);      printf(\"\\n\\n\");      WRITE_CSR(stvec, (uint32_t) kernel_entry);      idle_proc = create_process((uint32_t) NULL);     idle_proc-&gt;pid = -1; \/\/ \u0411\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442.     current_proc = idle_proc;      proc_a = create_process((uint32_t) proc_a_entry);     proc_b = create_process((uint32_t) proc_b_entry);      yield();     PANIC(\"switched to idle process\"); }<\/code><\/pre>\n<p> \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u044d\u0442\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <code>current_proc = idle_proc<\/code>. \u041e\u043d \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0441\u044f \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>yield<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 A, \u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0431\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>yield<\/code>.<\/p>\n<p> \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 <code>proc_a_entry<\/code> \u0438 <code>proc_b_entry<\/code>, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>switch_context<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>yield<\/code>:<\/p>\n<pre><code class=\"cs\">kernel.c  void proc_a_entry(void) {     printf(\"starting process A\\n\");     while (1) {         putchar('A');         yield();     } }  void proc_b_entry(void) {     printf(\"starting process B\\n\");     while (1) {         putchar('B');         yield();     } }<\/code><\/pre>\n<p> \u0415\u0441\u043b\u0438 \u00abA\u00bb \u0438 \u00abB\u00bb \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u0438 \u043f\u0440\u0435\u0436\u0434\u0435, \u0437\u043d\u0430\u0447\u0438\u0442, \u0432\u0441\u0451 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439<\/font><\/h3>\n<p> \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p> \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <code>sscratch<\/code> \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u044f\u0434\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<pre><code class=\"cs\">kernel.c  void yield(void) {     \/* \u043a\u043e\u0434 \u043e\u043f\u0443\u0449\u0435\u043d *\/      __asm__ __volatile__(         \"csrw sscratch, %[sscratch]\\n\"         :         : [sscratch] \"r\" ((uint32_t) &amp;next-&gt;stack[sizeof(next-&gt;stack)])     );      \/\/ \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.     struct process *prev = current_proc;     current_proc = next;     switch_context(&amp;prev-&gt;sp, &amp;next-&gt;sp); }<\/code><\/pre>\n<p> \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u044f\u0434\u0440\u0430 \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 <code>sizeof(next-&gt;stack)<\/code>-\u0433\u043e \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p> \u0412 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">kernel.c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">kernel.c  void kernel_entry(void) {     __asm__ __volatile__(         \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u044f\u0434\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438\u0437 sscratch .         \"csrrw sp, sscratch, sp\\n\"          \"addi sp, sp, -4 * 31\\n\"         \"sw ra,  4 * 0(sp)\\n\"         \"sw gp,  4 * 1(sp)\\n\"         \"sw tp,  4 * 2(sp)\\n\"         \"sw t0,  4 * 3(sp)\\n\"         \"sw t1,  4 * 4(sp)\\n\"         \"sw t2,  4 * 5(sp)\\n\"         \"sw t3,  4 * 6(sp)\\n\"         \"sw t4,  4 * 7(sp)\\n\"         \"sw t5,  4 * 8(sp)\\n\"         \"sw t6,  4 * 9(sp)\\n\"         \"sw a0,  4 * 10(sp)\\n\"         \"sw a1,  4 * 11(sp)\\n\"         \"sw a2,  4 * 12(sp)\\n\"         \"sw a3,  4 * 13(sp)\\n\"         \"sw a4,  4 * 14(sp)\\n\"         \"sw a5,  4 * 15(sp)\\n\"         \"sw a6,  4 * 16(sp)\\n\"         \"sw a7,  4 * 17(sp)\\n\"         \"sw s0,  4 * 18(sp)\\n\"         \"sw s1,  4 * 19(sp)\\n\"         \"sw s2,  4 * 20(sp)\\n\"         \"sw s3,  4 * 21(sp)\\n\"         \"sw s4,  4 * 22(sp)\\n\"         \"sw s5,  4 * 23(sp)\\n\"         \"sw s6,  4 * 24(sp)\\n\"         \"sw s7,  4 * 25(sp)\\n\"         \"sw s8,  4 * 26(sp)\\n\"         \"sw s9,  4 * 27(sp)\\n\"         \"sw s10, 4 * 28(sp)\\n\"         \"sw s11, 4 * 29(sp)\\n\"          \/\/ \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 sp \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.         \"csrr a0, sscratch\\n\"         \"sw a0,  4 * 30(sp)\\n\"          \/\/ \u0421\u0431\u0440\u043e\u0441 \u0441\u0442\u0435\u043a\u0430 \u044f\u0434\u0440\u0430.         \"addi a0, sp, 4 * 31\\n\"         \"csrw sscratch, a0\\n\"          \"mv a0, sp\\n\"         \"call handle_trap\\n\"<\/code><\/pre>\n<p> \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>csrrw<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:<\/p>\n<pre><code class=\"plaintext\">tmp = sp; sp = sscratch; sscratch = tmp;<\/code><\/pre>\n<p> <\/div>\n<\/p><\/div>\n<p> \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u0435\u043f\u0435\u0440\u044c <code>sp<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430 (\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f) \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0435\u043f\u0435\u0440\u044c <code>sscratch<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>sp<\/code> (\u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f) \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p> \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u043c\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>sp<\/code> \u0438\u0437 <code>sscratch<\/code> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u0441\u0442\u0435\u043a. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>sscratch<\/code> \u0438 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e.<\/p>\n<p> \u0421\u0443\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430. \u041c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u0443\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c <code>sscratch<\/code> \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441 \u0442\u043e\u0447\u043a\u0438, \u0433\u0434\u0435 \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e, \u0431\u0443\u0434\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e.<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0412\u044b\u0448\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430 \u00ab\u044f\u0434\u0440\u0430\u00bb. \u0421\u0442\u0435\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u00ab\u0441\u0442\u0435\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u00bb) \u0431\u0443\u0434\u0435\u0442 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0438 \u0435\u0433\u043e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. <\/p><\/blockquote>\n<h3><font color=\"#3AC1EF\">\u258d \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435: \u00ab\u0417\u0430\u0447\u0435\u043c \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430?\u00bb<\/font><\/h3>\n<p> \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430, \u043c\u0435\u043d\u044f\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>sscratch<\/code>.<\/p>\n<p> \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0418 \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f:<\/p>\n<ol>\n<li>\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u044f\u0434\u0440\u0430.<\/li>\n<li>\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u044f\u0434\u0440\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435).<\/li>\n<li>\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/li>\n<\/ol>\n<p> \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0430\u043d\u0438\u043a\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<p> \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 <code>sp<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043a \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b (\u0434\u043e\u0432\u0435\u0440\u044f\u043b) <code>sp<\/code> \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0432\u0435\u0434\u0443\u0449\u0430\u044f \u043a \u0441\u0431\u043e\u044e \u044f\u0434\u0440\u0430.<\/p>\n<p> \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0433\u043b\u0430\u0432\u044b \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430:<\/p>\n<pre><code class=\"cs\">\/\/ \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. #include \"user.h\"  void main(void) {     __asm__ __volatile__(         \"li sp, 0xdeadbeef\\n\"  \/\/ \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 sp \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430.         \"unimp\"                \/\/ \u0412\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.     ); }<\/code><\/pre>\n<p> \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u043d\u0435 \u0432\u043d\u043e\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u044b (\u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0435\u0437 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u044f\u0434\u0440\u0430 \u0438\u0437 <code>sscratch<\/code>), \u0442\u043e \u044f\u0434\u0440\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u043b\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 QEMU \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"plaintext\">epc:0x0100004e, tval:0x00000000, desc=illegal_instruction &lt;- unimp \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. epc:0x802009dc, tval:0xdeadbe73, desc=store_page_fault &lt;- \u043e\u0442\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0442\u0435\u043a (0xdeadbeef) epc:0x802009dc, tval:0xdeadbdf7, desc=store_page_fault &lt;- \u043e\u0442\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0442\u0435\u043a (0xdeadbeef) (2) epc:0x802009dc, tval:0xdeadbd7b, desc=store_page_fault &lt;- \u043e\u0442\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0442\u0435\u043a (0xdeadbeef) (3) epc:0x802009dc, tval:0xdeadbcff, desc=store_page_fault &lt;- \u043e\u0442\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0442\u0435\u043a (0xdeadbeef) (4) ...<\/code><\/pre>\n<p> \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0437-\u0437\u0430 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u043f\u0441\u0435\u0432\u0434\u043e-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>unimp<\/code>, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u044f\u0434\u0440\u0430. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u0432\u0435\u0434\u0451\u0442 \u043a \u043d\u0435\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 (<code>0xdeadbeef<\/code>), \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0432\u0435\u0434\u0443\u0449\u0435\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435 \u044f\u0434\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u043a\u0430 \u0438\u0437 <code>sscratch<\/code>.<\/p>\n<p> \u0415\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0412 \u0432\u0435\u0440\u0441\u0438\u0438 <code>xv6<\/code> \u0434\u043b\u044f RISC-V (\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f UNIX-\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u041e\u0421) \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f 1 \u0438 2 (<code><a href=\"https:\/\/github.com\/mit-pdos\/xv6-riscv\/blob\/f5b93ef12f7159f74f80f94729ee4faabe42c360\/kernel\/kernelvec.S#L13-L14\">kernelvec<\/a><\/code>) \u0438 \u0441\u0432\u043e\u0439 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f 3 (<code><a href=\"https:\/\/github.com\/mit-pdos\/xv6-riscv\/blob\/f5b93ef12f7159f74f80f94729ee4faabe42c360\/kernel\/trampoline.S#L74-L75\">uservec<\/a><\/code>). \u041f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 <a href=\"https:\/\/github.com\/mit-pdos\/xv6-riscv\/blob\/f5b93ef12f7159f74f80f94729ee4faabe42c360\/kernel\/trap.c#L44-L46\">\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f<\/a> \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435\/\u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u044f\u0434\u0440\u0430. <\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0412 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 Google \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Fuchsia \u0431\u044b\u043b \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 API, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u0441\u0442\u0430\u043b <a href=\"https:\/\/blog.quarkslab.com\/playing-around-with-the-fuchsia-operating-system.html\">\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c\u044e<\/a>. \u0412 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u044f\u0434\u0440\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0441 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0438\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u0432\u043e\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439).<\/p><\/blockquote>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0448\u0430\u0433\u0438<\/font><\/h3>\n<p> \u0412\u043e\u0442 \u043c\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u0443\u044e \u041e\u0421, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<p> \u041a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\/\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u044f\u0434\u0440\u0430, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043e\u043f\u0430\u0441\u043d\u043e. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0433\u043b\u0430\u0432\u0430\u0445 \u0432 \u0446\u0435\u043b\u044f\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0442 \u044f\u0434\u0440\u0430.<\/p>\n<h2><font color=\"#3AC1EF\">\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/font><\/h2>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f<\/font><\/h3>\n<p> \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441) \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441. \u0422\u0430\u0431\u043b\u0438\u0446\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0442\u0430\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e\u0442\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044f\u0434\u0440\u0430 \u043e\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p> \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430<\/font><\/h3>\n<p> \u0412 \u044d\u0442\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 Sv32, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0434\u0432\u0443\u0445\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u0412 \u043d\u0435\u0439 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (<code>VPN[1]<\/code>), \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (<code>VPN[0]<\/code>) \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.<\/p>\n<p> \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/riscv-sv32-virtual-address.vercel.app\/\">RISC-V Sv-32 Virtual Address Breakdown<\/a>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p> \u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tbody>\n<tr>\n<td><b>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441<\/b><\/td>\n<td><b>VPN[1] (10 \u0431\u0438\u0442)<\/b><\/td>\n<td><b>VPN[0] (10 \u0431\u0438\u0442)<\/b><\/td>\n<td><b>\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 (12 \u0431\u0438\u0442)<\/b><\/td>\n<\/tr>\n<tr>\n<td>0x1000_0000 <\/td>\n<td>0x040<\/td>\n<td>0x000<\/td>\n<td>0x000<\/td>\n<\/tr>\n<tr>\n<td>0x1000_0000 <\/td>\n<td>0x040<\/td>\n<td>0x000<\/td>\n<td>0x000<\/td>\n<\/tr>\n<tr>\n<td>0x1000_1000 <\/td>\n<td>0x040<\/td>\n<td>0x001<\/td>\n<td>0x000<\/td>\n<\/tr>\n<tr>\n<td>0x1000_f000 <\/td>\n<td>0x040<\/td>\n<td>0x00f<\/td>\n<td>0x000<\/td>\n<\/tr>\n<tr>\n<td>0x2000_f0ab <\/td>\n<td>0x080<\/td>\n<td>0x00f<\/td>\n<td>0x0ab<\/td>\n<\/tr>\n<tr>\n<td>0x2000_f012 <\/td>\n<td>0x080<\/td>\n<td>0x00f<\/td>\n<td>0x012<\/td>\n<\/tr>\n<tr>\n<td>0x2000_f034 <\/td>\n<td>0x080<\/td>\n<td>0x00f<\/td>\n<td>0x045<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p> <\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0418\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432\u044b\u0448\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u0431\u0438\u0442\u043e\u0432 (<code>VPN[0]<\/code>) \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0434\u043b\u044f \u0431\u043b\u0438\u0437\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.<\/li>\n<li>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u0431\u0438\u0442\u043e\u0432 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0438 \u043d\u0430 <code>VPN[1]<\/code>, \u043d\u0438 \u043d\u0430 <code>VPN[0]<\/code>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 4 \u041a\u0411 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<\/li>\n<\/ul>\n<p> \u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Locality_of_reference\">\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 (Translation Lookaside Buffer, TLB).<\/p><\/blockquote>\n<p> \u041e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 <code>VPN[1]<\/code> \u0438 <code>VPN[0]<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043d\u0435\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 <code>offset<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/font><\/h3>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 Sv32. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0430\u043a\u0440\u043e\u0441. <code>SATP_SV32<\/code> \u2014 \u044d\u0442\u043e \u0431\u0438\u0442 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <code>satp<\/code>, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u00ab\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Sv32\u00bb, \u0430 <code>PAGE_*<\/code> \u2014 \u044d\u0442\u043e \u0444\u043b\u0430\u0433\u0438, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u0437\u0430\u043f\u0438\u0441\u044f\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<pre><code class=\"cs\">kernel.h  #define SATP_SV32 (1u &lt;&lt; 31) #define PAGE_V    (1 &lt;&lt; 0)   \/\/ \u0431\u0438\u0442 \"Valid\" (\u0437\u0430\u043f\u0438\u0441\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u0430) #define PAGE_R    (1 &lt;&lt; 1)   \/\/ \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f #define PAGE_W    (1 &lt;&lt; 2)   \/\/ \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 #define PAGE_X    (1 &lt;&lt; 3)   \/\/ \u0418\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0430\u044f #define PAGE_U    (1 &lt;&lt; 4)   \/\/ \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f)<\/code><\/pre>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/font><\/h3>\n<p> \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0430\u044f \u0434\u0430\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>map_page<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (<code>table1<\/code>), \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 (<code>vaddr<\/code>), \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 (<code>paddr<\/code>) \u0438 \u0444\u043b\u0430\u0433\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (<code>flags<\/code>):<\/p>\n<pre><code class=\"cs\">kernel.c  void map_page(uint32_t *table1, uint32_t vaddr, paddr_t paddr, uint32_t flags) {     if (!is_aligned(vaddr, PAGE_SIZE))         PANIC(\"unaligned vaddr %x\", vaddr);      if (!is_aligned(paddr, PAGE_SIZE))         PANIC(\"unaligned paddr %x\", paddr);      uint32_t vpn1 = (vaddr &gt;&gt; 22) &amp; 0x3ff;     if ((table1[vpn1] &amp; PAGE_V) == 0) {         \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c 2-\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446.         uint32_t pt_paddr = alloc_pages(1);         table1[vpn1] = ((pt_paddr \/ PAGE_SIZE) &lt;&lt; 10) | PAGE_V;     }      \/\/ \u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 2-\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043a\u0430\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0443\u044e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.     uint32_t vpn0 = (vaddr &gt;&gt; 12) &amp; 0x3ff;     uint32_t *table0 = (uint32_t *) ((table1[vpn1] &gt;&gt; 10) * PAGE_SIZE);     table0[vpn0] = ((paddr \/ PAGE_SIZE) &lt;&lt; 10) | flags | PAGE_V; }<\/code><\/pre>\n<p> \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0435\u0451 \u0437\u0430\u043f\u0438\u0441\u044c. <br \/> \u041e\u043d\u0430 \u0434\u0435\u043b\u0438\u0442 <code>paddr<\/code> \u043d\u0430 <code>PAGE_SIZE<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0430 \u043d\u0435 \u0441\u0430\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441. \u041d\u0435 \u043f\u0443\u0442\u0430\u0439\u0442\u0435 \u044d\u0442\u0438 \u0432\u0435\u0449\u0438.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u044f\u0434\u0440\u0430<\/font><\/h3>\n<p> \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f), \u043d\u043e \u0438 \u0434\u043b\u044f \u044f\u0434\u0440\u0430.<\/p>\n<p> \u0412 \u044d\u0442\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u044f\u0434\u0440\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c <code>vaddr == paddr<\/code>). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u043a\u043e\u0434\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p> \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u0432 \u043d\u0451\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u044f\u0434\u0440\u043e\u043c (<code>__kernel_base<\/code>):<\/p>\n<pre><code class=\"plaintext\">kernel.ld  ENTRY(boot)  SECTIONS {     . = 0x80200000;     __kernel_base = .;<\/code><\/pre>\n<p> <\/p>\n<blockquote><p><i>\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435<\/i><\/p>\n<p> \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 <code>__kernel_base<\/code> \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 <code>. = 0x80200000<\/code>. \u0415\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>__kernel_base<\/code> \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u0435\u0432\u044b\u043c.<\/p><\/blockquote>\n<p> \u0414\u0430\u043b\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.<\/p>\n<pre><code class=\"cs\">kernel.h  struct process {     int pid;     int state;     vaddr_t sp;     uint32_t *page_table;     uint8_t stack[8192]; };<\/code><\/pre>\n<p> \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u044f\u0434\u0440\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>create_process<\/code>. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u044f\u0434\u0440\u0430 \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043e\u0442 <code>__kernel_base<\/code> \u0434\u043e <code>__free_ram_end<\/code>. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u044f\u0434\u0440\u0443 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c (\u0432\u0440\u043e\u0434\u0435 <code>.text<\/code>), \u0442\u0430\u043a \u0438 \u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>alloc_pages<\/code>:<\/p>\n<pre><code class=\"cs\">kernel.c  extern char __kernel_base[];  struct process *create_process(uint32_t pc) {     \/* \u043a\u043e\u0434 \u043e\u043f\u0443\u0449\u0435\u043d *\/      \/\/ \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u044f\u0434\u0440\u0430.     uint32_t *page_table = (uint32_t *) alloc_pages(1);     for (paddr_t paddr = (paddr_t) __kernel_base;          paddr &lt; (paddr_t) __free_ram_end; paddr += PAGE_SIZE)         map_page(page_table, paddr, paddr, PAGE_R | PAGE_W | PAGE_X);      proc-&gt;pid = i + 1;     proc-&gt;state = PROC_RUNNABLE;     proc-&gt;sp = (uint32_t) sp;     proc-&gt;page_table = page_table;     return proc; }<\/code><\/pre>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/font><\/h3>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<pre><code class=\"cs\">kernel.c  void yield(void) {     \/* \u043a\u043e\u0434 \u043e\u043f\u0443\u0449\u0435\u043d *\/      __asm__ __volatile__(         \"sfence.vma\\n\"         \"csrw satp, %[satp]\\n\"         \"sfence.vma\\n\"         \"csrw sscratch, %[sscratch]\\n\"         :         \/\/ \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u0432 \u043a\u043e\u043d\u0446\u0435!         : [satp] \"r\" (SATP_SV32 | ((uint32_t) next-&gt;page_table \/ PAGE_SIZE)),           [sscratch] \"r\" ((uint32_t) &amp;next-&gt;stack[sizeof(next-&gt;stack)])     );      switch_context(&amp;prev-&gt;sp, &amp;next-&gt;sp); }<\/code><\/pre>\n<p> \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432 <code>satp<\/code>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0438\u043c \u043d\u0430 <code>PAGE_SIZE<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<\/p>\n<p> \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>sfence.vma<\/code> \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u0432\u0443\u043c \u0446\u0435\u043b\u044f\u043c:<\/p>\n<ol>\n<li>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u044b\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u043c\u0438 (\u0430\u043d\u0430\u043b\u043e\u0433 \u0431\u0430\u0440\u044c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438).<\/li>\n<li>\u0414\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043a\u044d\u0448\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (TLB).<\/li>\n<\/ol>\n<p> <\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i> <\/p>\n<p> \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044f\u0434\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 (\u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>satp<\/code> \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d), \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 \u0440\u043e\u043b\u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445. <\/p><\/blockquote>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438<\/font><\/h3>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<pre><code class=\"plaintext\">$ .\/run.sh  starting process A Astarting process B BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB<\/code><\/pre>\n<p> \u0412\u044b\u0432\u043e\u0434 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0443 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0414\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e. \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u044b \u043f\u0440\u043e\u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 QEMU.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/font><\/h3>\n<p> \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0440\u044f\u0434\u043e\u043c \u0441 <code>0x80000000<\/code>. \u041f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b <code>(virtual address) == (physical address)<\/code>.<\/p>\n<pre><code class=\"plaintext\">QEMU 8.0.2 monitor - type 'help' for more information (qemu) stop (qemu) info registers  ...  satp     80080253  ...<\/code><\/pre>\n<p> \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e <code>satp<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>0x80080253<\/code>. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u0440\u0435\u0436\u0438\u043c Sv32 \u0432 RISC-V), \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f: (<code>0x80080253 &amp; 0x3fffff) * 4096 = 0x80253000<\/code>.<\/p>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 <code>0x80000000<\/code>. QEMU \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 (\u0434\u0430\u043c\u043f\u0430 \u043f\u0430\u043c\u044f\u0442\u0438). \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>xp<\/code> \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443. \u041c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0430\u043c\u043f 512-\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0442\u0430\u043a \u043a\u0430\u043a <code>0x80000000 &gt;&gt; 22 = 512<\/code>. \u0418 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 4 \u0431\u0430\u0439\u0442\u0430, \u043c\u044b \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 4:<\/p>\n<pre><code class=\"plaintext\">(qemu) xp \/x 0x80253000+512*4 0000000080253800: 0x20095001<\/code><\/pre>\n<p> \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441, \u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041e\u043f\u0446\u0438\u044f <code>\/x<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u044b\u0432\u043e\u0434 \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u043f\u0435\u0440\u0435\u0434 <code>x<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>\/1024x<\/code>) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439.<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>x<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>xp<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0430\u043c\u043f \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430. \u042d\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439), \u0433\u0434\u0435, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u044f\u0434\u0440\u0430, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c.<\/p><\/blockquote>\n<p> \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 (<code>0x20095000 &gt;&gt; 10) * 4096 = 0x80254000<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0432\u0441\u044e \u0435\u0451 \u0432\u044b\u0432\u0435\u0434\u0435\u043c (1024 \u0437\u0430\u043f\u0438\u0441\u0438):<\/p>\n<pre><code class=\"plaintext\">(qemu) xp \/1024x 0x80254000 0000000080254000: 0x00000000 0x00000000 0x00000000 0x00000000 0000000080254010: 0x00000000 0x00000000 0x00000000 0x00000000 0000000080254020: 0x00000000 0x00000000 0x00000000 0x00000000 0000000080254030: 0x00000000 0x00000000 0x00000000 0x00000000 ... 00000000802547f0: 0x00000000 0x00000000 0x00000000 0x00000000 0000000080254800: 0x2008004f 0x2008040f 0x2008080f 0x20080c0f 0000000080254810: 0x2008100f 0x2008140f 0x2008180f 0x20081c0f 0000000080254820: 0x2008200f 0x2008240f 0x2008280f 0x20082c0f 0000000080254830: 0x2008300f 0x2008340f 0x2008380f 0x20083c0f 0000000080254840: 0x200840cf 0x2008440f 0x2008484f 0x20084c0f 0000000080254850: 0x200850cf 0x2008540f 0x200858cf 0x20085c0f 0000000080254860: 0x2008600f 0x2008640f 0x2008680f 0x20086c0f 0000000080254870: 0x2008700f 0x2008740f 0x2008780f 0x20087c0f 0000000080254880: 0x200880cf 0x2008840f 0x2008880f 0x20088c0f ...<\/code><\/pre>\n<p> \u041f\u0435\u0440\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043d\u0443\u043b\u044f\u043c\u0438, \u043d\u043e \u0441 512-\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 (<code>254800<\/code>) \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>__kernel_base<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0434\u0440\u0435\u0441\u0443 <code>0x80200000<\/code>, \u0430 <code>VPN[1]<\/code> \u2014 <code>0x200<\/code>.<\/p>\n<p> \u041c\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u0430\u043c\u043f \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u0432 QEMU \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0444\u043e\u0440\u043c\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>info mem<\/code>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u044b\u0432\u043e\u0434 info mem<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">(qemu) info mem vaddr    paddr            size     attr -------- ---------------- -------- ------- 80200000 0000000080200000 00001000 rwx--a- 80201000 0000000080201000 0000f000 rwx---- 80210000 0000000080210000 00001000 rwx--ad 80211000 0000000080211000 00001000 rwx---- 80212000 0000000080212000 00001000 rwx--a- 80213000 0000000080213000 00001000 rwx---- 80214000 0000000080214000 00001000 rwx--ad 80215000 0000000080215000 00001000 rwx---- 80216000 0000000080216000 00001000 rwx--ad 80217000 0000000080217000 00009000 rwx---- 80220000 0000000080220000 00001000 rwx--ad 80221000 0000000080221000 0001f000 rwx---- 80240000 0000000080240000 00001000 rwx--ad 80241000 0000000080241000 001bf000 rwx---- 80400000 0000000080400000 00400000 rwx---- 80800000 0000000080800000 00400000 rwx---- 80c00000 0000000080c00000 00400000 rwx---- 81000000 0000000081000000 00400000 rwx---- 81400000 0000000081400000 00400000 rwx---- 81800000 0000000081800000 00400000 rwx---- 81c00000 0000000081c00000 00400000 rwx---- 82000000 0000000082000000 00400000 rwx---- 82400000 0000000082400000 00400000 rwx---- 82800000 0000000082800000 00400000 rwx---- 82c00000 0000000082c00000 00400000 rwx---- 83000000 0000000083000000 00400000 rwx---- 83400000 0000000083400000 00400000 rwx---- 83800000 0000000083800000 00400000 rwx---- 83c00000 0000000083c00000 00400000 rwx---- 84000000 0000000084000000 00241000 rwx----<\/code><\/pre>\n<p> <\/div>\n<\/p><\/div>\n<p> \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0440\u0430\u0437\u043c\u0435\u0440 (\u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u0430\u0445) \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b.<\/p>\n<p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c <code>r<\/code> (\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f), <code>w<\/code> (\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438), <code>x<\/code> (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439), <code>a<\/code> (\u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0439) \u0438 <code>d<\/code> (\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439). \u0417\u0434\u0435\u0441\u044c <code>a<\/code> \u0438 <code>d<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u00ab\u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u00bb \u0438 \u00ab\u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\u00bb \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412\u0441\u0451 \u044d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u041e\u0421 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f\/\u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<blockquote><p><i>\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430<\/i><\/p>\n<p> \u0414\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0442\u0440\u0443\u0434\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0441\u0451 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u00ab\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435: \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\u00bb.<\/p><\/blockquote>\n<p> <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435: \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438<\/font><\/h3>\n<p> \u041d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043b\u0435\u0433\u043a\u043e, \u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c. \u0422\u0430\u043a \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<h4><font color=\"#3AC1EF\">\u258d \u0417\u0430\u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438<\/font><\/h4>\n<p> \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0435\u0436\u0438\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 <code>satp<\/code>:<\/p>\n<pre><code class=\"cs\">kernel.c      __asm__ __volatile__(         \"sfence.vma\\n\"         \"csrw satp, %[satp]\\n\"         \"sfence.vma\\n\"         :         : [satp] \"r\" (((uint32_t) next-&gt;page_table \/ PAGE_SIZE)) \/\/ Missing SATP_SV32!     );<\/code><\/pre>\n<p> \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u041e\u0421 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0436\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d, \u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435.<\/p>\n<p> \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 QEMU \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>info mem<\/code>. \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"plaintext\">(qemu) info mem No translation or protection<\/code><\/pre>\n<p> <\/p>\n<h4><font color=\"#3AC1EF\">\u258d \u0423\u043a\u0430\u0437\u0430\u043b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/font><\/h4>\n<p> \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446:<\/p>\n<pre><code class=\"cs\">kernel.c      __asm__ __volatile__(         \"sfence.vma\\n\"         \"csrw satp, %[satp]\\n\"         \"sfence.vma\\n\"         :         : [satp] \"r\" (SATP_SV32 | ((uint32_t) next-&gt;page_table)) \/\/ \u0417\u0430\u0431\u044b\u043b\u0438 \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f!     );<\/code><\/pre>\n<p> \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>info mem<\/code> \u043d\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446:<\/p>\n<pre><code class=\"plaintext\">$ .\/run.sh  QEMU 8.0.2 monitor - type 'help' for more information (qemu) stop (qemu) info mem vaddr    paddr            size     attr -------- ---------------- -------- -------<\/code><\/pre>\n<p> \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<pre><code class=\"plaintext\">(qemu) info registers  CPU#0  V      =   0  pc       80200188  ...  scause   0000000c  ...<\/code><\/pre>\n<p> \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e <code>llvm-addr2line<\/code>, <code>80200188<\/code> \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 <code>scause<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u00ab\u043e\u0442\u043a\u0430\u0437\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\u00bb.<\/p>\n<p> \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u043e\u0442\u043a\u0440\u044b\u0432 \u043b\u043e\u0433\u0438 QEMU:<\/p>\n<pre><code class=\"plaintext\">run.sh bash $QEMU -machine virt -bios default -nographic -serial mon:stdio --no-reboot \\     -d unimp,guest_errors,int,cpu_reset -D qemu.log \\  # new!     -kernel kernel.elf Invalid read at addr 0x253000800, size 4, region '(null)', reason: rejected riscv_cpu_do_interrupt: hart:0, async:0, cause:0000000c, epc:0x80200580, tval:0x80200580, desc=exec_page_fault Invalid read at addr 0x253000800, size 4, region '(null)', reason: rejected riscv_cpu_do_interrupt: hart:0, async:0, cause:0000000c, epc:0x80200188, tval:0x80200188, desc=exec_page_fault Invalid read at addr 0x253000800, size 4, region '(null)', reason: rejected riscv_cpu_do_interrupt: hart:0, async:0, cause:0000000c, epc:0x80200188, tval:0x80200188, desc=exec_page_fault<\/code><\/pre>\n<p> \u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u044d\u0442\u0438\u0445 \u043b\u043e\u0433\u043e\u0432:<\/p>\n<ul>\n<li><code>epc<\/code>, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437-\u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0434\u0440\u0435\u0441\u0443 <code>0x80200580<\/code>. <code>llvm-objdump<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0438\u0434\u0443\u0449\u0443\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>satp<\/code>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u043a\u0430\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0440\u0435\u0436\u0438\u043c\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/li>\n<li>\u0412\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>0x80200188<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0422\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u0438 \u044d\u0442\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f, \u044d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u043e\u0442\u043a\u0430\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446) \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.<\/li>\n<li>\u0412\u044b\u0432\u043e\u0434 <code>info registers<\/code> \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 QEMU \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e <code>satp<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>0x80253000<\/code>. \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u0451\u0442 <code>(0x80253000 &amp; 0x3fffff) * 4096 = 0x253000000<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u042d\u0442\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/li>\n<\/ul>\n<p> \u041f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u0438\u0442\u043e\u0433. \u041f\u043e\u043d\u044f\u0442\u044c, \u0432 \u0447\u0451\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u043e\u0433\u043e\u0432 QEMU, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u043c\u043f\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u044d\u0442\u043e \u00ab\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e\u00bb. \u0412\u0435\u0434\u044c \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0439 \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u0430\u044e\u0442, \u043b\u0438\u0431\u043e \u0442\u043e\u043b\u043a\u0443\u044e\u0442 \u0435\u0451 \u043d\u0435\u0432\u0435\u0440\u043d\u043e.<\/p>\n<p> \u041d\u0430 \u044d\u0442\u043e\u043c \u0442\u0440\u0435\u0442\u044c\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u041e\u0421 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. <\/p>\n<p> \u0414\u043e \u0441\u043a\u043e\u0440\u043e\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0438!<\/p>\n<blockquote><p><b><font color=\"#3AC1EF\"><a href=\"https:\/\/t.me\/ruvds_community\">Telegram-\u043a\u0430\u043d\u0430\u043b \u0441\u043e \u0441\u043a\u0438\u0434\u043a\u0430\u043c\u0438, \u0440\u043e\u0437\u044b\u0433\u0440\u044b\u0448\u0430\u043c\u0438 \u043f\u0440\u0438\u0437\u043e\u0432 \u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 IT \ud83d\udcbb<\/a><\/font><\/b><\/p><\/blockquote>\n<p><a href=\"https:\/\/ruvds.com\/drive?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=Bright_Translate&amp;utm_content=operacionnaya_sistema_v_1_000_strokax_koda_chast_3\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/tp\/sk\/z-\/tpskz-7w7a8e74isoowuep40xeg.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/tp\/sk\/z-\/tpskz-7w7a8e74isoowuep40xeg.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/876360\/\"> https:\/\/habr.com\/ru\/articles\/876360\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/876360\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/7u\/l1\/9e\/7ul19eer6syvbsa41ly4kbbhg9u.png\" data-src=\"https:\/\/habrastorage.org\/webt\/7u\/l1\/9e\/7ul19eer6syvbsa41ly4kbbhg9u.png\"\/><\/div>\n<p><\/a><br \/> \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u044c\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u041e\u0421. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0435\u0451 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u0432\u044b\u0448\u0435\u0434\u0448\u0438\u043c \u0447\u0430\u0441\u0442\u044f\u043c<\/font><\/h2>\n<p> <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/874154\/\">\u0427\u0430\u0441\u0442\u044c 1<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/875776\/\">\u0427\u0430\u0441\u0442\u044c 2<\/a><\/li>\n<li>\u0427\u0430\u0441\u0442\u044c 3 &lt; \u2014 \u0432\u044b \u0437\u0434\u0435\u0441\u044c<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-446838","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/446838","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=446838"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/446838\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=446838"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=446838"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=446838"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}