gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:42:36 31 4
gpt4 key购买 nike

我正在研究 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

我的问题是此时我无法弄清楚 dx 寄存器的值是什么:movw %dx, %si 以及它的来源。

最佳答案

请注意 makefile指定 -mregparm=3 用于编译 16 位 C 代码。这指示编译器在可能的情况下将前 3 个参数放入寄存器 eaxedxecx。所以 dx 的值将成为第二个参数,&iregs。另请注意下方的注释证实了这一点:/* Original %cx == 3rd argument */

关于 al 如何获取中断号的值,我觉得很有趣,您一开始就没有问题 :)

关于c - 需要帮助了解 Linux 内核的 BIOS 中断调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22850243/

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