当前位置:  技术问答>linux和unix

linux0.12 ret_from_sys_call的疑问

    来源: 互联网  发布时间:2017-01-10

    本文导语:  小弟正在读linux0.12内核 读到系统调用时有疑问实在不能解决,高手指点。比较长是我吧这两段程序都复制了。 linux 0.12的系统调用中: _system_call: push %ds push %es push %fs pushl %eax # save the orig_eax pushl %edx pushl...

小弟正在读linux0.12内核
读到系统调用时有疑问实在不能解决,高手指点。比较长是我吧这两段程序都复制了。
linux 0.12的系统调用中:
_system_call:
push %ds
push %es
push %fs
pushl %eax # save the orig_eax
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
cmpl _NR_syscalls,%eax
jae bad_sys_call
call _sys_call_table(,%eax,4)
pushl %eax
2:
movl _current,%eax
cmpl $0,state(%eax) # state
jne reschedule
cmpl $0,counter(%eax) # counter
je reschedule
前面都能理解,2:movl _current,%eax
cmpl $0,state(%eax) # state
jne reschedule
cmpl $0,counter(%eax) # counter
je reschedule
问题1:
这几行程序是看当前进程是否在就绪状态或时间片是否用完,小弟要问的是这几行程序在这里有什么必要的意义呢?
我认为是在执行系统调用时,任务是处于内核态的,而早期的linux内核是非抢占式的,也就是在执行系统调用时该任务是不会主动放弃CPU的,除非任务本身主动放弃。所以在系统调用后及时执行sechedule进行系统调度。
不知道理解是否正确?
在ret_from_sys_call中:
ret_from_sys_call:
movl _current,%eax
cmpl _task,%eax # task[0] cannot have signals
je 3f
cmpw $0x0f,CS(%esp) # was old code segment supervisor ?
jne 3f
cmpw $0x17,OLDSS(%esp) # was stack segment = 0x17 ?
jne 3f
movl signal(%eax),%ebx
movl blocked(%eax),%ecx
notl %ecx
andl %ebx,%ecx
bsfl %ecx,%ecx
je 3f
btrl %ecx,%ebx
movl %ebx,signal(%eax)
incl %ecx
pushl %ecx
call _do_signal
popl %ecx
testl %eax, %eax
jne 2b # see if we need to switch tasks, or do more signals
3: popl %eax
popl %ebx
popl %ecx
popl %edx
addl $4, %esp # skip orig_eax
pop %fs
pop %es
pop %ds
iret
问题2:
前几行的意义也好理解,但是有疑问的是为什么task[0]不能接受信号。
任务0是闲置任务,它不能被杀死或睡眠,但是这和接受信号有什么关系?
问题3:
另外是这段程序是从系统调用C函数返回后对信号进行的识别处理,其他中断服务程序退出时也会跳转到这里执行,那么这样做的作用,或者说必要行是什么,为什么中断返回后都要对信号进行处理?

|
所发生地方

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 看linux0.12内核遇到个很奇怪的赋值,求教用意.
  • Linux0.11 内核源码 main函数的参数问题
  • 编译linux0.01内核时出错,没有权限?
  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • linux0.11内核线性地址问题,请教!!
  • Linux0.11进程最大可用虚拟内存为64M?
  • linux0.11内核blk.h
  • linux0.11的bios中断
  • 读linux0.11源代码小问题:)
  • linux0.11内核有些函数是封装的吗?比如timer_interrupt()函数。
  • 今天读完了LINUX0.11~~ 累坏了~ 现在直接开始读2.6内核会很困难么?
  • LINUX0.11实验,研究了3天3夜,google,baidu无数遍,死活挂载不上软盘,怎么办?
  • linux0.11内核源代码中system模块问题
  • !!!散分帖:历尽千辛万苦,将LINUX0.11内核编译运行成功!!!
  • 探讨linux0.11内核
  • 求助 linux0.01 boot.s
  • 简单!!高分!!Linux0.01中的简单问题—关于switch_to(n)。
  • 用source insigt 看Linux0.11内核完全注释中的内核源码时,发现了一个有关c语言语法的奇怪现象。大虾请进,帮小弟解解惑。有重谢!
  • LINUX0.11如何编译成
  • linux环境下修改linux0.11 bootsect.s并用qemu运行的问题
  • linux0.11内核添加了一个新的系统调用,返回-1


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3