【问题标题】:How can the intel system instructions be run on linux?intel系统指令如何在linux上运行?
【发布时间】:2020-10-15 00:56:36
【问题描述】:

使用第 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
nasm -f elf64 -o hello_world.o hello_world.s
ld hello_world.o -o hello_world
./hello_world

输出:hello_world

但是,使用intel系统指令编写的程序不起作用。

global _start



section .text
    _start:
        CLI
        HLT
nasm -f elf64 halt.s -o halt.o
ld halt.o -o halt
./halt

输出:Segmentation fault (core dumped)

  1. 是什么阻止了这段代码以这种方式编译和运行?
  2. 如何编译和运行这段代码?

【问题讨论】:

  • 操作系统阻止它。内核的工作是阻止您做可能干扰系统或其他进程操作的事情,除非您被授权这样做。要运行clihlt,您需要是root 用户并拥有io privileges

标签: linux assembly x86 segmentation-fault


【解决方案1】:

你有两个问题:

  1. 是什么阻止了这段代码以这种方式编译和运行?

    没有什么能阻止它组装,因为它是有效的代码。
    它不运行/引发分段错误的原因是,您正试图在用户模式下运行需要特定权限的指令。

    查看HLT 的描述说明

    HLT 指令是特权指令。

    另外看看CLI/STI,它的情况比较复杂(在下面的文章和下面的cmets中有解释),但也大部分内核模式有用 代码。 Wikipedia

    在所有三种情况下,只有特权应用程序(通常是操作系统内核)可以修改 IF[中断标志]。 [...] CLI 和 STI [也是] 特权指令,如果非特权应用程序尝试执行它,它们会触发一般保护错误,[...]

    这应该可以回答您关于这两条指令之间的区别以及为什么 HLT 肯定会生成在 用户模式 中执行的 GPF(一般保护错误)的问题。

  2. 如何编译和运行这段代码?

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

以上仅适用于Protected ModeLong Mode代码。
(实模式代码可能总是修改 IF,中断标志

【讨论】:

  • CLI 检查 IOPL。为此,您不需要在 ring0 中。显然你是为 HLT 做的。
  • Linux 为您提供iopl()。不过,这对 HLT 不起作用。
  • Linux下的特权用户可以调用函数iopl并将其设置为3,然后CLISTI可以使用man7.org/linux/man-pages/man2/iopl.2.htmlHLT 虽然不受 IOPL 影响,但如果 CPL != 0 会引发 #GP。
  • 迈克尔。感谢您的评论。 :) 在调查 CPL(当前权限级别)案例时,我遇到了一个名为 GDTR 的表。你能推荐一个模拟器来运行这些系统指令吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多