系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。
这个中断的设置在kernel/sched.c中443行函数中
1 void sched_init(void) 2 { 3 int i; 4 struct desc_struct * p; 5 6 if (sizeof(struct sigaction) != 16) 7 panic("Struct sigaction MUST be 16 bytes"); 8 set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss)); 9 set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt)); 10 p = gdt+2+FIRST_TSS_ENTRY; 11 for(i=1;i<NR_TASKS;i++) { 12 task[i] = NULL; 13 p->a=p->b=0; 14 p++; 15 p->a=p->b=0; 16 p++; 17 } 18 /* Clear NT, so that we won't have troubles with that later on */ 19 __asm__("pushfl ; andl $0xffffbfff,(%esp) ; popfl"); 20 ltr(0); 21 lldt(0); 22 outb_p(0x36,0x43); /* binary, mode 3, LSB/MSB, ch 0 */ 23 outb_p(LATCH & 0xff , 0x40); /* LSB */ 24 outb(LATCH >> 8 , 0x40); /* MSB */ 25 set_intr_gate(0x20,&timer_interrupt); 26 outb(inb_p(0x21)&~0x01,0x21); 27 set_system_gate(0x80,&system_call); 28 }
http://blog.csdn.net/yming0221/article/details/6398414