gpt4 book ai didi

linux - IN 指令段错误,内联汇编 GCC

转载 作者:太空宇宙 更新时间:2023-11-04 10:12:27 25 4
gpt4 key购买 nike

我正在尝试通过内联汇编代码中的 IN 和 OUT 指令从 Linux (Ubuntu) 上的 C 访问 I/O 端口。一旦执行 IN 或 OUT 指令,就会产生段错误。

例如,这段简单的代码会产生段错误:

#include <stdint.h>

int main() {

uint8_t readvalue = 0;
uint16_t port = 0xB3;

asm volatile("in %%dx, %%al\n\t"
: "=a" (readvalue)
: "d" (port)
);

return(0);

}

我编译:gcc -O2 -g

从 GDB 中,我看到该程序被编译成以下简单的汇编代码序列:

mov    $0xb3,%edx
in (%dx),%al
xor %eax,%eax
retq

而在 GDB 中,我看到一旦执行 IN 指令,就会发生段错误。

完整的 GDB session :

(gdb) list 
1 #include <stdint.h>
2
3 int main() {
4
5 uint8_t readvalue = 0;
6 uint16_t port = 0xB3;
7
8 asm volatile("in %%dx, %%al\n\t"
9 : "=a" (readvalue)
10 : "d" (port)
(gdb) list
11 );
12
13 return(0);
14
15 }
16
(gdb) break 7
Breakpoint 1 at 0x4003e0: file tcgsmi_inonly_pure.c, line 7.
(gdb) r
Starting program: /home/emerald/tcgsmi_inonly_pure

Breakpoint 1, main () at tcgsmi_inonly_pure.c:8
8 asm volatile("in %%dx, %%al\n\t"
(gdb) disass
Dump of assembler code for function main:
=> 0x00000000004003e0 <+0>: mov $0xb3,%edx
0x00000000004003e5 <+5>: in (%dx),%al
0x00000000004003e6 <+6>: xor %eax,%eax
0x00000000004003e8 <+8>: retq
End of assembler dump.
(gdb) display/i $rip
1: x/i $rip
=> 0x4003e0 <main>: mov $0xb3,%edx
(gdb) ni
0x00000000004003e5 8 asm volatile("in %%dx, %%al\n\t"
1: x/i $rip
=> 0x4003e5 <main+5>: in (%dx),%al
(gdb) ni

Program received signal SIGSEGV, Segmentation fault.
0x00000000004003e5 in main () at tcgsmi_inonly_pure.c:8
8 asm volatile("in %%dx, %%al\n\t"
1: x/i $rip
=> 0x4003e5 <main+5>: in (%dx),%al

最佳答案

答案在 OP 的评论中。

IO 端口不能简单地在用户模式下访问。

  1. 程序需要以 root 身份运行(例如使用 sudo)。
  2. 在访问端口之前,需要使用 ioperm() 解锁它们。

ioperm() 的原型(prototype)是:

int ioperm(unsigned long from, unsigned long num, int turn_on);

from = 您要访问的端口范围的起始 ID
num = 范围的长度
turn_on = 非零启用访问,零禁用访问

因此,在上面的示例中,调用将是:

ioperm(0xB3,1,1);

关于linux - IN 指令段错误,内联汇编 GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48178058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com