linux - 中断栈的栈指针

标签 linux stack kernel interrupt

Linux 内核为用户模式和内核模式进程提供了独立的堆栈,还有一些特殊的堆栈。其中一个特殊堆栈是大小为 16 KB 的中断堆栈,位于 irq_stack_union 中:

union irq_stack_union {
    char irq_stack[IRQ_STACK_SIZE];
    struct {
        char gs_base[40];
        unsigned long stack_canary;
    };
};

有指向这个堆栈的指针的定义 - irq_stack_ptr。据我正确理解,这个 irq_stack_ptr 必须指向 irq_stack 的末尾,或者换句话说指向 irq_stack + IRQ_STACK_SIZE - 1,但是 irq_stack_ptr 的定义> 是:

DEFINE_PER_CPU(char *, irq_stack_ptr) =
    init_per_cpu_var(irq_stack_union.irq_stack) + IRQ_STACK_SIZE - 64;

这里为什么要从irq_stack_union.irq_stack的末尾减去64字节?

谢谢。

最佳答案

用作边距以避免不小心越界?

关于linux - 中断栈的栈指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32159700/

相关文章:

c - 内核如何使用task_struct?

process - 如何遍历 PCB 以在 Linux 内核模块中显示信息?

c - 静态链接库的类似 dlsym 的行为

linux - db2 查询在不同的环境中花费不同的时间

assembly - 初学者 : Can't decode this assembly code

c - 在 C 中设置堆栈

javascript - 无法访问 Linux 服务器上的构建

python-3.x - 在Linux中创建一个后台运行的进程

java - 添加新节点时使用堆栈来存储trap节点。为什么我会收到 EmptyStackException?

linux - 在单核CPU中,IRQ处理程序可以再次被相同的IRQ中断