如何在linux上运行英特尔系统指令?
使用第7代i5处理器,nasm,ld 该程序使用通用寄存器和系统调用编写,在Ubuntu上运行。一个简单的hello world程序就是一个例子如何在linux上运行英特尔系统指令?,linux,assembly,x86,segmentation-fault,Linux,Assembly,X86,Segmentation Fault,使用第7代i5处理器,nasm,ld 该程序使用通用寄存器和系统调用编写,在Ubuntu上运行。一个简单的hello world程序就是一个例子 global _start section .text _start: mov eax, 0x4 ; write(int fd, char *buf, int len) mov ebx, 0x1 ; fd mov ecx, mess
global _start
section .text
_start:
mov eax, 0x4 ; write(int fd, char *buf, int len)
mov ebx, 0x1 ; fd
mov ecx, message ; *buf
mov edx, message_length ; len
int 0x80 ; syscall
mov eax, 0x1 ; exit(int status)
mov ebx, 0x0 ; status
int 0x80 ; syscall
section .data
message db "hello world", 0xA
message_length equ $-message
输出:hello\u world
但是,使用英特尔系统指令编写的程序不工作
global _start
section .text
_start:
CLI
HLT
输出:分段故障(堆芯转储)
你有两个问题:
它不运行/抛出分段错误的原因是,您试图在用户模式下运行需要特定权限的指令 看看哪个描述说明了什么 HLT指令是一条特权指令 还要看一下/STI,它的情况更复杂(在下面的文章和下面的注释中解释),但对于内核模式代码也非常有用。说 在这三种情况下,只有特权应用程序(通常是操作系统内核)可以修改IF[Interrupt flag]。[…]CLI和STI是[也是]特权指令,如果非特权应用程序试图执行,则会触发一般保护故障[…] 这应该可以回答您关于这两个指令之间的差异的问题,以及为什么HLT肯定会生成在用户模式下执行的GPF(一般保护故障)
(实际模式代码可能会始终修改中断标志)您有两个问题:
它不运行/抛出分段错误的原因是,您试图在用户模式下运行需要特定权限的指令 看看哪个描述说明了什么 HLT指令是一条特权指令 还要看一下/STI,它的情况更复杂(在下面的文章和下面的注释中解释),但对于内核模式代码也非常有用。说 在这三种情况下,只有特权应用程序(通常是操作系统内核)可以修改IF[Interrupt flag]。[…]CLI和STI是[也是]特权指令,如果非特权应用程序试图执行,则会触发一般保护故障[…] 这应该可以回答您关于这两个指令之间的差异的问题,以及为什么HLT肯定会生成在用户模式下执行的GPF(一般保护故障)
(如果中断标志出现,实模式代码可能会一直修改)操作系统会阻止它。内核的任务是阻止您做可能干扰系统或其他进程运行的事情,除非您被授权这样做。要运行
cli
和hlt
,您需要是root用户并让操作系统阻止它。内核的任务是阻止您做可能干扰系统或其他进程运行的事情,除非您被授权这样做。要运行cli
和hlt
,您需要是root用户并让cli检查IOPL。你不需要在电话铃里。显然您对HLT是这样做的。Linux为您提供了iopl()
。不过,这对HLT不起作用。Linux下的特权用户可以调用函数iopl
,将其设置为3,然后可以使用CLI
和STI
HLT
虽然不受IOPL影响,但如果CPL!=迈克尔。感谢您的评论。:)在调查CPL(当前特权级别)案例时,我遇到了一个名为GDTR的表。您能推荐一个模拟器来运行这些系统指令吗?CLI会检查IOPL。你不需要在电话铃里。显然您对HLT是这样做的。Linux为您提供了iopl()
。不过,这对HLT不起作用。Linux下的特权用户可以调用函数iopl
,将其设置为3,然后可以使用CLI
和STI
HLT
虽然不受IOPL影响,但如果CPL!=迈克尔。感谢您的评论:在调查CPL(当前特权级别)案例时,我遇到了一个名为GDTR的表。你能推荐一个模拟器来运行这些系统指令吗?
global _start
section .text
_start:
CLI
HLT
nasm -f elf64 halt.s -o halt.o
ld halt.o -o halt
./halt