需要帮助了解Linux内核的BIOS中断调用

时间:2014-04-03 22:33:19

标签: c assembly linux-kernel

我正在研究Linux源代码,以了解它是如何获取内存映射的。我认为它首先调用detect_memory()来定义here。此函数调用detect_memory_e820(),该detect_memory_e820()在同一文件中定义。第48行intcall调用 .code16gcc .text .globl intcall .type intcall, @function intcall: /* Self-modify the INT instruction. Ugly, but works. */ cmpb %al, 3f je 1f movb %al, 3f jmp 1f /* Synchronize pipeline */ 1: /* Save state */ pushfl pushw %fs pushw %gs pushal /* Copy input state to stack frame */ subw $44, %sp movw %dx, %si movw %sp, %di movw $11, %cx rep; movsd /* Pop full state from the stack */ popal popw %gs popw %fs popw %es popw %ds popfl /* Actual INT */ .byte 0xcd /* INT opcode */ 3: .byte 0 /* Push full state to the stack */ pushfl pushw %ds pushw %es pushw %fs pushw %gs pushal /* Re-establish C environment invariants */ cld movzwl %sp, %esp movw %cs, %ax movw %ax, %ds movw %ax, %es /* Copy output state from stack frame */ movw 68(%esp), %di /* Original %cx == 3rd argument */ andw %di, %di jz 4f movw %sp, %si movw $11, %cx rep; movsd 4: addw $44, %sp /* Restore state and return */ popal popw %gs popw %fs popfl retl .size intcall, .-intcall ,其定义如下:

movw    %dx, %si

我的问题是我无法弄清楚此时dx寄存器的值是什么:{{1}}以及来自何处。

1 个答案:

答案 0 :(得分:4)

请注意,makefile指定-mregparm=3用于编译16位C代码。这指示编译器将前3个参数放入寄存器eaxedxecx中。因此dx的值将成为第二个参数&iregs。另请注意下面的评论确认:/* Original %cx == 3rd argument */

我发现你在开始时没有问题,关于al如何得到中断号的值,这很有趣:)