设为首页 - 加入收藏 焦点技术网
热搜:java
当前位置:首页 >

Linux0.11内核--系统中断处理程序int 0x80实现原理

导读:本文yming0221给大家介绍 Linux0.11内核--系统中断处理程序int 0x80实现原理。系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。这个中断的设置在ke。。。

系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。

这个中断的设置在kernel/sched.c中441行函数中

void sched_init(void){ int i; struct desc_struct * p; if (sizeof(struct sigaction) != 16)  panic("Struct sigaction MUST be 16 bytes"); set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss)); set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt)); p = gdt+2+FIRST_TSS_ENTRY; for(i=1;ia=p->b=0;  p++;  p->a=p->b=0;  p++; }/* Clear NT, so that we won't have troubles with that later on */ __asm__("pushfl ; andl $0xffffbfff,(%esp) ; popfl"); ltr(0); lldt(0); outb_p(0x36,0x43);  /* binary, mode 3, LSB/MSB, ch 0 */ outb_p(LATCH & 0xff , 0x40); /* LSB */ outb(LATCH >> 8 , 0x40); /* MSB */ set_intr_gate(0x20,&timer_interrupt); outb(inb_p(0x21)&~0x01,0x21); set_system_gate(0x80,&system_call);}

最后一句就将0x80中断与system_call(系统调用)联系起来。

通过int 0x80,就可使用内核资源。不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数库中再通过int 0x80进行系统调用。
    所以,系统调用过程是这样的:
    应用程序调用libc中的函数->libc中的函数引用系统调用宏->系统调用宏中使用int 0x80完成系统调用并返回

下面是sys_call_table的定义文件

位于./include/sys.h

 

其中sys_call_table的类型是fn_ptr类型,其中sys_call_table[0]元素为sys_setup,它的类型是fn_ptr类型,它实际上是函数sys_setup的

入口地址。

它的定义如下:

typedef int (*fn_ptr) (); // 定义函数指针类型。

下面的实例代码有助于理解函数指针:

 

 

system_call系统调用入口函数

./include/unistd.h文件中系统调用符号和调用号的对应定义

 

这是一系列宏,它们的定义在unistd.h中,基本形式为#define _NR_name value,name为系统函数名字,value是一个整数值,是name所对应的系统函数指针在sys_call_table中的偏移量。

 

系统调用宏也在本文件内定义,采用内联汇编,如下:

 

(编辑: yming0221)

网友评论
相关文章