// 中断入口
// 注:gnu 每个符号分属global(被输出)和local(不被输出)两类中的一种。
1.1 #define ENTRY(name) \
.globl name; \
ALIGN; \//之后的代码对齐到32字节,使用NOP(0x90)补齐
name:
// 代码对齐
// .align(n) power-of-2对齐
// 4 对齐到16字节, 5 对齐到32字节
// 0x90 NOP 指令的机器码,用于填充到指定的对齐字节
1.2 #define ALIGN .align 4,0x90
// 可屏蔽中断入口
// 1.IRQn中断处理程序所在的地址开始是保存在interrupt[n]之中的,之后才复制到IDT相应的表项中断门中
// 2..text段连续存储在一起,.data段连续存储在一起
// 3.最终在内存中:
// 3.1 所有可屏蔽中断的入口地址依次连续存储在.data段,interrupt保存数组起始地址
// interrupt ->
// interrupt[0]
// interrupt[1]
// interrupt[2]
// .
// .
// interrupt[255]
// 3.2 所有可屏蔽中断处理函数依次连续存储在.text段,irq_entries_start保存数组起始地址
// irq_entries_start ->
// pushl -256
// jmp common_interrupt
// pushl -255
// jmp common_interrupt
// pushl -254
// jmp common_interrupt
// .
// .
// pushl -1
// jmp
中断子系统3_中断入口处理
最新推荐文章于 2021-05-10 04:31:31 发布
这篇博客详细介绍了Linux内核中中断处理的入口、数据段和代码段的组织方式,以及`do_IRQ`和`__do_IRQ`函数在中断处理过程中的作用。中断处理涉及中断嵌套计数、内核栈切换、中断控制器的交互等关键步骤。
摘要由CSDN通过智能技术生成