Паника ядра - не синхронизируется: Неустранимая проверка машины на текущем процессоре

С помощью таких уловок, как mlockall () , вы можете принудительно вывести все адресное пространство процесса на подкачку, но этого не произойдет. поможет вам сэкономить память, потому что независимо от того, что ядро ​​будет держать резервный файл открытым до тех пор, пока он отображается в память (даже если вы его удалите).

То, что вы ищете, называется eXecute In Place (XIP) и представляет собой функцию, которая позволяет вам выполнять файлы непосредственно из памяти, отображаемой в памяти, вместо того, чтобы сначала копировать в (отдельную) RAM.

XIP очень сложно поддерживать, потому что он предъявляет жесткие требования к тому, как исполняемый файл должен быть размещен в хранилище (в файловой системе, если применимо). Например, разделы файла, которые будут отображаться в памяти, должны быть выровнены по страницам в хранилище, а не смешаны с метаданными файловой системы. Кроме того, в идеале двоичный файл должен быть скомпилирован как позиционно-независимый код , чтобы компоновщику времени выполнения не пришлось изменять какую-либо его часть после отображения. Практически никакие файловые системы не поддерживают XIP.

К счастью, насколько я понимаю, tmpfs действительно поддерживает XIP. Если это верно, то ваше решение - просто смонтировать файловую систему tmpfs и переместить туда исполняемый файл перед его запуском.


Обновление после xiaokaoy прокомментировал :

Если я просто перенесу исполняемый файл в tmpfs, сможет ли он автоматически выполняться на месте? Почему? Что заставляет файл в ОЗУ выравниваться по страницам? Будет ли загрузчик проверять соответствие исполняемого файла необходимым условиям для работы в режиме XIP каждый раз, когда он начинает загружать исполняемый файл?

tmpfs может поддерживать XiP из-за способа хранения файлов в ОЗУ. Файлы в tmpfs хранятся на страницах памяти, причем каждому файлу выделяется целое количество страниц памяти, не используемых совместно с другими файлами в tmpfs. (Вот почему файлы в tmpfs всегда занимают кратное 4 КиБ - размеру страницы.) Данные хранятся с первым байтом файла в первом байте его страницы памяти и так далее. Поэтому, когда mmap () (или загрузчик ELF ядра) вызывается для сопоставления страниц из файла, ему не нужно копировать данные на новые страницы, он может просто поделиться страницами, которые уже принадлежат tmpfs - пока отображение выровнено (что должно быть с ELF).

0
29.08.2015, 10:35
1 ответ

Самостоятельный ответ: я был прав, проверяя температуру в BIOS, но ошибался, придавая ей незначительное значение. Похоже, данная ошибка действительно была вызвана перегревом процессора.

На самом деле, когда я снизил целевую температуру, которой должен достичь вентилятор корпуса (на 5 ° C), вентилятор, конечно, стал работать более интенсивно, и через несколько недель паника в ядре больше не повторялась.

0
29.04.2021, 00:24

Теги

Похожие вопросы