После большего количества рытья вокруг мы нашли эту статью:
Таким образом, все, чему было нужно сделанный, должно было загрузиться в noprobe
режим:
boot: linux noprobe text
затем укажите драйвер вручную:
I2O Block driver (i2o_block)
Однако после всего того потраченного впустую времени, было решено, чтобы эти поля и SCSI имели свой день и производятся к пастбищу.
Ядро Linux не позволяет пространству пользователя делать такие вещи, которые могли влиять на других пользователей. Как корень, Вы Смогли делать что-то как этот, но ядро могло бы все еще предотвратить такое прямое управление; в конце концов, корневой процесс является все еще процессом пространства пользователя, но тот, который имеет неограниченный доступ к системным вызовам ядра.
Больше подхода correct/UNIXy должно выполнить этот вид действия в ядре и выставить интерфейс, который процессы пространства пользователя могут использовать для вызова его. Затем Ваш код будет выполнен в контексте ядра и иметь полный доступ к аппаратным средствам/характеристикам системы, к которым у пользователей не должно обычно быть доступа.
Сбои ЦП как это обрабатываются обработчиками прерываний привилегированного режима. Код ядра хорош, и если отказ пространства пользователя происходит (как деление на нуль или доступ к недопустимой памяти), первый обработчик прерываний должен обработать его правильно. Что-либо еще - ошибка в ядре - если существует отказ в обработчике прерываний, в основном единственная нормальная вещь сделать вывести регистры и стек, и спадать до отладчика (как OpenBSD делает), или HCF так, чтобы паническое сообщение могло быть записано. Тройные отказы существуют, потому что той точкой Ваш код просто не работает.
TL; DR: Чтобы это работало, необходимо найти ошибку в обрабатывающем отказ коде в Linux.
Вы смогли делать это в модуле ядра, который намеренно разрушает обработчиков прерываний, но Вы, также очень вероятно, разрушите систему. Это не тот же эффект как shutdown -r now
!
На Linux можно использовать reboot
системный вызов:
#include <unistd.h>
#include <sys/reboot.h>
int main(void) {
return reboot(LINUX_REBOOT_CMD_RESTART);
}
Если Вам действительно нужен ассемблер (?!), это раньше работало от корня (с nasm, я думаю):
BITS 32
mov eax, 88
mov ebx, 0xfee1dead
mov ecx, 85072278
mov edx, 0x01234567
int 0x80