- 论坛徽章:
- 0
|
原帖由 motalelf 于 2008-3-28 16:24 发表 [
因此,disable_irq并不是真正的屏蔽中断线,而只是记一个IRQ_DISABLE标志位,中断照常发生并传递给CPU。
其他地方能理解, 这句总觉得不对。
disable_irq() > disable_irq_nosync() :
desc->status |= IRQ_DISABLED;
desc->chip->disable(irq);
而我们考虑一个 外设上的中断, 它的chip是ioapic_chip, 其disable方法为mask_IO_APIC_irq (注:ioapic_chip并没有disable方法,按照irq_chip结构的注释,如果disable为NULL,那么就会默认为其mask方法):
mask_IO_APIC_irq > __mask_IO_APIC_irq
/* mask = 1 */
static void __mask_IO_APIC_irq (unsigned int irq)
{
__modify_IO_APIC_irq(irq, 0x00010000, 0);
}
0x00010000, 正好是把IO-APIC中这个irq 的entry的 第16比特设置为1 ── 也就是mask。 这个见82093AA datasheet
struct IO_APIC_route_entry {
__u32 vector : 8,
delivery_mode : 3, /* 000: FIXED
* 001: lowest prio
* 111: ExtINT
*/
dest_mode : 1, /* 0: physical, 1: logical */
delivery_status : 1,
polarity : 1,
irr : 1,
trigger : 1, /* 0: edge, 1: level */
mask : 1, /* 0: enabled, 1: disabled */
__reserved_2 : 15;
union { struct { __u32
__reserved_1 : 24,
physical_dest : 4,
__reserved_2 : 4;
} physical;
struct { __u32
__reserved_1 : 24,
logical_dest : 8;
} logical;
} dest;
} __attribute__ ((packed));
所以我觉得您这里说的有问题 |
|