zoukankan      html  css  js  c++  java
  • ucos2.86的任务调度漏洞

      Ucos2.86版本有一个任务调度的漏洞,该漏洞在2.88之后的版本已经修改过来了,今天我们来看看这个漏洞, 漏洞在官方2.88的文档中如下

        这两个函数都是调度器函数,也就是说调度器有漏洞,但是看官方文档的说明,只有cortex-m3有这个bug,那我们就将2.88的代码和2.91的代码对比看看改变了哪些

    2.86中的代码是这样的:

    void  OS_Sched (void)

    {

    #if OS_CRITICAL_METHOD == 3                          

        OS_CPU_SR  cpu_sr = 0;

    #endif

        OS_ENTER_CRITICAL();

        if (OSIntNesting == 0) {                          

            if (OSLockNesting == 0) {                     

                OS_SchedNew();

                if (OSPrioHighRdy != OSPrioCur) {         

                    OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

    #if OS_TASK_PROFILE_EN > 0

                    OSTCBHighRdy->OSTCBCtxSwCtr++;        

    #endif

                    OSCtxSwCtr++;                          

                    OS_TASK_SW();                         

                }

            }

        }

        OS_EXIT_CRITICAL();

    }

        到了2.91中,代码变成了这样

    void  OS_Sched (void)

    {

    #if OS_CRITICAL_METHOD == 3u                          

    OS_CPU_SR  cpu_sr = 0u;

    #endif

     

    OS_ENTER_CRITICAL();

    if (OSIntNesting == 0u) {                         

        if (OSLockNesting == 0u) {                    

           OS_SchedNew();

           OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

           if (OSPrioHighRdy != OSPrioCur) {         

    #if OS_TASK_PROFILE_EN > 0u

               OSTCBHighRdy->OSTCBCtxSwCtr++;        

    #endif

               OSCtxSwCtr++;                        

               OS_TASK_SW();                        

           }

        }

    }

    OS_EXIT_CRITICAL();

    }

        通过比较我们发现,代码中仅仅做了一件事情,将

    OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

        放在了比较任务优先级的动作的前面,那这样的修改是为什么呢?官方的解释是之前的代码会造成高优先级任务无法切换,低优先级长期占有cpu,最后导致整个程序只有空闲任务还在运行.

    至于造成这个中断的具体原因,我个人觉得这和cortex-m3的晚到中断和咬尾中断特性有关系,但是具体关系也还没想明白,直觉….容我三思  

  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4324922.html
Copyright © 2011-2022 走看看