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

原创 2011年05月05日 22:09:00

系统调用是一个软中断,中断号是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;i<NR_TASKS;i++) {
		task[i] = NULL;
		p->a=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中的偏移量。

 

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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux系统调用 int 80h int 0x80

在网上找了好一会儿才找到,自己整理一下,也方便以后查看。 参考网址: http://zh.wikipedia.org/wiki/%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8...
  • xiaominthere
  • xiaominthere
  • 2013年12月12日 20:24
  • 8637

系统调用(int 0x80)详解

1、系统调用初始化 在系统启动时,会在sched_init(void)函数中调用set_system_gate(0x80,&system_call),设置中断向量号0x80的中断描述符: #def...
  • fivedoumi
  • fivedoumi
  • 2016年11月16日 11:31
  • 1701

int 0x80系统调用的参数传递规则

系统调用的参数传递规则: 传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中; A.当系统调用所需参数的个数不超过...
  • m2o2o2d
  • m2o2o2d
  • 2014年03月20日 21:26
  • 1287

对于int $0x80引发的问题

------------------------------------------------------软中断-------------------------------------------...
  • u010467259
  • u010467259
  • 2014年10月16日 00:42
  • 1054

《第一篇 linux 0.12 系统调用(int 0x80)详解》

linux 0.12 系统调用分析,如何从用户态到内核态,系统调用的实现方式。
  • maowenl
  • maowenl
  • 2014年06月19日 09:07
  • 1355

《第一篇 linux 0.12 系统调用(int 0x80)详解》

linux 0.12 系统调用分析,如何从用户态到内核态,系统调用的实现方式。
  • maowenl
  • maowenl
  • 2014年06月19日 09:07
  • 1355

int 0x80系统调用的参数传递规则

系统调用的参数传递规则: 传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中; A.当系统调用所需参数的个数不超过...
  • m2o2o2d
  • m2o2o2d
  • 2014年03月20日 21:26
  • 1287

系统调用(int 0x80)详解

1、系统调用初始化 在系统启动时,会在sched_init(void)函数中调用set_system_gate(0x80,&system_call),设置中断向量号0x80的中断描述符: #def...
  • fivedoumi
  • fivedoumi
  • 2016年11月16日 11:31
  • 1701

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

系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。 [cpp] view plain copy...
  • heikefangxian23
  • heikefangxian23
  • 2016年04月06日 08:38
  • 827

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

系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。 这个中断的设置在kernel/sched.c中441行函数中 [cpp...
  • fivedoumi
  • fivedoumi
  • 2016年11月16日 11:42
  • 795
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux0.11内核--系统中断处理程序int 0x80实现原理
举报原因:
原因补充:

(最多只允许输入30个字)