zoukankan      html  css  js  c++  java
  • Linux 内核分析第八周学习笔记

    Linux 内核分析第八周学习笔记

    zl + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    进程调度的时机

    直接调用:中断处理过程(包括时钟中断,I/O中断,系统调用和异常)

    返回用户态时调用:根据need_resched标记调用

    内核线程可以主动调用也可以被动调用

    用户态线程仅能在陷入内核态后,即在中断处理过程中调度

    进程上下文

    用户地址空间:代码,数据,堆栈等

    控制信息:进程描述符,内核堆栈

    硬件上下文

    pick_next_task(rq,prev);进程调度算法封装

    context_switch(rq,prec,next);进程上下文切换

    switch_to中prev指向当前进程,next指向被调度进程

    42	asm volatile("pushfl
    	"		/* 保存    flags */	
    43		     "pushl %%ebp
    	"		/* 保存    EBP   */	
    44		     "movl %%esp,%[prev_sp]
    	"	/* 保存    ESP   */ 
    45		     "movl %[next_sp],%%esp
    	"	/* 恢复 ESP   */ 
    46		     "movl $1f,%[prev_ip]
    	"	/* 保存    EIP   */	
    47		     "pushl %[next_ip]
    	"	/* 恢复 EIP   */	
    48		     __switch_canary					
    49		     "jmp __switch_to
    "	/* 寄存器参数 调用  */	
    50		     "1:	"						
    51		     "popl %%ebp
    	"		/* 保存 EBP   */	
    52		     "popfl
    "			/* 恢复 flags */	
    53									
    54		     /* 输出参数 */				
    55		     : [prev_sp] "=m" (prev->thread.sp),		
    56		       [prev_ip] "=m" (prev->thread.ip),		
    57		       "=a" (last),					
    58									
    59		       /* 被破坏的输出寄存器 */		
    60		       "=b" (ebx), "=c" (ecx), "=d" (edx),		
    61		       "=S" (esi), "=D" (edi)				
    62		       							
    63		       __switch_canary_oparam				
    64									
    65		       /* 输入参数: */				
    66		     : [next_sp]  "m" (next->thread.sp),		
    67		       [next_ip]  "m" (next->thread.ip),		
    68		       							
    69		       /*  __switch_to()的寄存器参数 */	
    70		       [prev]     "a" (prev),				
    71		       [next]     "d" (next)				
    72									
    73		       __switch_canary_iparam				
    74									
    75		     : /* 重装段寄存器 */			
    76			"memory");					
    77} while (0)
    

    实验使用gdb跟踪分析一个schedule()函数




    总结:

    个人认为,Linux系统最一般执行过程中,用户态进程总要依次中断,保存现

  • 相关阅读:
    5.2 i++
    5.1 赋值语句
    Implement Queue using Stacks
    Binary Tree Paths
    Single Number III
    Ugly Number
    SurfaceHolder.Callback
    intellj(idea) 编译项目时在warnings 页签框里 报 “xxx包不存在” 或 “找不到符号” 或 “未结束的字符串字面值” 或 “需要)” 或 “需要;”等错误提示
    Hibernate添加日志--log4j
    java实现网页验证码
  • 原文地址:https://www.cnblogs.com/20135319zl/p/5398875.html
Copyright © 2011-2022 走看看