您的位置:68399皇家赌场 > 域名注册 > 详细深入分析Linux进度调解时机

详细深入分析Linux进度调解时机

发布时间:2019-05-10 09:22编辑:域名注册浏览(119)

    在Linux的0号中断是2个机械漏刻中断。在稳住的日子间隔都爆发三次暂停,也是说每秒爆发该中断的频率皆以永远的。该频率是常量HZ,该值一般是在十0 ~ 一千之内。该中断的功力是为着定时更新系统日期和时间,使系统时间持续地获得跳转。此外该中断的中断管理函数除了立异系统时间外,还供给创新本地CPU总括数。指的是调用scheduler_tick递减进度的岁月片,若进度的时间片递减到0,进度则被调解出去而吐弃CPU使用权。

    转自:

    Linux在重重进度中是怎么实行调解的,这些牵涉到Linux进度调整时机的概念,由Linux内核中Schedule)的函数来支配是不是要开始展览进程的切换,假如要切换的话,切换来哪些进程等等。

    转:

    石英钟中断的发出

    Linux的OS石英钟的大要发生原因是可编制程序定期/计数器产生的输出脉冲,那么些脉冲送入CPU,就足以引发一在那之中断请求复信号,大家就把它称作石英钟中断。

    “时钟中断”是特地主要性的贰在这之中断,因为任何操作系统的运动都非常受它的激励。系统运用机械钟中断维持系统时间、促使情状的切换,以确定保障全部进度共享CPU;利用石英钟中断进行记帐、监督系统工作以及鲜明未来的调治优先级等专业。能够说,“石英钟中断”是1切操作系统的脉搏。

    石英石英手表中断的情理爆发如图所示:

    68399皇家赌场 1

    操作系统对可编程定时/计数器实行有关开始化,然后定时/计数器就对输入脉冲进行计数(分频),爆发的四个出口脉冲Out0、Out1、Out2各有用途,诸多接口书都介绍了那个标题,大家只看Out0上的输出脉冲,这些脉冲实信号接收中断调整器8259A_壹的0号管脚,触发3个周期性的中止,大家就把这在那之中断叫做石英钟中断,时钟中断的周期,也正是脉冲非连续信号的周期,大家称为“滴答”或“时标”(tick)。从精神上说,时钟中断只是叁个周期性的时域信号,完全都以硬件行为,该功率信号触发CPU去实践2个暂停服务程序,但是为了有利于,大家就把那些服务程序叫做挂钟中断。

    原稿地址 

    Linux进度调解时机首要有

     

    Linux完结机械钟中断的全经过

    办法之三:以数据结构为器重,触类旁通

    一、进度情形转变的随时:进度终止、进度睡眠;

    linux UART串口驱动开荒文书档案时间:20拾-0一-09 14:二四:55出自:网络 小编:未知 点击:40九次

    一.可编制程序定期/计数器的开头化

    IBM PC中应用的是825三或825四芯片。有关该芯片的详实知识大家不再详述,只大意介绍以下它的组合和成效,如下表5.一所示:

    表 8253/825四的咬合及意义

    名称

    端口地址

    工作方式

    产生的输出脉冲的用途

    计数器0

    0x40

    方式3

    时钟中断,也叫系统时钟

    计数器1

    0x41

    方式2

    动态存储器刷新

    计数器2

    0x42

    方式3

    扬声器发声

    控制寄存器

    0x43

    /

    用于8253的初始化,接收控制字

    计数器0的输出正是图中的Out0,它的效能由操作系统的设计者明确,Linux对八二53的开首化程序段如下(在/arch/i386/kernel/i825玖.c的init_IRQ()函数中):

    set_intr_gate(ox20, interrupt[0]); 
    
    /*在IDT的第0x20个表项中插入一个中断门。这个门中的段选择符设置成内核代码段的选择符,偏移域设置成0号中断处理程序的入口地址。*/ 
    
    outb_p(0x34,0x43);  /* 写计数器0的控制字:工作方式2*/ 
    
    outb_p(LATCH & 0xff , 0x40); /* 写计数初值LSB 计数初值低位字节*/ 
    
    outb(LATCH >> 8 , 0x40); /* 写计数初值MSB 计数初值高位字节*/ 
    
    LATCH(英文意思为:锁存器,即其中锁存了计数器0的初值)为计数器0的计数初值,在/include/linux/timex.h中定义如下: 
    
    #define CLOCK_TICK_RATE 1193180 /* 图5.3中的输入脉冲 */ 
    
    #define LATCH ((CLOCK_TICK_RATE   HZ/2) / HZ) /* 计数器0的计数初值 */ 
    

    CLOCK_TICK_RATE是漫天825三的输入脉冲,如图5.三中所示为一.193280MHz,是看似为1MHz的方波复信号,捌2伍3内部的五个计数器都对那几个石英钟进行计数,进而产生不一样的出口时限信号,用于不一致的用处。

    HZ代表计数器0的频率,相当于机械钟中断或系统石英钟的效能,在/include/asm/param.h中定义如下:

    #define HZ 100

      结构化程序设计思想以为:程序 =数据结构 +算法。数据结构体现了壹切类别的构架,所以数据结构常常都以代码剖判的很好的开端点,对Linux基本深入分析进而如此。比方,把进度序调节制块结构深入分析领悟了,就对经过有了主导的握住;再比如,把页目录结商谈页表结构弄懂了,两级虚存映射和内部存款和储蓄器管理也就精通得大约了。为了彰显鲁人持竿的钻探,在这小编就以 Linux对搁浅机制的管理来介绍这种方法。

    二、当前历程的光阴片用完时current->counter=0);

    内容简要介绍: 介绍了Linux下的串口驱动的安顿档案的次序及接口, 并提出串口与TTY终端之间的关系档期的顺序(串口可作TTY终端应用), 以及Linux下的中止管理机制/中断共享机制, 还有串口缓冲机制个中提到的软中断机制; 其中有关w83697/
    内 容简单介绍: 介绍了Linux下的串口驱动的设计档期的顺序及接口, 并提议串口与TTY终端之间的关系等级次序(串口可作TTY终端应用), 以及Linux下的间歇管理机制/中断共享机制, 还有串口缓冲机制个中提到的软中断机制; 当中有关w83697/w83977IC方面包车型大巴学问, 具体参考相关手册, 对串口的布置寄存器有详细介绍, 本文不再进行说明.
    目录索引:
    一. Linux的串口接口及档期的顺序.
    二. Linux的暂停机制及抛锚共享机制.
    3. Linux的软中断机制.
    四. TTY与串口的切实可行关联.

    贰.与石英钟中断相关的函数

    上面大家看挂钟中断触发的服务程序,该程序代码比较复杂,布满在不一致的源文件中,重要包罗如下函数:

    电子表中断程序:timer_interrupt( );

    暂停服务通用例程do_timer_interrupt();

    手表函数:do_timer( );

    暂停安装程序:setup_irq( );

    停顿重返函数:ret_from_intr( );

    (1) timer_interrupt( )

    其一函数大致每10ms被调用一遍,实际上, timer_interrupt( )函数是三个打包例程,它真的做的事体并不多,可是,作为三个制动踏板程序,它必须在关中断的景况下施行。假若只思虑单管理机的情景,该函数根本语句正是调用do_timer_interrupt()函数。

    (2) do_timer_interrupt()

    do_timer_interrupt()函数有几个紧要职分,叁个是调用do_timer( ),另1个是保证实时石英钟(RTC,每隔一定期期段要回写),其完成代码在/arch/i386/kernel/time.c中, 为了杰出主旨,作者对以下函数作了改写,以便于读者知道:

    static inline void do_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) 
    { 
     do_timer(regs); /* 调用时钟函数,将时钟函数等同于时钟中断未尝不可*/ 
     if(xtime.tv_sec > last_rtc_update   660) 
     update_RTC(); 
     /*每隔11分钟就更新RTC中的时间信息,以使OS时钟和RTC时钟保持同步,11分钟即660秒,xtime.tv_sec的单位是秒,last_rtc_update记录的是上次RTC更新时的值 */             
    } 
    

    中间,xtime是眼下所关联的timeval类型,这是一个全局变量。

    (三) 石英钟函数do_timer() (在/kernel/sched.c中)

    void do_timer(struct pt_regs * regs) 
    { 
     (*(unsigned long *)&jiffies)  ; /*更新系统时间,这种写法保证对jiffies 
    
    操作的原子性*/ 
     update_process_times(); 
       lost_ticks; 
     if( ! user_mode ( regs ) ) 
        lost_ticks_system; 
      mark_bh(TIMER_BH);    
     if (tq_timer)      
      mark_bh(TQUEUE_BH); 
    } 
    

    其中,update_process_times()函数与经过调节有关,从函数的名子能够看到,它管理的是与日前进度与时间关于的变量,比如,要更新当前历程的光阴片计数器counter,假诺counter<=0,则要调用调整程序,要拍卖进程的有所电磁关照计时器:实时、虚拟、概况,别的还要做一些总括专业。

    与时间关于的工作大多,不能够全都让这么些函数去做到,那是因为那一个函数是在关中断的情形下进行,必须管理完最重大的时光消息后脱离,以拍卖其余职业。那么,与时光相关的别样音信哪个人去管理,几时管理?这正是由第2章商讨的后半有些去去管理。 上面timer_interrupt()(包蕴它所调用的函数)所做的事体便是上半有的。

    在该函数中还有八个变量lost_ticks和lost_ticks_system,那是用来记录timer_bh()执行前石英钟中断爆发的次数。因为机械钟中断爆发的效能极高(每拾ms一次),所以在timer_bh()执行此前,也许曾经有石英钟中断发生了,而timer_bh()要提供按期、记费等首要操作,所感到了保障时间计算的正确性,使用了那多少个变量。lost_ticks用来记录timer_bh()实行前石英钟中断发生的次数,假若时钟中断发生时当前进度运营于内核态,则lost_ticks_system用来记录timer_bh()推行前在内核态发生时钟中断的次数,那样能够对脚下历程正确记费。

    68399皇家赌场 2

    (四)中断安装程序

    从地点的牵线能够观察,石英钟中断与经过调节密不可分,由此,1旦开头有机械钟中断就可能要开始展览调解,在系统开始展览初步化时,所做的雅量行事之一正是对石英钟实行初阶化,其函数time_init ()的代码在/arch/i386/kernel/time.c中,对其简写如下:

     void __init time_init(void) 
     { 
    xtime.tv_sec=get_cmos_time(); 
    xtime.tv_usec=0; 
    setup_irq(0,&irq0); 
    } 
    

    其中的get_cmos_time()函数就是把立即的骨子里时间从CMOS石英钟芯片读入变量xtime中,时间精度为秒。而setup_irq(0,&irq0)正是时钟中断安装函数,那么irq0指的是怎么吧,它是3个协会类型irqaction,其定义及初值如下:

    static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL};

    setup_irq(0, &irq0)的代码在/arch/i386/kernel/irq.c中,其主要性成效正是将中断程序连入相应的中断请求队列,以等待中断到来时相应的间歇程序被推行。

    struct irqaction { 
      irq_handler_t handler;  //中断处理函数,注册时提供  
      unsigned long flags;   //中断标志,注册时提供  
      cpumask_t mask;    //中断掩码  
      const char *name;   //中断名称 
      void *dev_id;      //设备id,本文后面部分介绍中断共享时会详细说明这个参数的作用 
      struct irqaction *next;  //如果有中断共享,则继续执行,  
      int irq;        //中断号,注册时提供 
      struct proc_dir_entry *dir; //指向IRQn相关的/proc/irq/n目录的描述符 
    }; 
    

    以此结构体包括了拍卖一种中断所需求的种种消息,它意味着了水源接受到特定IENVISIONQ之后应该使用的操作。

    1.handler:该指针所针对的函数正是在脚刹踏板服务程序,当制动踏板发生时内核便会调用那些指针指向的函数。

    二.flags:该标识位能够是0,也能够是:

    SA_INTE奥迪Q5RUPT:表示当中断管理程序是叁个飞跃中断管理程序,在贰.六中默许情形下未有这么些标记;设置该标记位,中断处理程序禁止别的中断运转,未有该标识,仅屏蔽正在运维的I翼虎Q线;

    SA_SAMPLE_RANDOM:表示这些中断对内核池有进献,在行车制动器踏板时发出一些率性数;

    SA_SHIOdysseyQ:此标识位表示同意两在那之中断服务程序共享几当中断号,如不设则1个顺序对应一个中断线;

    三.mask:在x捌陆上不会用到。

    四.name:发生中断的硬件的名字.

    5.dev_id:该标记位首要在共享中断号时使用,即你设置flags=SA_SHI瑞虎Q时,有5当中断服务程序共享三个打退堂鼓号时,内核就须要知道在用完全中学断程序后该删除那么些中断服务程序。不共享时此成员为null。

    6.next:如果flags=SA_SHIRAV四Q,那么那正是指向对列中下1个struct irqaction结构体的指针,不然为空。

    柒.irq:不用说那就是暂停号了。

    到后天实现,我们只有是把石英钟中断程序挂入中断请求队列,几时推行,怎么着试行,那是三个目不暇接的长河(参见第三章),为了让读者对石英钟中断有1个完好无损的认识,大家忽视中间进度,而付出四个总体描述。大家将有关函数改写如下,显示石英钟中断的忽视:

    do_timer_interrupt( )   /*这是一个伪函数 */ 
    {            
     SAVE_ALL     /*保存处理机现场 */ 
     intr_count  = 1;    /* 这段操作不允许被中断 */ 
     timer_interrupt()    /* 调用时钟中断程序 */ 
     intr_count -= 1;    
     jmp ret_from_intr    /* 中断返回函数 */ 
    } 
    

    其中,jmp ret_from_intr 是1段汇编代码,也是3个相比较复杂的历程,它谈到底要调用jmp ret_from_sys_call,即系统调用重回函数,而以此函数与经过的调节又仔细相关,,由此,我们第1解析jmp ret_from_sys_call。

      首先,必须建议的是:在此处,中断指广义的暂停概义,它指装有通过idt实行的支配转移的机制和拍卖;它覆盖以下多少个常用的概义:中断、非常、可屏蔽中断、不可屏蔽中断、硬中断、软中断 … … …

    三、设备驱动程序

    一. Linux的串口接口及等级次序.
        串口是应用已经极度广的设备了, 由此在linux上面包车型地铁支撑已经很周到了, 具备合并的编程接口, 驱动开采者所要完整的行事便是针对性不一样的串口IC来做成功相应的配置宏, 那此配置宏包涵读与写, 中断展开与关闭(如传送与接收中断), 接收状态管理, 有FIFO时还要管理FIFO的状态. 如下我们就率先切入这一有的, 具体明白一下与硬件串口IC相关的有的在使得中的管理, 这一片段能够说是串口驱动中的最基础部分, 直接与硬件打交道, 达成最底部具体的串口数据传输.

    叁.连串调用再次回到函数:

    系统调用重回函数的源代码在/arch/i386/kernel/entry.S中

    ENTRY(ret_from_sys_call) 
       cli     # need_resched and signals atomic test 
       cmpl $0,need_resched(
    		

    本文由68399皇家赌场发布于域名注册,转载请注明出处:详细深入分析Linux进度调解时机

    关键词: 68399皇家赌场 【linux内核】

上一篇:Git命令汇总(基础篇),git命令汇总基础篇

下一篇:没有了