linux中断机制

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1.中断机制

1.1.中断流程图

 1.2.代码结构图

2.中断代码

2.1.硬件中断

 2.2.asm.s

2.3.trap.c

 2.3.1.trap_init函数

 2.3.2.die函数

2.4 .sys_call.s

2.4.1._system_call.s

3.总结


1.中断机制

何为中断中断里面各种名词的区分请看下面这几篇博客希望可以帮助到你这里主要是源码分析就不展开了。

(2条消息) linux 0.11内核源码之中断_linux 0.11中断解析_@seven@的博客-CSDN博客

(5条消息) x86 - 操作系统中断、陷阱、异常、故障、终止_嗷大墨的博客-CSDN博客_操作系统 陷阱

(2条消息) 硬件中断 软件中断 &中断异常的区别_@seven@的博客-CSDN博客

1.1.中断流程图

下面这个图是老师视频里面的图个人觉得不错就放上来了。

中断处理

                 现场保存将寄存器进行压栈这个栈就在线程的栈里面tcb结构体保存现场数据

                中断程序执行中断服务程序

                现场恢复将寄存器进行弹栈进行现场数据恢复进行执行中断之前的程序。

 1.2.代码结构图

2.中断代码

2.1.硬件中断

 由图可以知道硬件中断处理代码主要是 asm.s以及trap.c。下面将分析这两个文件

 2.2.asm.s

这里主要是中断处理前后过程。[现场保存 中断程序执行 现场恢复----中断三大步]

no_error_code://无中断码中断
//现场保存
	xchgl %eax,(%esp)
	pushl %ebx
	pushl %ecx
	pushl %edx
	pushl %edi
	pushl %esi
	pushl %ebp
	push %ds
	push %es
	push %fs
	pushl $0		# "error code"
	lea 44(%esp),%edx
	pushl %edx
	movl $0x10,%edx
	mov %dx,%ds
	mov %dx,%es
	mov %dx,%fs
//中断处理程序入口
	call *%eax     //中断处理程序入口
//现场恢复
	addl $8,%esp
	pop %fs
	pop %es
	pop %ds
	popl %ebp
	popl %esi
	popl %edi
	popl %edx
	popl %ecx
	popl %ebx
	popl %eax
	iret		//返回值操作

这个是无错误码的与有错误码差不多。中断程序在trap.c里面

2.3.trap.c

 2.3.1.trap_init函数

//中断的初始化函数
//set_trap_gate 优先级较低 只能由用户程序来调用
//set_system_gate 优先级很高 能由系统和用户所有的程序调用
void trap_init(void)
{
	int i;

	set_trap_gate(0,&divide_error);//如果被除数是0就会产生这个中断
	set_trap_gate(1,&debug);//单步调试的时候调用这个中断
	set_trap_gate(2,&nmi);
	set_system_gate(3,&int3);	/* int3-5 can be called from all */
	set_system_gate(4,&overflow);
	set_system_gate(5,&bounds);
	set_trap_gate(6,&invalid_op);
	set_trap_gate(7,&device_not_available);
	set_trap_gate(8,&double_fault);
	set_trap_gate(9,&coprocessor_segment_overrun);
	set_trap_gate(10,&invalid_TSS);
	set_trap_gate(11,&segment_not_present);
	set_trap_gate(12,&stack_segment);
	set_trap_gate(13,&general_protection);
	set_trap_gate(14,&page_fault);
	set_trap_gate(15,&reserved);
	set_trap_gate(16,&coprocessor_error);
	for (i=17;i<48;i++)
		set_trap_gate(i,&reserved);
	set_trap_gate(45,&irq13);
	outb_p(inb_p(0x21)&0xfb,0x21);
	outb(inb_p(0xA1)&0xdf,0xA1);
	set_trap_gate(39,&parallel_interrupt);
}

 2.3.2.die函数

//esp_ptr 段指针
//nr 出错的段号
//总的来说die函数就是用来打印错误信息
static void die(char * str,long esp_ptr,long nr)
{
	long * esp = (long *) esp_ptr;
	int i;
	//以下基本在打印栈信息
	printk("%s: %04x\n\r",str,nr&0xffff);
	printk("EIP:\t%04x:%p\nEFLAGS:\t%p\nESP:\t%04x:%p\n",
		esp[1],esp[0],esp[2],esp[4],esp[3]);
	printk("fs: %04x\n",_fs());
	printk("base: %p, limit: %p\n",get_base(current->ldt[1]),get_limit(0x17));
	if (esp[4] == 0x17) {
		printk("Stack: ");
		for (i=0;i<4;i++)
			printk("%p ",get_seg_long(0x17,i+(long *)esp[3]));
		printk("\n");
	}
	str(i);
	printk("Pid: %d, process nr: %d\n\r",current->pid,0xffff & i);
	for(i=0;i<10;i++)
		printk("%02x ",0xff & get_seg_byte(esp[1],(i+(char *)esp[0])));
	printk("\n\r");
	do_exit(11);//退出中断		/* play segment exception */
}

2.4 .sys_call.s

里面主要是一些中断汇编代码本质都是现场保存中断程序执行现场恢复的过程。

2.4.1._system_call.s

该函数主要关注的是设置eax寄存器然后通过call _sys_call_table(,%eax,4)获取中断服务函数sys_call_table是一个数组typedef int (*fn_ptr)()类型的函数指针【返回值是int 参数无所谓】

_system_call:
	cmpl $nr_system_calls-1,%eax
	ja bad_sys_call
	push %ds
	push %es
	push %fs
	pushl %edx
	pushl %ecx		# push %ebx,%ecx,%edx as parameters
	pushl %ebx		# to the system call
	movl $0x10,%edx		# set up ds,es to kernel space
	mov %dx,%ds
	mov %dx,%es
	movl $0x17,%edx		# fs points to local data space
	mov %dx,%fs
	call _sys_call_table(,%eax,4)
	pushl %eax
	movl _current,%eax
	cmpl $0,state(%eax)		# state
	jne reschedule
	cmpl $0,counter(%eax)		# counter
	je reschedule
//定义系统调用的sys_call_table
fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
sys_setreuid,sys_setregid };

至于sys_call_table的函数实现可以自己去查看一下。

3.总结

中断程序处理就是三步走现场保存中断程序处理现场恢复。

在汇编中主要负责现场保存以及恢复中断程序的实现在.c文件里面。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux