{"id":498519,"date":"2026-10-13T20:26:27","date_gmt":"2026-10-13T17:26:27","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=498519"},"modified":"2026-10-13T20:26:27","modified_gmt":"2026-10-13T17:26:27","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=498519","title":{"rendered":"\u0421\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u0439 Ctrl+C \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u0430\u0441\u043b\u0430 VM, \u0430 \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043b\u0441\u044f sleep: Java, KVM \u0438 Linux"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u0430\u043a \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043f\u0443\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 Java, UART, KVM \u0438 Linux \u2014 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u044b\u0439 IRQ \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 Java \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b Linux. \u042f\u0434\u0440\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u043e\u0441\u044c \u0447\u0435\u0440\u0435\u0437 KVM, BusyBox \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443, \u0447\u0435\u0440\u0435\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u043b\u044c\u0448\u0435 \u2014 <code>sleep 30<\/code> \u0438\u043b\u0438 <code>ls -R \/<\/code>. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0434\u043e\u0435\u0434\u0430\u0435\u0442, \u0440\u0443\u043a\u0430 \u0441\u0430\u043c\u0430 \u0442\u044f\u043d\u0435\u0442\u0441\u044f \u043a <code>Ctrl+C<\/code>. \u041d\u0430\u0436\u0438\u043c\u0430\u044e \u2014 \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0433\u0430\u0441\u043d\u0435\u0442 \u0432\u0441\u044f VM. \u041a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c <code>sleep<\/code> \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u043b\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440.<\/p>\n<p>\u0421 \u043f\u0435\u0440\u0432\u044b\u043c \u0441\u0431\u043e\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e: <code>Ctrl+C<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u041e\u0421, \u043f\u043e\u0441\u044b\u043b\u0430\u044f <code>SIGINT<\/code> \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 JVM. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b <code>sleep 30<\/code>, \u043d\u0430\u0436\u0430\u043b <code>Ctrl+C<\/code>\u2026 \u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043d\u0438\u0447\u0435\u0433\u043e. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0436\u0438\u043b\u0430, \u043d\u043e \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u0445\u043e\u0436\u0435, \u043f\u0440\u0438\u043e\u0431\u0440\u0451\u043b \u0438\u043c\u043c\u0443\u043d\u0438\u0442\u0435\u0442 \u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044e.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u0432\u0432\u043e\u0434\u0430: \u043e\u0442 \u0431\u0430\u0439\u0442\u0430 <code>0x03<\/code> \u0432 Java \u0447\u0435\u0440\u0435\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 UART \u0438 <code>KVM_IRQ_LINE<\/code> \u0434\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 Linux, TTY \u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0448\u043b\u0430\u0441\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043b \u0435\u0451 \u0438\u0441\u043a\u0430\u0442\u044c \u2014 \u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u0445\u043e\u0434 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0438 \u0432\u043d\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0441\u0442\u0430\u0445, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 CLI \u0438 \u043b\u044e\u0431\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u0434\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0434\u043e\u0445\u043e\u0434\u0438\u0442, \u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0435\u0442.<\/p>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442: <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/tree\/v0.1.0\" rel=\"noopener nofollow\">PanamaKVM<\/a> \u2014 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 Java VMM, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 Linux KVM \u0447\u0435\u0440\u0435\u0437 FFM API, \u0431\u0435\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 JNI-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041a\u0430\u043a \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 Linux \u0438 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/1092050\/\" rel=\"noopener nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u041d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0451 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043b\u0438\u0448\u044c \u0442\u0430 \u0447\u0430\u0441\u0442\u044c VMM, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0432\u043e\u0434.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fc\/5e\/eb\/fc5eeb1db22296cc8679f07e55cf42a8.png\" alt=\"\u041f\u0443\u0442\u044c Ctrl+C: \u043e\u0442 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 Java, UART \u0438 KVM \u0434\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 SIGINT \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 Linux\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/fc\/5e\/eb\/fc5eeb1db22296cc8679f07e55cf42a8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/fc\/5e\/eb\/fc5eeb1db22296cc8679f07e55cf42a8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0443\u0442\u044c Ctrl+C: \u043e\u0442 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 Java, UART \u0438 KVM \u0434\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 SIGINT \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 Linux<\/figcaption><\/div>\n<\/figure>\n<h3>\u0414\u0432\u0430 \u0441\u0431\u043e\u044f \u0437\u0430 \u043e\u0434\u043d\u0438\u043c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448<\/h3>\n<p><strong>\u0421\u0438\u043c\u043f\u0442\u043e\u043c \u21161: <\/strong><code><strong>Ctrl+C<\/strong><\/code><strong> \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 VM.<\/strong> \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 Java, \u0441\u0430\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u0415\u0433\u043e <em>line discipline<\/em> \u2014 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u0430\u0439\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 <code>SIGINT<\/code> \u0434\u043b\u044f foreground process group <strong>\u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e<\/strong> \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u042d\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u0434\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435. \u0412 \u043d\u0435\u0451 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0438 JVM.<\/p>\n<p><strong>\u0421\u0438\u043c\u043f\u0442\u043e\u043c \u21162: JVM \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0436\u0438\u0432\u0430, \u043d\u043e <\/strong><code><strong>sleep 30<\/strong><\/code><strong> \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/strong> \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 Java \u0443\u0436\u0435 \u0447\u0438\u0442\u0430\u043b\u0430 <code>0x03<\/code> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0430 \u0435\u0433\u043e \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0430\u0439\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d, \u0435\u0449\u0451 \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0423\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043d\u0430 \u0442\u0440\u0438 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ol>\n<li>\n<p><strong>\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430:<\/strong> \u0431\u0430\u0439\u0442 <code>0x03<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e TTY.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430:<\/strong> \u0433\u043e\u0441\u0442\u0435\u0432\u0430\u044f line discipline \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442 <code>VINTR<\/code> \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>SIGINT<\/code> \u0442\u0435\u043a\u0443\u0449\u0435\u0439 foreground process group.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u0430\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:<\/strong> \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f, \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u0442\u0440\u0435\u0442\u044c\u0435\u043c. \u0414\u0430\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 <code>^C<\/code> \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430: \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u0445\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430.<\/p>\n<h3>\u0413\u0434\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0445\u043e\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b<\/h3>\n<p>\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0432\u043e\u0434 \u0432 Linux \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>termios<\/code>. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0432\u0430\u0436\u043d\u044b \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u2014 \u0432 <a href=\"https:\/\/man7.org\/linux\/man-pages\/man3\/termios.3.html\" rel=\"noopener nofollow\"><code>termios(3)<\/code><\/a>):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ISIG<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b <code>VINTR<\/code> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 <code>SIGINT<\/code> \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 foreground-\u0433\u0440\u0443\u043f\u043f\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ICANON<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u0432\u043e\u0434 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438; \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c \u044d\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ECHO<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>VINTR<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f; \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; <code>^C<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c <code>0x03<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/cli\/src\/main\/java\/io\/sagittarius\/panamakvm\/cli\/terminal\/HostTerminal.java#L35-L49\" rel=\"noopener nofollow\">HostTerminal.java<\/a> \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:<\/p>\n<pre><code class=\"java\">String state = readState();if (state == null || !runStty(\"-icanon\", \"-echo\", \"-isig\", \"min\", \"1\", \"time\", \"0\")) {    if (state != null) {        runStty(state);    }    return UNCHANGED;}return new HostTerminal(state);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f <strong>\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0438\u043c\u043f\u0442\u043e\u043c\u0430<\/strong> \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u043c \u0431\u044b\u043b <code>-isig<\/code>: \u0445\u043e\u0441\u0442\u043e\u0432\u044b\u0439 TTY \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>^C<\/code> \u0432 <code>SIGINT<\/code>, \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 JVM. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u043c\u043e\u0433 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0432\u043e\u0434 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u0435:<\/p>\n<ul>\n<li>\n<p><code>-icanon<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0432\u043e\u0434 \u0431\u0435\u0437 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f Enter. \u041a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441\u0442\u0438\u0440\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0436\u043d\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<\/li>\n<li>\n<p><code>min 1 time 0<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442: \u0432 \u043d\u0435\u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 <code>read()<\/code> \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442, \u0431\u0435\u0437 \u0442\u0430\u0439\u043c-\u0430\u0443\u0442\u0430. \u042d\u0442\u043e <strong>\u043d\u0435<\/strong> \u043f\u043e\u043b\u043d\u044b\u0439 raw mode: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 <code>termios<\/code> \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p><code>-echo<\/code> \u043d\u0435 \u0434\u0430\u0451\u0442 \u0445\u043e\u0441\u0442\u0443 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u2014 \u0437\u0430 \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0432\u0432\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0433\u043e\u0441\u0442\u0435\u0432\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0433\u043a\u0430 \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430\u044f \u0432\u0435\u0449\u044c: <strong>\u0445\u043e\u0441\u0442\u043e\u0432\u044b\u0439 \u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 TTY \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/strong>. \u041d\u0430 \u0445\u043e\u0441\u0442\u0435 \u043d\u0443\u0436\u0435\u043d <code>-isig<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c Java. \u0412 \u0433\u043e\u0441\u0442\u0435 \u2014 <code>isig<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0436\u0435 Linux \u043c\u043e\u0433 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c <code>0x03<\/code> \u0432 <code>SIGINT<\/code> \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u042d\u0442\u043e \u0434\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0430 \u043d\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<h3>Java \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442 VM \u2014 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0431\u0430\u0439\u0442<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a Java. \u0412 <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/cli\/src\/main\/java\/io\/sagittarius\/panamakvm\/cli\/terminal\/ConsoleSession.java#L37-L51\" rel=\"noopener nofollow\">ConsoleSession.java<\/a> \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0447\u0438\u0442\u0430\u0435\u0442 <code>System.in<\/code> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0431\u0430\u0439\u0442\u044b \u0434\u0430\u043b\u044c\u0448\u0435 (\u044d\u0442\u043e \u0442\u0435\u043b\u043e input pump):<\/p>\n<pre><code class=\"java\">TerminalControlResponseFilter input = new TerminalControlResponseFilter(uart::offerInput);int next;while ((next = System.in.read()) &gt;= 0) {    input.accept(next);}input.finish();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/cli\/src\/main\/java\/io\/sagittarius\/panamakvm\/cli\/terminal\/TerminalControlResponseFilter.java\" rel=\"noopener nofollow\">\u0424\u0438\u043b\u044c\u0442\u0440<\/a> \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>ESC [ row ; column R<\/code>, \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430. <code>0x03<\/code> \u043a \u043d\u0438\u043c \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f: \u043e\u043d \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043a <code>uart::offerInput<\/code>. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u00ab\u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c VM\u00bb \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u0442.<\/p>\n<p>\u042d\u0442\u0443 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>strace -ff -e read,ioctl<\/code>: \u0432 \u0442\u0440\u0430\u0441\u0441\u0435 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u0435\u043d\u0438\u0435 <code>\"\\3\"<\/code>. \u0417\u043d\u0430\u0447\u0438\u0442, \u0431\u0430\u0439\u0442 \u0434\u043e\u0448\u0451\u043b \u0434\u043e JVM. \u041d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0435\u0433\u043e \u0436\u0434\u0443\u0442 \u0435\u0449\u0451 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, KVM \u0438 Linux \u2014 \u043e\u0434\u0438\u043d <code>read()<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043e \u043d\u0438\u0445 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c: \u0445\u043e\u0441\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u0430\u0431\u0438\u0440\u0430\u043b <code>Ctrl+C<\/code> \u0441\u0435\u0431\u0435. \u041d\u043e \u0433\u0434\u0435 \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u0440\u044f\u043b\u0430\u0441\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f?<\/p>\n<h3>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 UART: \u0431\u0430\u0439\u0442 \u0432 RX-\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0435\u0449\u0451 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u0434\u0432\u0430 \u0432\u0438\u0434\u0430 \u00ab\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439\u00bb: <strong>IRQ<\/strong> \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0435 \u044f\u0434\u0440\u043e \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 <strong>SIGINT<\/strong> \u2014 \u044d\u0442\u043e Unix-\u0441\u0438\u0433\u043d\u0430\u043b, \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c. \u041c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0435\u0449\u0451 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 Linux.<\/p>\n<p>\u0414\u043b\u044f serial console \u0432 PanamaKVM \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c <strong>16550-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e COM1<\/strong>: \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u043e\u0440\u0442 <code>0x3f8<\/code>, \u043b\u0438\u043d\u0438\u044f IRQ4 \u0438 \u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e serial-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0441\u044e\u0434\u0430 Java \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 <code>0x03<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u043d\u0443\u0436\u043d\u044b \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0410\u0434\u0440\u0435\u0441 \u043f\u0440\u0438 <code>DLAB=0<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 RX-\u043f\u0443\u0442\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">RBR<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x3f8<\/code>, \u0447\u0442\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0413\u043e\u0441\u0442\u044c \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442 \u0438\u0437 RX-\u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">IER<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x3f9<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0438\u0442 0 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 receive-data interrupt<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">IIR<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x3fa<\/code>, \u0447\u0442\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u0433\u043e interrupt<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">FCR<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x3fa<\/code>, \u0437\u0430\u043f\u0438\u0441\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 FIFO, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 RX<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">LSR<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x3fd<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0438\u0442 0 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 Data Ready<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412 <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/core\/src\/main\/java\/io\/sagittarius\/panamakvm\/core\/device\/Uart16550.java#L120-L132\" rel=\"noopener nofollow\">Uart16550.java<\/a> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">public synchronized void offerInput(int value) {    if ((value &amp; ~0xff) != 0) {        throw new IllegalArgumentException(\"UART input must be an unsigned byte: \" + value);    }    receivedBytes.add(value);    updateReceiveInterruptLine();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0433\u043e\u0441\u0442\u0435\u043c \u0432\u0430\u0436\u043d\u0435\u0435 \u043d\u0435 \u0441\u0430\u043c\u0430 <code>add()<\/code>, \u0430 <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/core\/src\/main\/java\/io\/sagittarius\/panamakvm\/core\/device\/Uart16550.java#L223-L230\" rel=\"noopener nofollow\">\u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f<\/a>:<\/p>\n<pre><code class=\"java\">private void updateReceiveInterruptLine() {    boolean asserted = !receivedBytes.isEmpty()            &amp;&amp; (interruptEnable &amp; INTERRUPT_ENABLE_RECEIVED_DATA) != 0;    if (receiveInterruptAsserted != asserted) {        receiveInterruptAsserted = asserted;        receiveInterruptLine.setLevel(COM1_INTERRUPT, asserted);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044d\u0442\u043e\u0439 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439: <strong>\u043b\u0438\u043d\u0438\u044f RX IRQ \u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u043f\u043e\u043a\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0451\u043c\u0430<\/strong>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f RBR \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f; \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 deassert.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443: \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c <code>0x03<\/code> \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c Linux \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442. \u041d\u043e \u0431\u0435\u0437 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u0431\u0430\u0439\u0442 \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c IRQ \u0438 \u043d\u0435 \u0441\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0432\u043e\u0432\u0440\u0435\u043c\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0430. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 interrupt controller.<\/p>\n<h4>\u041a\u0430\u043a \u0431\u0430\u0439\u0442\u044b UART \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 KVM<\/h4>\n<p>\u0421\u0432\u044f\u0437\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 VM \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/cli\/src\/main\/java\/io\/sagittarius\/panamakvm\/cli\/runtime\/GuestRunner.java\" rel=\"noopener nofollow\">GuestRunner.java<\/a>:<\/p>\n<pre><code class=\"java\">Uart16550 uart = new Uart16550(System.out, machine::pulseInterrupt, machine::setInterruptLine);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u2014 KVM backend. \u0412 <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/virtualization\/kvm\/src\/main\/java\/io\/sagittarius\/panamakvm\/kvm\/KvmVirtualMachine.java#L282-L300\" rel=\"noopener nofollow\">KvmVirtualMachine.setInterruptLine()<\/a> Java \u0447\u0435\u0440\u0435\u0437 FFM \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u0434\u0432\u0443\u0445 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>ioctl(KVM_IRQ_LINE)<\/code>:<\/p>\n<pre><code class=\"java\">MemorySegment level = arena.allocate(IRQ_LEVEL_SIZE, Integer.BYTES);level.set(JAVA_INT, 0, interrupt);level.set(JAVA_INT, Integer.BYTES, asserted ? 1 : 0);operatingSystem.ioctl(vmDescriptor, KvmUapi.IRQ_LINE, level);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 <code>struct kvm_irq_level<\/code> \u2014 GSI\/IRQ, \u0432\u0442\u043e\u0440\u043e\u0435 \u2014 \u0443\u0440\u043e\u0432\u0435\u043d\u044c <code>0<\/code> \u0438\u043b\u0438 <code>1<\/code>. \u041f\u043e <a href=\"https:\/\/docs.kernel.org\/virt\/kvm\/api.html#kvm-irq-line\" rel=\"noopener nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 KVM API<\/a>, \u044d\u0442\u043e\u0442 <code>ioctl<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430 interrupt controller, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u044f\u0434\u0440\u0435. \u0414\u043b\u044f edge-triggered \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0437 <code>1<\/code> \u0432 <code>0<\/code> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 UART \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 IRQ \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u041a\u043e\u0433\u0434\u0430 <em>\u0433\u043e\u0441\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u0442<\/em> \u0440\u0435\u0433\u0438\u0441\u0442\u0440 UART, KVM \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>KVM_EXIT_IO<\/code>: \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 VMM, <code>VmRunner<\/code> \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 I\/O bus \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>KVM_RUN<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f: <strong>host \u043a\u043b\u0430\u0434\u0451\u0442 \u0431\u0430\u0439\u0442 \u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0433\u043e\u0441\u0442\u044f; guest \u0447\u0438\u0442\u0430\u0435\u0442 UART \u0447\u0435\u0440\u0435\u0437 port I\/O<\/strong>. <a href=\"https:\/\/docs.kernel.org\/virt\/kvm\/api.html\" rel=\"noopener nofollow\">\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 <code>KVM_EXIT_IO<\/code><\/a>, <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/virtualization\/api\/src\/main\/java\/io\/sagittarius\/panamakvm\/virtualization\/VmRunner.java\" rel=\"noopener nofollow\">VmRunner.java<\/a>.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/14\/a2\/21\/14a221efc123a20cc827553415430b6f.png\" alt=\"\u0420\u0430\u0431\u043e\u0442\u0430 UART RX \u0438 IRQ: \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u0430, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0433\u043e \u0441\u043d\u044f\u0442\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/14\/a2\/21\/14a221efc123a20cc827553415430b6f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/14\/a2\/21\/14a221efc123a20cc827553415430b6f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0431\u043e\u0442\u0430 UART RX \u0438 IRQ: \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u0430, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0433\u043e \u0441\u043d\u044f\u0442\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439<\/figcaption><\/div>\n<\/figure>\n<h3>Guest TTY: \u043a\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0x03 \u0432 SIGINT<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430 Java \u0438 KVM \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 <code>Ctrl+C<\/code> \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. VMM \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 <code>sleep<\/code> \u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0435\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b. \u041e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043e\u0441\u0442\u044e serial port \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0410 \u0441\u043c\u044b\u0441\u043b \u0431\u0430\u0439\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 Linux.<\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 Linux \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p><a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v6.12\/drivers\/tty\/serial\/8250\/8250_port.c\" rel=\"noopener nofollow\"><code>serial8250_rx_chars()<\/code><\/a> \u2192 TTY flip buffer \u2192 <code>N_TTY<\/code> line discipline \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 <code>ISIG<\/code> \u0438 <code>VINTR<\/code> \u2192 <code>SIGINT<\/code> \u0434\u043b\u044f foreground process group.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 Linux 6.12 \u2014 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v6.12\/drivers\/tty\/n_tty.c#L1282-L1286\" rel=\"noopener nofollow\"><code>drivers\/tty\/n_tty.c<\/code><\/a>. \u0412 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442:<\/p>\n<pre><code>if (L_ISIG(tty)) {    if (c == INTR_CHAR(tty)) {        n_tty_receive_signal_char(tty, SIGINT, c);        return;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v6.12\/drivers\/tty\/n_tty.c#L1005-L1012\" rel=\"noopener nofollow\"><code>__isig()<\/code><\/a> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 foreground process group \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>kill_pgrp()<\/code>. \u0417\u0434\u0435\u0441\u044c \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0433\u043d\u0430\u043b, \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u044c <code>^C<\/code> \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>kill<\/code>: \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u043c <code>ISIG<\/code> \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 TTY-\u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u044f\u0434\u0440\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u043b\u043e\u0432\u0443\u0448\u043a\u0430. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 foreground-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>pgrp<\/code> \u0441\u0430\u043c\u043e\u0433\u043e shell \u0438 <code>tpgid<\/code> \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b <code>sleep<\/code> \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u2014 \u0438 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e PID \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u043e \u0438 <code>pgrp<\/code>, <code>session<\/code>, <code>tty_nr<\/code>, <code>tpgid<\/code> &#8212; \u043f\u043e\u043b\u044f 5-8 <a href=\"https:\/\/man7.org\/linux\/man-pages\/man5\/proc_pid_stat.5.html\" rel=\"noopener nofollow\"><code>\/proc\/&lt;pid&gt;\/stat<\/code><\/a>.<\/p>\n<h3>\u041a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 VMM<\/h3>\n<p>\u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0447\u0442\u0435\u043d\u0438\u0435 <code>0x03<\/code> Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u0432\u044b\u0437\u043e\u0432\u044b <code>KVM_IRQ_LINE<\/code>, \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 <code>ttyS0<\/code> \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e TTY. \u041d\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u043b\u043e \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f <code>sleep<\/code>.<\/p>\n<p>\u0420\u0435\u0448\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u043b\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430: <strong>\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c <\/strong><code><strong>SIGINT<\/strong><\/code><strong> \u043d\u0443\u0436\u043d\u043e\u0439 foreground process group \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u043e\u0441\u0442\u044f<\/strong>. \u041e\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0445\u043e\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, Java, UART \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>VINTR<\/code> \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u043c TTY. <code>sleep<\/code> \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 <code>KVM_EXIT_IO<\/code> \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c. \u042d\u0442\u043e \u0441\u0432\u043e\u0434\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0430 \u043d\u0435 \u043f\u043e\u043c\u0438\u043d\u0443\u0442\u043d\u0430\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0413\u0440\u0430\u043d\u0438\u0446\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0430\u0441\u044c<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b\u043e\u0441\u044c \u2014 \u0438 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Host \u2192 Java<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>stty<\/code>, <code>strace -ff -e read,ioctl<\/code>, \u0447\u0442\u0435\u043d\u0438\u0435 <code>\"\\3\"<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">JVM \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0430 \u0431\u0430\u0439\u0442; \u043e \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u043c TTY \u044d\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Java \u2192 UART\/KVM<\/p>\n<\/td>\n<td>\n<p align=\"left\">RX-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442, <code>KVM_IRQ_LINE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 IRQ \u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <code>ioctl<\/code> \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u043e\u043b\u043d\u0443\u044e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">KVM \u2192 Linux<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>\/proc\/interrupts<\/code>, serial tty<\/p>\n<\/td>\n<td>\n<p align=\"left\">Serial-\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0438\u0441\u044c; \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Guest TTY<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>stty -a<\/code>, <code>isig<\/code>, <code>intr = ^C<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e <code>SIGINT<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Foreground job<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>pgrp<\/code>, <code>tpgid<\/code> \u0438\u0437 <code>\/proc\/&lt;pid&gt;\/stat<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0433\u0440\u0443\u043f\u043f\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0438\u0433\u043d\u0430\u043b \u2192 \u043f\u0440\u043e\u0446\u0435\u0441\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u044f\u043c\u043e\u0439 <code>SIGINT<\/code> foreground-\u0433\u0440\u0443\u043f\u043f\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u043e\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0441\u044f \u0434\u0430\u0436\u0435 \u0432 \u043e\u0431\u0445\u043e\u0434 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0443\u0436\u0435 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u043b\u0438 <code>SIG_IGN<\/code> \u2014 \u044f\u0432\u043d\u043e\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u043b\u0435\u0437\u0435\u043d <code>\/proc\/&lt;pid&gt;\/status<\/code>:<\/p>\n<pre><code># \u0412 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438: \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 PID \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.pid=123grep -E '^(Name|Pid|PPid|SigBlk|SigIgn|SigCgt):' \/proc\/\"$pid\"\/status<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>SigIgn<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0430\u0441\u043a\u0443 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, <code>SigBlk<\/code> \u2014 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445, <code>SigCgt<\/code> \u2014 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438. \u041d\u043e\u043c\u0435\u0440 <code>SIGINT<\/code> \u0432 Linux \u2014 2, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u0435\u043d <strong>\u0431\u0438\u0442<\/strong> <code>0x2<\/code> \u0432 <code>SigIgn<\/code>, \u0430 \u043d\u0435 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0439 \u043c\u0430\u0441\u043a\u0438 \u0434\u0432\u0443\u043c. \u0421\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043f\u043e\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0435\u0449\u0451 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u2014 \u0432 <a href=\"https:\/\/man7.org\/linux\/man-pages\/man5\/proc_pid_status.5.html\" rel=\"noopener nofollow\"><code>proc_pid_status(5)<\/code><\/a> \u0438 <a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/signal.7.html\" rel=\"noopener nofollow\"><code>signal(7)<\/code><\/a>.<\/p>\n<p>\u041f\u043e\u043b\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u044d\u0442\u0438\u0445 \u043c\u0430\u0441\u043e\u043a \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0443 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>SigIgn<\/code> \u0437\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0442\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041d\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e <code>SIGINT<\/code>, \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043b\u043e, \u0433\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u0443.<\/p>\n<h3>\u041f\u0440\u0438\u0447\u0438\u043d\u0430: \u043e\u0434\u0438\u043d &amp; \u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 shell<\/h3>\n<p>\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430\u0441\u044c \u0438\u0437 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e <code>\/init<\/code> \u0432 \u0444\u043e\u043d\u0435. \u0412 \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a (\u044d\u0442\u043e \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0445\u0440\u043e\u043d\u0438\u043a\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0430 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 Git diff):<\/p>\n<pre><code>setsid -c cttyhack sh -i &amp;wait \"$!\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u043e: \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0432 \u0444\u043e\u043d\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0435\u0451 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e <code>&amp;<\/code>. \u041a\u043e\u0433\u0434\u0430 job control \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, <code>ash<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u043e\u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>SIGINT<\/code> \u0438 <code>SIGQUIT<\/code>. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0435 \u0432 \u043c\u043e\u0451\u043c VMM, \u0430 \u0432 <a href=\"https:\/\/github.com\/mirror\/busybox\/blob\/1_36_1\/shell\/ash.c#L5034-L5041\" rel=\"noopener nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 BusyBox ash 1.36.1, <code>forkchild()<\/code><\/a>:<\/p>\n<pre><code>if (mode == FORK_BG) {    ignoresig(SIGINT);    ignoresig(SIGQUIT);    \/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0435\u0440\u0441\u0438\u044f BusyBox \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c guest initramfs \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0430; 1.36.1 \u0437\u0434\u0435\u0441\u044c \u2014 \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e \u0441\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0430 \u043d\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0438 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044c: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>S_HARD_IGN<\/code> \u0432 <code>ash<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <strong>\u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443<\/strong>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e <code>sh -i<\/code> \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0435\u0436\u043d\u044f\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u0434\u0430\u0436\u0435 \u043d\u0430 <code>sleep<\/code>, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0437\u0434\u043d\u0435\u0435? \u0418\u0437-\u0437\u0430 \u043f\u0440\u0430\u0432\u0438\u043b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f signal disposition:<\/p>\n<ul>\n<li>\n<p><code>fork()<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 dispositions \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430;<\/p>\n<\/li>\n<li>\n<p><code>execve()<\/code> \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 <em>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438<\/em> \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u043d\u043e <strong>\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b<\/strong>;<\/p>\n<\/li>\n<li>\n<p><code>setsid<\/code> \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 controlling terminal \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c <code>SIG_IGN<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 guest <code>stty isig<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c, \u043d\u043e \u043d\u0435 \u0437\u0430\u0434\u0430\u0451\u0442, \u043a\u0430\u043a \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441-\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u044d\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0445: <a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/signal.7.html\" rel=\"noopener nofollow\"><code>signal(7)<\/code><\/a>, \u0440\u0430\u0437\u0434\u0435\u043b <em>Signal dispositions<\/em>, \u0438 <a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/execve.2.html\" rel=\"noopener nofollow\"><code>execve(2)<\/code><\/a>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f. <code>Ctrl+C<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 <code>SIGINT<\/code>, \u0433\u0440\u0443\u043f\u043f\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u043e <code>sleep<\/code> \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b <code>SIG_IGN<\/code> \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u0438 <code>stty<\/code>, \u043d\u0438 <code>setsid<\/code> \u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0430 \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u0418 \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e KVM.<\/p>\n<h4>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0435\u0437 KVM<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043e\u0442 \u0432\u0441\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441 VM, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c Linux. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 <code>SIGINT=SIG_IGN<\/code>, \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 <code>sleep<\/code> \u0447\u0435\u0440\u0435\u0437 <code>exec<\/code>:<\/p>\n<pre><code class=\"bash\">python3 -S -c 'import os, signal; signal.signal(signal.SIGINT, signal.SIG_IGN); os.execlp(\"sleep\", \"sleep\", \"8\")'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 Linux \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 <code>Ctrl+C<\/code> \u0434\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u0441\u044c\u043c\u0438 \u0441\u0435\u043a\u0443\u043d\u0434. <code>sleep<\/code> \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0436\u0434\u0430\u0442\u044c: \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 <code>SIGINT<\/code> \u043f\u0435\u0440\u0435\u0436\u0438\u043b\u043e <code>exec<\/code>. Python \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0418 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e UART \u0438\u043b\u0438 KVM \u0432 \u043e\u043f\u044b\u0442\u0435 \u043d\u0435\u0442.<\/p>\n<p>\u042d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 BusyBox \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d.<\/p>\n<h3>\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435: \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0431\u0435\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u0412 <a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/blob\/v0.1.0\/guest\/initramfs\/interactive\/init#L16-L26\" rel=\"noopener nofollow\">\u0442\u0435\u043a\u0443\u0449\u0435\u043c guest <code>\/init<\/code><\/a> \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e:<\/p>\n<pre><code>if \"$busybox\" setsid -c \"$busybox\" cttyhack \"$busybox\" sh -c \\    'stty isig intr \"^C\"; exec \/bin\/busybox sh -i' \\    &lt;\/dev\/console &gt;\/dev\/console 2&gt;&amp;1; then    shell_status=0else    shell_status=$?fi<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0435, \u0438 \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0441\u043c\u0435\u0448\u0430\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<p><strong>\u0411\u0435\u0437 <\/strong><code><strong>&amp;<\/strong><\/code><strong>:<\/strong> \u043d\u0435\u0442 \u043f\u0440\u0435\u0436\u043d\u0435\u0433\u043e \u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0437 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e <code>\/init<\/code> \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043d\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e <code>SIG_IGN<\/code> \u0432 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438.<\/p>\n<p><code><strong>setsid -c<\/strong><\/code><strong> \u0438 <\/strong><code><strong>cttyhack<\/strong><\/code><strong>:<\/strong> \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c controlling terminal \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438. \u0418\u0445 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; job control \u0438 TTY.<\/p>\n<p><code><strong>stty isig intr \"^C\"<\/strong><\/code><strong>:<\/strong> \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 TTY \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b <code>0x03<\/code> \u0431\u044b\u043b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><code><strong>exec \/bin\/busybox sh -i<\/strong><\/code><strong>:<\/strong> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439. \u0412\u0430\u0436\u043d\u043e: <strong>\u0441\u0430\u043c <\/strong><code><strong>exec<\/strong><\/code><strong> \u043d\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 <\/strong><code><strong>SIG_IGN<\/strong><\/code>. \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 shell \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 <code>\/init<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0435\u0451 \u0441\u0442\u0430\u0442\u0443\u0441, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <code>sync<\/code> \u0438 <code>reboot -f<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0447\u044c \u0448\u043b\u0430 \u043e foreground-\u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>sleep<\/code>, \u0430 \u043d\u0435 \u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u043b\u044f PID 1.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 WSL\/KVM \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b \u0434\u0432\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f: <code>Ctrl+C<\/code> \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043b <code>sleep 30<\/code> \u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 <code>yes<\/code>; \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 shell \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443. \u042d\u0442\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0445\u0440\u043e\u043d\u0438\u043a\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u043e\u043b\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e PTY\/KVM-\u0442\u0435\u0441\u0442\u0430 \u0432\u0441\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u2014 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 smoke boot. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044e \u044d\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u043c\u0438 \u0432 CI.<\/p>\n<h3>\u0427\u0442\u043e \u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u0431\u044b \u043f\u0440\u0438 \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c Ctrl+C<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u043d\u043e\u0432\u0430, \u044f \u043d\u0430\u0447\u0430\u043b \u0431\u044b \u043d\u0435 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u041e\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u0438 \u043a \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u043a\u0441\u0438, \u0438 \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c, \u0438 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c VMM.<\/p>\n<ol>\n<li>\n<p><strong>\u041a\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 Ctrl+C?<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c <code>ISIG<\/code> \u0443 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e TTY. \u0415\u0441\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0441\u0442 \u0438\u043b\u0438 JVM, \u0434\u043e \u0433\u043e\u0441\u0442\u044f \u0431\u0430\u0439\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442 <\/strong><code><strong>0x03<\/strong><\/code><strong>?<\/strong> \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435. \u041e\u0434\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d\u043d\u043e\u0433\u043e <code>^C<\/code> \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 UART, \u0447\u0442\u043e \u0441 RX \u0438 IRQ?<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043d\u043e \u0438 RBR\/IIR\/LSR, enable-\u0431\u0438\u0442\u044b, assert\/deassert. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <code>KVM_IRQ_LINE<\/code> \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 end-to-end \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043c\u0443 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 TTY \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b?<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c <code>stty -a<\/code>, controlling terminal, <code>pgrp<\/code>, <code>session<\/code> \u0438 <code>tpgid<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u043e\u0431\u043e\u0439\u0442\u0438 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u0432\u0432\u043e\u0434\u0430?<\/strong> \u041f\u043e\u0441\u043b\u0430\u0442\u044c <code>SIGINT<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 process group \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a <code>SigBlk<\/code>, <code>SigIgn<\/code>, <code>SigCgt<\/code> \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435?<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0439 <code>&amp;<\/code>, \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 shell, <code>fork<\/code>, <code>exec<\/code> \u0438 signal dispositions. \u0418\u0441\u043f\u0440\u0430\u0432\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0435\u0449\u0451 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/d8\/a0\/0e\/d8a00e2ea15550799513a14c9924d785.png\" alt=\"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 Ctrl+C: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u0438\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/d8\/a0\/0e\/d8a00e2ea15550799513a14c9924d785.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/d8\/a0\/0e\/d8a00e2ea15550799513a14c9924d785.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 Ctrl+C: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<h3>\u0412\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0430<\/h3>\n<p>\u0421\u0430\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>KVM_IRQ_LINE<\/code> \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 UART. \u0418\u0445 \u0445\u043e\u0442\u044f \u0431\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e: \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0431\u0430\u0439\u0442, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 IRQ, \u0432\u044b\u0437\u043e\u0432 <code>ioctl<\/code>, \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u0432 \u0433\u043e\u0441\u0442\u0435. \u0421\u043b\u043e\u0436\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0438\u0441\u043a\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u043e\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0442\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438, \u0447\u0442\u043e <code>0x03<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u0447\u0435\u0440\u0435\u0437 Java \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 UART, \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0435 serial-\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u0430 foreground-\u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u041d\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u044f\u043c\u043e\u0439 <code>SIGINT<\/code> \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u0433\u043e\u0441\u0442\u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b <code>sleep<\/code>: \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0412\u0441\u0451 \u0438\u0437-\u0437\u0430 \u043e\u0434\u043d\u043e\u0433\u043e <code>&amp;<\/code> \u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u2014 \u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e <code>exec<\/code> \u043d\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 <code>SIG_IGN<\/code>.<\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0431\u044b \u0437\u0430\u0431\u0440\u0430\u043b \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u0451\u043c: <strong>\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u044f\u043c\u044b\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u043c<\/strong>. \u042d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0435\u0435, \u0447\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.<\/p>\n<p><a href=\"https:\/\/github.com\/rusanoph\/panama-kvm\/tree\/v0.1.0\" rel=\"noopener nofollow\">PanamaKVM \u2014 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 v0.1.0<\/a>. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, UART \u0438 guest <code>\/init<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h4>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h4>\n<ul>\n<li>\n<p><a href=\"https:\/\/man7.org\/linux\/man-pages\/man3\/termios.3.html\" rel=\"noopener nofollow\">Linux <code>termios(3)<\/code><\/a> &#8212; local modes, <code>ISIG<\/code>, <code>ICANON<\/code>, <code>VINTR<\/code>, <code>VMIN<\/code>\/<code>VTIME<\/code>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.kernel.org\/virt\/kvm\/api.html#kvm-irq-line\" rel=\"noopener nofollow\">Linux KVM API: <code>KVM_IRQ_LINE<\/code><\/a> &#8212; GSI\/IRQ level \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a edge-triggered.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.ti.com\/lit\/ds\/symlink\/tl16c550c.pdf\" rel=\"noopener nofollow\">TI TL16C550C, datasheet<\/a> &#8212; \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 interrupt behaviour \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 UART.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v6.12\/drivers\/tty\/n_tty.c\" rel=\"noopener nofollow\">Linux 6.12 <code>drivers\/tty\/n_tty.c<\/code><\/a> &#8212; <code>VINTR<\/code> \u2192 <code>SIGINT<\/code> \u2192 foreground pgrp.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/signal.7.html\" rel=\"noopener nofollow\">Linux <code>signal(7)<\/code><\/a>, <a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/execve.2.html\" rel=\"noopener nofollow\"><code>execve(2)<\/code><\/a> &#8212; \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 dispositions.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/man7.org\/linux\/man-pages\/man5\/proc_pid_stat.5.html\" rel=\"noopener nofollow\">Linux <code>proc_pid_stat(5)<\/code><\/a>, <a href=\"https:\/\/man7.org\/linux\/man-pages\/man5\/proc_pid_status.5.html\" rel=\"noopener nofollow\"><code>proc_pid_status(5)<\/code><\/a> &#8212; \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 process group \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/mirror\/busybox\/blob\/1_36_1\/shell\/ash.c#L5019-L5045\" rel=\"noopener nofollow\">BusyBox ash 1.36.1, <code>forkchild()<\/code><\/a> &#8212; \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 <code>SIG_IGN<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\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\/1094024\/\">https:\/\/habr.com\/ru\/articles\/1094024\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u0430\u043a \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043f\u0443\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 Java, UART, KVM \u0438 Linux \u2014 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u044b\u0439 IRQ \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 Java \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b Linux. \u042f\u0434\u0440\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u043e\u0441\u044c \u0447\u0435\u0440\u0435\u0437 KVM, BusyBox \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443, \u0447\u0435\u0440\u0435\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442.\u0418 \u0432\u043e\u0442 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u043b\u044c\u0448\u0435 \u2014 sleep 30 \u0438\u043b\u0438 ls -R \/. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0434\u043e\u0435\u0434\u0430\u0435\u0442, \u0440\u0443\u043a\u0430 \u0441\u0430\u043c\u0430 \u0442\u044f\u043d\u0435\u0442\u0441\u044f \u043a Ctrl+C. \u041d\u0430\u0436\u0438\u043c\u0430\u044e \u2014 \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0433\u0430\u0441\u043d\u0435\u0442 \u0432\u0441\u044f VM. \u041a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c sleep \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u043b\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440.\u0421 \u043f\u0435\u0440\u0432\u044b\u043c \u0441\u0431\u043e\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e: Ctrl+C \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u041e\u0421, \u043f\u043e\u0441\u044b\u043b\u0430\u044f SIGINT \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 JVM. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b sleep 30, \u043d\u0430\u0436\u0430\u043b Ctrl+C\u2026 \u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043d\u0438\u0447\u0435\u0433\u043e. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0436\u0438\u043b\u0430, \u043d\u043e \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u0445\u043e\u0436\u0435, \u043f\u0440\u0438\u043e\u0431\u0440\u0451\u043b \u0438\u043c\u043c\u0443\u043d\u0438\u0442\u0435\u0442 \u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044e.\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u0432\u0432\u043e\u0434\u0430: \u043e\u0442 \u0431\u0430\u0439\u0442\u0430 0x03 \u0432 Java \u0447\u0435\u0440\u0435\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 UART \u0438 KVM_IRQ_LINE \u0434\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 Linux, TTY \u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0448\u043b\u0430\u0441\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043b \u0435\u0451 \u0438\u0441\u043a\u0430\u0442\u044c \u2014 \u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438.\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u0445\u043e\u0434 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0438 \u0432\u043d\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0441\u0442\u0430\u0445, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 CLI \u0438 \u043b\u044e\u0431\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u0434\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0434\u043e\u0445\u043e\u0434\u0438\u0442, \u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0435\u0442.\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442: PanamaKVM \u2014 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 Java VMM, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 Linux KVM \u0447\u0435\u0440\u0435\u0437 FFM API, \u0431\u0435\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 JNI-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041a\u0430\u043a \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 Linux \u0438 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0451 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043b\u0438\u0448\u044c \u0442\u0430 \u0447\u0430\u0441\u0442\u044c VMM, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0432\u043e\u0434.\u041f\u0443\u0442\u044c Ctrl+C: \u043e\u0442 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 Java, UART \u0438 KVM \u0434\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 SIGINT \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 Linux\u0414\u0432\u0430 \u0441\u0431\u043e\u044f \u0437\u0430 \u043e\u0434\u043d\u0438\u043c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0421\u0438\u043c\u043f\u0442\u043e\u043c \u21161: Ctrl+C \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 VM. \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 Java, \u0441\u0430\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u0415\u0433\u043e line discipline \u2014 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430 \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u0430\u0439\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 SIGINT \u0434\u043b\u044f foreground process group \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u042d\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u0434\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435. \u0412 \u043d\u0435\u0451 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0438 JVM.\u0421\u0438\u043c\u043f\u0442\u043e\u043c \u21162: JVM \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0436\u0438\u0432\u0430, \u043d\u043e sleep 30 \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 Java \u0443\u0436\u0435 \u0447\u0438\u0442\u0430\u043b\u0430 0x03 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0430 \u0435\u0433\u043e \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0430\u0439\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d, \u0435\u0449\u0451 \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f.\u0423\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043d\u0430 \u0442\u0440\u0438 \u044d\u0442\u0430\u043f\u0430:\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430: \u0431\u0430\u0439\u0442 0x03 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e TTY.\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430: \u0433\u043e\u0441\u0442\u0435\u0432\u0430\u044f line discipline \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0451\u0442 VINTR \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 SIGINT \u0442\u0435\u043a\u0443\u0449\u0435\u0439 foreground process group.\u0420\u0435\u0430\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c.\u0415\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f, \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u0442\u0440\u0435\u0442\u044c\u0435\u043c. \u0414\u0430\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 ^C \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430: \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u0445\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430.\u0413\u0434\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0445\u043e\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0432\u043e\u0434 \u0432 Linux \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 termios. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0432\u0430\u0436\u043d\u044b \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u2014 \u0432 termios(3)):\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0427\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438ISIG\u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b VINTR \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 SIGINT \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 foreground-\u0433\u0440\u0443\u043f\u043f\u0435ICANON\u0412 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u0432\u043e\u0434 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438; \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c \u044d\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442ECHO\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435VINTR\u041d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f; \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; ^C, \u0442\u043e \u0435\u0441\u0442\u044c 0x03\u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HostTerminal.java \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:String state = readState();if (state == null || !runStty(&#171;-icanon&#187;, &#171;-echo&#187;, &#171;-isig&#187;, &#171;min&#187;, &#171;1&#187;, &#171;time&#187;, &#171;0&#187;)) {    if (state != null) {        runStty(state);    }    return UNCHANGED;}return new HostTerminal(state);\u0414\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0438\u043c\u043f\u0442\u043e\u043c\u0430 \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u043c \u0431\u044b\u043b -isig: \u0445\u043e\u0441\u0442\u043e\u0432\u044b\u0439 TTY \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c ^C \u0432 SIGINT, \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 JVM. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u043c\u043e\u0433 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0432\u043e\u0434 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u0435:-icanon \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0432\u043e\u0434 \u0431\u0435\u0437 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f Enter. \u041a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441\u0442\u0438\u0440\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0436\u043d\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435.min 1 time 0 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442: \u0432 \u043d\u0435\u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 read() \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442, \u0431\u0435\u0437 \u0442\u0430\u0439\u043c-\u0430\u0443\u0442\u0430. \u042d\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 raw mode: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 termios \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u043b\u0438.-echo \u043d\u0435 \u0434\u0430\u0451\u0442 \u0445\u043e\u0441\u0442\u0443 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u2014 \u0437\u0430 \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0432\u0432\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0433\u043e\u0441\u0442\u0435\u0432\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c.\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0433\u043a\u0430 \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430\u044f \u0432\u0435\u0449\u044c: \u0445\u043e\u0441\u0442\u043e\u0432\u044b\u0439 \u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 TTY \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041d\u0430 \u0445\u043e\u0441\u0442\u0435 \u043d\u0443\u0436\u0435\u043d -isig, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c Java. \u0412 \u0433\u043e\u0441\u0442\u0435 \u2014 isig, \u0447\u0442\u043e\u0431\u044b \u0443\u0436\u0435 Linux \u043c\u043e\u0433 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c 0x03 \u0432 SIGINT \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u042d\u0442\u043e \u0434\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0430 \u043d\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.Java \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442 VM \u2014 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0431\u0430\u0439\u0442\u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a Java. \u0412 ConsoleSession.java \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0447\u0438\u0442\u0430\u0435\u0442 System.in \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0431\u0430\u0439\u0442\u044b \u0434\u0430\u043b\u044c\u0448\u0435 (\u044d\u0442\u043e \u0442\u0435\u043b\u043e input pump):TerminalControlResponseFilter input = new TerminalControlResponseFilter(uart::offerInput);int next;while ((next = System.in.read()) &gt;= 0) {    input.accept(next);}input.finish();\u0424\u0438\u043b\u044c\u0442\u0440 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ESC [ row ; column R, \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430. 0x03 \u043a \u043d\u0438\u043c \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f: \u043e\u043d \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043a uart::offerInput. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u00ab\u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c VM\u00bb \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u0442.\u042d\u0442\u0443 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 strace -ff -e read,ioctl: \u0432 \u0442\u0440\u0430\u0441\u0441\u0435 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u0435\u043d\u0438\u0435 &#171;\\3&#187;. \u0417\u043d\u0430\u0447\u0438\u0442, \u0431\u0430\u0439\u0442 \u0434\u043e\u0448\u0451\u043b \u0434\u043e JVM. \u041d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0435\u0433\u043e \u0436\u0434\u0443\u0442 \u0435\u0449\u0451 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, KVM \u0438 Linux \u2014 \u043e\u0434\u0438\u043d read() \u043d\u0438\u0447\u0435\u0433\u043e \u043e \u043d\u0438\u0445 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442.\u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c: \u0445\u043e\u0441\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u0430\u0431\u0438\u0440\u0430\u043b Ctrl+C \u0441\u0435\u0431\u0435. \u041d\u043e \u0433\u0434\u0435 \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u0440\u044f\u043b\u0430\u0441\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f?\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 UART: \u0431\u0430\u0439\u0442 \u0432 RX-\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0435\u0449\u0451 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u0434\u0432\u0430 \u0432\u0438\u0434\u0430 \u00ab\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439\u00bb: IRQ \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0435 \u044f\u0434\u0440\u043e \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 SIGINT \u2014 \u044d\u0442\u043e Unix-\u0441\u0438\u0433\u043d\u0430\u043b, \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c. \u041c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0435\u0449\u0451 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 Linux.\u0414\u043b\u044f serial console \u0432 PanamaKVM \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c 16550-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e COM1: \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u043e\u0440\u0442 0x3f8, \u043b\u0438\u043d\u0438\u044f IRQ4 \u0438 \u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e serial-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0441\u044e\u0434\u0430 Java \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 0x03.\u0414\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u043d\u0443\u0436\u043d\u044b \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e:\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0410\u0434\u0440\u0435\u0441 \u043f\u0440\u0438 DLAB=0\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 RX-\u043f\u0443\u0442\u0438RBR0x3f8, \u0447\u0442\u0435\u043d\u0438\u0435\u0413\u043e\u0441\u0442\u044c \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442 \u0438\u0437 RX-\u043e\u0447\u0435\u0440\u0435\u0434\u0438IER0x3f9\u0411\u0438\u0442 0 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 receive-data interruptIIR0x3fa, \u0447\u0442\u0435\u043d\u0438\u0435\u0421\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u0433\u043e interruptFCR0x3fa, \u0437\u0430\u043f\u0438\u0441\u044c\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 FIFO, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 RXLSR0x3fd\u0411\u0438\u0442 0 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 Data Ready\u0412 Uart16550.java \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:public synchronized void offerInput(int value) {    if ((value &amp; ~0xff) != 0) {        throw new IllegalArgumentException(&#171;UART input must be an unsigned byte: &#187; + value);    }    receivedBytes.add(value);    updateReceiveInterruptLine();}\u0414\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0433\u043e\u0441\u0442\u0435\u043c \u0432\u0430\u0436\u043d\u0435\u0435 \u043d\u0435 \u0441\u0430\u043c\u0430 add(), \u0430 \u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f:private void updateReceiveInterruptLine() {    boolean asserted = !receivedBytes.isEmpty()            &amp;&amp; (interruptEnable &amp; INTERRUPT_ENABLE_RECEIVED_DATA) != 0;    if (receiveInterruptAsserted != asserted) {        receiveInterruptAsserted = asserted;        receiveInterruptLine.setLevel(COM1_INTERRUPT, asserted);    }}\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044d\u0442\u043e\u0439 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439: \u043b\u0438\u043d\u0438\u044f RX IRQ \u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u043f\u043e\u043a\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0451\u043c\u0430. \u041f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f RBR \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f; \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 deassert.\u0417\u0434\u0435\u0441\u044c \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443: \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c 0x03 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c Linux \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442. \u041d\u043e \u0431\u0435\u0437 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u0431\u0430\u0439\u0442 \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c IRQ \u0438 \u043d\u0435 \u0441\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0432\u043e\u0432\u0440\u0435\u043c\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0430. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 interrupt controller.\u041a\u0430\u043a \u0431\u0430\u0439\u0442\u044b UART \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 KVM\u0421\u0432\u044f\u0437\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 VM \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 GuestRunner.java:Uart16550 uart = new Uart16550(System.out, machine::pulseInterrupt, machine::setInterruptLine);\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u2014 KVM backend. \u0412 KvmVirtualMachine.setInterruptLine() Java \u0447\u0435\u0440\u0435\u0437 FFM \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u0434\u0432\u0443\u0445 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 ioctl(KVM_IRQ_LINE):MemorySegment level = arena.allocate(IRQ_LEVEL_SIZE, Integer.BYTES);level.set(JAVA_INT, 0, interrupt);level.set(JAVA_INT, Integer.BYTES, asserted ? 1 : 0);operatingSystem.ioctl(vmDescriptor, KvmUapi.IRQ_LINE, level);\u041f\u0435\u0440\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 struct kvm_irq_level \u2014 GSI\/IRQ, \u0432\u0442\u043e\u0440\u043e\u0435 \u2014 \u0443\u0440\u043e\u0432\u0435\u043d\u044c 0 \u0438\u043b\u0438 1. \u041f\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 KVM API, \u044d\u0442\u043e\u0442 ioctl \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430 interrupt controller, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u044f\u0434\u0440\u0435. \u0414\u043b\u044f edge-triggered \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0437 1 \u0432 0 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 UART \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 IRQ \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c.\u0415\u0441\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0441\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 UART, KVM \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 KVM_EXIT_IO: \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 VMM, VmRunner \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 I\/O bus \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 KVM_RUN. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f: host \u043a\u043b\u0430\u0434\u0451\u0442 \u0431\u0430\u0439\u0442 \u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0433\u043e\u0441\u0442\u044f; guest \u0447\u0438\u0442\u0430\u0435\u0442 UART \u0447\u0435\u0440\u0435\u0437 port I\/O. \u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 KVM_EXIT_IO, VmRunner.java.\u0420\u0430\u0431\u043e\u0442\u0430 UART RX \u0438 IRQ: \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u0430, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0433\u043e \u0441\u043d\u044f\u0442\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439Guest TTY: \u043a\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0x03 \u0432 SIGINT\u041d\u0430 \u044d\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430 Java \u0438 KVM \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Ctrl+C \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. VMM \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 sleep \u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0435\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b. \u041e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043e\u0441\u0442\u044e serial port \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0410 \u0441\u043c\u044b\u0441\u043b \u0431\u0430\u0439\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 Linux.\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 Linux \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:serial8250_rx_chars() \u2192 TTY flip buffer \u2192 N_TTY line discipline \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 ISIG \u0438 VINTR \u2192 SIGINT \u0434\u043b\u044f foreground process group.\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-498519","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498519","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=498519"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498519\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=498519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=498519"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=498519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}