作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始尝试了解 Linux 内核,并尝试找到 IDTR 的位置。 似乎应该是一个足够简单的过程,因为汇编语言为此目的提供了 lidt
指令。因此,我认为我可以提供一个足够大的结构来容纳该寄存器的内容作为输出操作数,如下所示:
struct idt_ptr
{
unsigned short limit;
unsigned long long base;
} __attribute__((packed));
struct idt_ptr idtp;
int * get_idt() {
__asm__
__volatile__(
"lidt %0;"
: "=&r"(idtp)
);
}
当然,这是行不通的。结果是
/var/folders/yb/ybzqw8850nz9lzjsc6jf9hkw0000gn/T//ccvNm3SA.s:11:suffix or operands invalid for `lidt'
我认为结构体的大小是正确的,short
应该为段地址提供16位,long long
为段地址提供64位抵消。问题只是我不能使用结构作为输出目标吗?否则我该怎么办?另外,由于资源(据我发现)有点稀缺,有人可以推荐关于该主题的好的教程或书籍吗?
谢谢。
最佳答案
这是an example在 gcc 内联汇编中使用 LIDT。请注意,LIDT
设置 IDTR
的新值,而不是读取当前值。您应该使用SIDT
来读取IDTR
。这是 example了解如何使用 gcc 进行内联汇编。
关于c - 在内联汇编中读取非标准大小的寄存器(IDTR)(容易吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158312/
我是一名优秀的程序员,十分优秀!