当从内核态返回到用户态的时候,要检查是否进行调度,而调度要看两个条件:
1.preempt_count是否为0
2.rescheduled是否置位
ret_from_exception:
 preempt_stop(CLBR_ANY)
ret_from_intr:
 GET_THREAD_INFO(%ebp)
check_userspace:
 movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS
 movb PT_CS(%esp), %al
 andl $(VM_MASK | SEGMENT_RPL_MASK), %eax
 cmpl $USER_RPL, %eax
 jb resume_kernel  # not returning to v8086 or userspace
ENTRY(resume_userspace)
 LOCKDEP_SYS_EXIT
  DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
     # setting need_resched or sigpending
     # between sampling and the iret
 movl TI_flags(%ebp), %ecx
 andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
     # int/exception return?
 jne work_pending
 jmp restore_all
END(ret_from_exception)
#ifdef CONFIG_PREEMPT
ENTRY(resume_kernel)
 DISABLE_INTERRUPTS(CLBR_ANY)
 cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
 jnz restore_nocheck
need_resched:
 movl TI_flags(%ebp), %ecx # need_resched set ?
 testb $_TIF_NEED_RESCHED, %cl
 jz restore_all
 testl $IF_MASK,PT_EFLAGS(%esp) # interrupts off (exception path) ?
 jz restore_all
 call preempt_schedule_irq
 jmp need_resched
END(resume_kernel)
#endif
 CFI_ENDPROC
检查preempt_count的时候,是统一检查是否为0,也就是说,有4个条件限制,可能不能够进行调度。
1.preempt_disable()
 
#define preempt_disable() \
do { \
 inc_preempt_count(); \
 barrier(); \
} while (0)
#define inc_preempt_count() add_preempt_count(1)
会在preempt_enable中释放
2.add_preempt_count(HARDIRQ_OFFSET)
是在irq_enter()中调用的,记录进入硬件中断处理的次数(计数),
会在irq_exit()中释放
3.__local_bh_disable((unsigned long)__builtin_return_address(0));
在do_softirq中调用的,
static inline void __local_bh_disable(unsigned long ip)
{
 add_preempt_count(SOFTIRQ_OFFSET);
 barrier();
}
4.总开关,第一位。

preempt_count详解相关推荐

  1. 详解Linux2.6内核中基于platform机制的驱动模型

    原文地址:详解Linux2.6内核中基于platform机制的驱动模型 作者:nacichan [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了P ...

  2. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  3. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  4. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  5. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  6. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  7. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  8. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  9. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

最新文章

  1. 简述使用混合传递参数时的基本原则_JUnit 5参数化方法测试(一)
  2. 记事本写python怎么运行-Python开发简单记事本
  3. html5杂记(1)
  4. 打造自己博客(wordpress)的wap手机版本
  5. 前端学习(1532):项目1---项目功能展示
  6. 你的Unity3d代码质量还可以提高200%
  7. 什么是python元祖_Python学习之元组
  8. spring+struts2+mybatis
  9. 编程猫fiddler插件
  10. ChIP-Atlas:基于公共chip_seq数据进行分析挖掘
  11. 机械秒表的使用方法_秒表的使用方法?
  12. mips指令简单入门
  13. Opencv drawContours函数用于绘制和填充
  14. Python使用pyecharts库画简单的中国地图
  15. 随笔记:利用Apache设置反向代理
  16. 成功解决 RecoveryYour PC/Device needs to be repairedThe Boot c onfiguration Data for your PC is missin
  17. excel怎么设置打印区域_在excel上怎么可以使打印时,将整个纸张占满?
  18. 基本数据类型 int操作 bool布尔操作 str字符串操作 for in 循环
  19. 小傻蛋的妹妹跟随小甲鱼学习Python的第二十节020
  20. oracle将excel导入,Win7系统把Excel数据导入oracle的方法(图文)

热门文章

  1. 图解 Elasticsearch 原理
  2. 结构型模式:代理模式
  3. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
  4. ubuntu19 安装git_如何在Ubuntu 20.04上安装Git
  5. dio 上传文件报错_Vue+Element UI实现断点续传、分片上传、秒传
  6. 腾讯天津数据中心余热回收应用初探
  7. 数据中心机房布线设计方案
  8. 无头虚拟化服务器,VBoxHeadless - 使用VirtualBox 4.0在无头Ubuntu 10.10服务器上运行虚拟机...
  9. python输入两个变量的值、输出大的_Python 变量和输入输出 关卡二
  10. 卡巴斯基授权许可文件_安全许可证的申请流程有哪些?