Articles of x86

为什么我不能处理NMI?

我想要处理NMI,并在发生NMI时做一些事情。 首先我写一个天真的nmi处理程序: static irqreturn_t nmi_handler(int irq, void* dev_id) { printk("-#_#- I'm TT, I am handling NMI.\n"); return IRQ_HANDLED; } 并写一个模块注册我的nmi处理程序,然后使用API​​C触发NMI 5次: static void __init ipi_init(void) { printk("-#_#- I'm coming again, hahaha!\n"); int result = request_irq(NMI_VECTOR, nmi_handler, IRQF_DISABLED, "NMI Watchdog", NULL); printk("— the result of request_irq is: %d\n", result); int i; for (i = 0; i […]

x86汇编 – 打印一个给定ASCII码的字符

我是汇编程序devise新手,无法将字符打印到屏幕上。 每当我执行我的程序,我得到一个分段错误,我不知道为什么。 .section .data A: .long 65 # ascii code for 'A' .section .text .globl _start _start: movl $1, %edx # length of character to print, 1 movl A, %ecx # what I want printed movl $1, %ebx # file descriptor for STDOUT movl $4, %eax # syscall number for sys_write int $0x80 # calls […]

如何readelf翻译入口点

我有一个精灵文件,当我使用readelf -h文件名时,我得到了入口点。 现在,让我说我想自己计算这个地址[使用汇编,但语言并不重要]。 我怎样才能做到这一点? 我知道入口点是从文件中的偏移量24开始的4个字节,但是我不知道如何将这个数据转换成地址。

Linux内核中的FPU使用

如果Linux softirq正在通过中断Linux内核模式运行,并且中断的任务正在使用FPU,则不允许在softirq中使用FPU。 如果被中断的任务是用户模式进程,则仍允许在softirq中使用FPU,但不能中断内核模式。 下面讨论代码。 问题是,为什么如此? static inline bool interrupted_kernel_fpu_idle(void) { return !__thread_has_fpu(current) && (read_cr0() & X86_CR0_TS); }

检查一个地址在x86程序集中是否可写

仅使用(32位)x86程序集,是否可以检查地址是否可写, 是否与操作系统没有交互,以及是否存在段错误风险? 程序将在第3环的Linux系统上运行。我不能使用“verw”指令。 举个例子,我可能想要检查地址0x0804a000是否可写。 但是,如果我例如做“mov eax,0x0804a000; mov [eax],eax”,那么,如果地址不可写,程序将会出现段错误。 我知道的唯一的方法是例如调用sys_read到地址,看看是否失败,但是这与操作系统交互。 有没有办法来检查一个地址是否可写入给定的约束? 如果是这样,怎么样?

有没有一个相当于Linux内核的alternative()macros的用户空间?

Linux内核有一个alternative() macros ,它允许开发人员为一系列代码指定多个实现,在运行时使用特定的替代alternative()在内核的alternative()macros的情况下,在启动过程的早期 )。 有没有一种合理的方式来实现类似的用户模式应用程序? 特别是logging备选位置和运行时修补代码。 对于半静态检测可能是有用的:可以在运行时启用或禁用的检测,但仍仅“编译”到特定位置。

这个Linux汇编代码有什么错误?

我需要用Linux编译器编写一个简单的4位函数计算器来编码2个数字,但是程序不能完全正常工作,因为有时读取2个数字会失败。 我的设置和数据: bits 32 global main extern scanf extern printf extern exit section .data menu: db ; truncated, but essentially a string msg1: db "El resultado de la suma es: %d", 10, 0 msg2: db "El resultado de la resta es: %d", 10, 0 msg3: db "El resultado de la multiplicacion es: %d", 10, 0 […]

我如何移动registry中的标签地址?

在x86的gcc内联汇编中,如何移动标签在寄存器中的地址。 它应该是什么,而不是$标签在这里,因为汇编错误未定义的引用标签 。 请注意,标签在asm块之外,即在正常的C代码中。 __asm__ __volatile__ ("movl $label, %eax;"); label: …..

x86:中断处理程序循环

我试图通过IDT处理内核中断。 我在Linux下使用Intel x86。 我已经设置了我的IDT和我的中断条目,我启动了一些testing来查看我的中断处理程序。 当我尝试int $0x0 ,它完美的作品:我的处理程序被调用,但是当我尝试一些exception与推错的代码,我进入一个无限循环。 模式如下: 当exception到达时,我的处理程序的第一部分在ASM中,并调用一个通用的C部分。 my_handler.c void handler(int i) { printf("Exception %d caught\n", i); } my_handlers.S common: pushal pushl %ds pushl %es pushl %fs pushl %gs addl $48, %esp // 4 4-bytes segments pushed // + 8 4-bytes registers (pushal) ` // esp points on exception code call handler // call […]

从汇编程序获取命令行参数

通读“专业汇编语言书”; 它似乎为读取命令行参数提供了一个错误的代码。 我纠正了一下,现在它已经从segfaulting转到阅读参数计数然后segfaulting。 以下是完整的代码: .data output1: .asciz "There are %d params:\n" output2: .asciz "%s\n" .text .globl main main: movl 4(%esp), %ecx /* Get argument count. */ pushl %ecx pushl $output1 call printf addl $4, %esp /* remove output1 */ /* ECX was corrupted by the printf call, pop it off the stack so that we […]