Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux上运行英特尔系统指令?_Linux_Assembly_X86_Segmentation Fault - Fatal编程技术网

如何在linux上运行英特尔系统指令?

如何在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

使用第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, 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(一般保护故障)

  • 如何编译和运行此代码

    运行此代码的唯一方法是在特权模式下。因此,在Windows或Linux上,您必须编写内核驱动程序或编写自己的操作系统代码,以便合理地使用这些指令

  • 以上仅适用于或代码。

    (实际模式代码可能会始终修改中断标志)

    您有两个问题:

  • 是什么阻止此代码以这种方式编译并运行

    没有任何东西阻止它汇编,因为它是有效代码。
    它不运行/抛出分段错误的原因是,您试图在用户模式下运行需要特定权限的指令

    看看哪个描述说明了什么

    HLT指令是一条特权指令

    还要看一下/STI,它的情况更复杂(在下面的文章和下面的注释中解释),但对于内核模式代码也非常有用。说

    在这三种情况下,只有特权应用程序(通常是操作系统内核)可以修改IF[Interrupt flag]。[…]CLI和STI是[也是]特权指令,如果非特权应用程序试图执行,则会触发一般保护故障[…]

    这应该可以回答您关于这两个指令之间的差异的问题,以及为什么HLT肯定会生成在用户模式下执行的GPF(一般保护故障)

  • 如何编译和运行此代码

    运行此代码的唯一方法是在特权模式下。因此,在Windows或Linux上,您必须编写内核驱动程序或编写自己的操作系统代码,以便合理地使用这些指令

  • 以上仅适用于或代码。

    (如果中断标志出现,实模式代码可能会一直修改)

    操作系统会阻止它。内核的任务是阻止您做可能干扰系统或其他进程运行的事情,除非您被授权这样做。要运行
    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