このプログラムはx86 LinuxシステムのGnu Assembler用に書かれており、トリプルエラーが発生して再起動されます。
.text
.global _start
_start:
# write our string to stdout
movl $len,%edx # third argument: message length
movl $msg,%ecx # second argument: pointer to message to write
movl $1,%ebx # first argument: file handle (stdout)
movl $4,%eax # system call number (sys_write)
int $0x80 # call kernel
# Triple Fault -- reboot
movq $1, %rsp # Load the stack pointer with a one
pushq %rax # Push the A register, should cause a triple fault.
# and exit
movl $0,%ebx # first argument: exit code
movl $1,%eax # system call number (sys_exit)
int $0x80 # call kernel
.data # section declaration
msg:
.ascii "Will reboot by triple fault!\n" # our dear string
len = . - msg # length of our dear string
代わりに分割エラーが発生します。 rootで実行すると、ユーザーモードで動作させることができますか?
答え1
Linuxカーネルは、ユーザースペースが他のユーザーに影響を与える可能性のある操作を実行することを許可しません。ルートとして同様の操作を実行できますが、カーネルは依然としてそのような直接制御を防ぐことができます。結局のところ、ルートプロセスはまだユーザーモードプロセスですが、カーネルのシステムコールに無制限にアクセスできます。
より正確な/UNIXyアプローチは、カーネルでこれを行い、ユーザー領域プロセスがそれを呼び出すために使用できるインターフェースを公開することです。これにより、コードはカーネルのコンテキスト内で実行され、ユーザーが通常アクセスできないハードウェア/システム機能へのフルアクセス権を持ちます。
答え2
これらのCPUエラーはカーネルモード割り込みハンドラによって処理されます。カーネルコードは問題ありません。ユーザースペースエラーが発生した場合(たとえば、0で割ったり、誤ったメモリアクセス)、最初の割り込みハンドラはそれを正しく処理する必要があります。他のすべてはカーネルのバグです。割り込みハンドラに欠陥がある場合、基本的に唯一合理的な方法は、レジスタとスタックをダンプしてから、デバッガ(OpenBSDが実行するものなど)またはHCFに入れることです。パニックニュースを記録してください。その時点で、コードが正常に機能しなくなったため、トリプルエラーが発生します。
要約:これを機能させるには、Linuxのトラブルシューティングコードでバグを見つけなければなりません。
意図的に割り込みハンドラを中断するカーネルモジュールでこれを行うことができますが、システムがクラッシュする可能性もあります。効果が異なりますshutdown -r now
!
答え3
reboot
Linuxではシステムコールを使用できます。
#include <unistd.h>
#include <sys/reboot.h>
int main(void) {
return reboot(LINUX_REBOOT_CMD_RESTART);
}
答え4
私は本当にアセンブラ(?!)が必要な場合はrootで動作しました(私の考えにはnasmを使います)。
BITS 32
mov eax, 88
mov ebx, 0xfee1dead
mov ecx, 85072278
mov edx, 0x01234567
int 0x80