文件proc/irq/主要是用于对每个irq进行设置和信息查看:
void init_irq_proc(void) { unsigned int irq; struct irq_desc *desc;
/* create /proc/irq */ root_irq_dir = proc_mkdir("irq", NULL); if (!root_irq_dir) return;
register_default_affinity_proc();
/* * Create entries for all existing IRQs. */ for_each_irq_desc(irq, desc) 对系统内的所有的中断进行注册 register_irq_proc(irq, desc); }
void register_irq_proc(unsigned int irq, struct irq_desc *desc) { static DEFINE_MUTEX(register_lock); char name [MAX_NAMELEN];
if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip)) return;
/* * irq directories are registered only when a handler is * added, not when the descriptor is created, so multiple * tasks might try to register at the same time. */ mutex_lock(®ister_lock);
if (desc->dir) goto out_unlock;
sprintf(name, "%d", irq);
/* create /proc/irq/1234 */ desc->dir = proc_mkdir(name, root_irq_dir); if (!desc->dir) goto out_unlock;
#ifdef CONFIG_SMP /* create /proc/irq/<irq>/smp_affinity */ proc_create_data("smp_affinity", 0644, desc->dir, &irq_affinity_proc_fops, (void *)(long)irq);
/* create /proc/irq/<irq>/affinity_hint */ proc_create_data("affinity_hint", 0444, desc->dir, &irq_affinity_hint_proc_fops, (void *)(long)irq);
/* create /proc/irq/<irq>/smp_affinity_list */ proc_create_data("smp_affinity_list", 0644, desc->dir, &irq_affinity_list_proc_fops, (void *)(long)irq);
proc_create_data("node", 0444, desc->dir, &irq_node_proc_fops, (void *)(long)irq); #endif
proc_create_data("spurious", 0444, desc->dir, &irq_spurious_proc_fops, (void *)(long)irq);
out_unlock: mutex_unlock(®ister_lock); }
:/proc/irq # ls ls 100 101 102 103 104 105 106 107 108 109 110 111 112 99
:/proc/irq/203 # ls ls affinity_hint node smp_affinity smp_affinity_list spurious