system_call汇编代码注释

_system_call:
 对系统调用号进行有效性检查
 cmpl $nr_system_calls-1,%eax
 ja bad_sys_call
 将数据段,附加段和fs段寄存器入栈保存
 ds和es段将指向内核数据段
 fs将指向局部数据段
 push %ds
 push %es
 push %fs
 将参数入栈,系统调用的参数ebx,ecx,edx
 pushl %edx
 pushl %ecx  
 pushl %ebx  
 es,ds段指向内核数据段
 movl $0x10,%edx  
 mov %dx,%ds
 mov %dx,%es
 使fs指向用户数据段
 movl $0x17,%edx  
 mov %dx,%fs
 查表,进行系统调用
 call _sys_call_table(,%eax,4)
 将系统调用返回值入栈
 pushl %eax
 当前任务的地址放入eax中
 movl _current,%eax
 进程状态是不是就绪
 cmpl $0,state(%eax)
 如果不是就执行进程调度程序  
 jne reschedule
 看时间片是不是用完
 cmpl $0,counter(%eax)
 如果用完,执行进程调度程序  
 je reschedule
 系统调用返回处
ret_from_sys_call:
 将当前任务的数据结构地址放入eax中
 movl _current,%eax
 看看当前任务是不是任务0
 cmpl _task,%eax
 如果是立即返回中断处理程序
 je 3f
 
 0x0f:局部描述符表中,第一个表项,DPL为3,代码段
 看看当前代码段是否与之相等,来判断是否为用户任务
 cmpw $0x0f,CS(%esp)
 如果不是,立即返回中断
 jne 3f
 0x17:局部描述附表中,第二个表项,DPL为3,数据段
 看看是不是用户数据段
 cmpw $0x17,OLDSS(%esp)
 如果不是,立即返回中断处理程序
 jne 3f
 此时eax为当前任务的地址,将当前任务的信号位图放入ebx中
 movl signal(%eax),%ebx
 将当前任务的受阻塞的信号位图放入ecx
 movl blocked(%eax),%ecx
 从当前任务的信号位图中清除受阻塞的信号集合
 notl %ecx
 andl %ebx,%ecx
 选择受阻塞信号的最小值,放入ecx中
 bsfl %ecx,%ecx
 如果没有信号需要处理,结束中断处理程序
 je 3f
 从信号位图中复位该信号
 btrl %ecx,%ebx
 重置信号位图
 movl %ebx,signal(%eax)
 将要处理的信号+1
 incl %ecx
 将要处理的信号压栈
 pushl %ecx
 调用信号处理函数
 call _do_signal
 返回值存入eax中
 popl %eax
 
 返回中断处理程序
3: popl %eax
 popl %ebx
 popl %ecx
 popl %edx
 pop %fs
 pop %es
 pop %ds
 iret

你可能感兴趣的:(system_call汇编代码注释)