このプログラムは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アプローチは、カーネルでこれを行い、ユーザー領域プロセスがそれを呼び出すために使用できるインターフェースを公開することです。これにより、コードはカーネルのコンテキスト内で実行され、ユーザーが通常アクセスできないハードウェア/システム機能へのフルアクセス権を持ちます。