017-12-6 16:27:35
时钟中断TIMER_BH(bottom_half)实现分析
1.3.100
1. 时钟0号中断安装
    setup_x86_irq(0, &irq0);@arch/i386/kernel/time.c
        |- set_intr_gate(0x20+irq,interrupt[irq]);//interrupt[0]=IRQ0_interrupt
        
        附:IRQ0_interrupt宏函数定义:BUILD_TIMER_IRQ(FIRST,0,0x01)

#define BUILD_TIMER_IRQ(chip,nr,mask) \
asmlinkage void IRQ_NAME(nr); \
asmlinkage void FAST_IRQ_NAME(nr); \
asmlinkage void BAD_IRQ_NAME(nr); \
__asm__( \
"\n"__ALIGN_STR"\n" \
SYMBOL_NAME_STR(fast_IRQ) #nr "_interrupt:\n\t" \
SYMBOL_NAME_STR(bad_IRQ) #nr "_interrupt:\n\t" \
SYMBOL_NAME_STR(IRQ) #nr "_interrupt:\n\t" \
    "pushl $-"#nr"-2\n\t" \
    SAVE_ALL \
    ACK_##chip(mask) \
    "incl "SYMBOL_NAME_STR(intr_count)"\n\t"\
    "movl %esp,%ebx\n\t" \
    "pushl %ebx\n\t" \
    "pushl $" #nr "\n\t" \
    "call "SYMBOL_NAME_STR(do_IRQ)"\n\t" \
    "addl $8,%esp\n\t" \
    "cli\n\t" \
    UNBLK_##chip(mask) \
    "decl "SYMBOL_NAME_STR(intr_count)"\n\t" \
    "jmp ret_from_sys_call\n");
        
       
2. 时钟中断调用
    IRQ0_interrupt->do_IRQ->timer_interrupt->do_timer
     ->ret_from_sys_call->handle_bottom_half->do_bottom_half@kernel/softirq.c
    
    
另1:do_bottom_half会开启中断
asmlinkage void do_bottom_half(void)
{
    unsigned long active;
    unsigned long mask, left;
    void (**bh)(void);

sti();
    bh = bh_base;
    active = bh_active & bh_mask;
    for (mask = 1, left = ~0 ; left & active ; bh++,mask += mask,left += left) {
        if (mask & active) {
            void (*fn)(void);
            bh_active &= ~mask;
            fn = *bh;
            if (!fn)
                goto bad_bh;
            fn();
        }
    }
    return;
bad_bh:
    printk ("irq.c:bad bottom half entry %08lx\n", mask);
}

另2:ret_from_sys_call段如下:
handle_bottom_half:
    incl SYMBOL_NAME(intr_count)
    call SYMBOL_NAME(do_bottom_half)
    decl SYMBOL_NAME(intr_count)
    jmp 9f
    
...
     ret_from_sys_call:
    cmpl $0,SYMBOL_NAME(intr_count)
    jne 2f
9:    movl SYMBOL_NAME(bh_mask),%eax
    andl SYMBOL_NAME(bh_active),%eax
    jne handle_bottom_half
    movl EFLAGS(%esp),%eax        # check VM86 flag: CS/SS are
    testl $(VM_MASK),%eax        # different then
    jne 1f
    cmpw $(KERNEL_CS),CS(%esp)    # was old code segment supervisor ?
    je 2f
1:    sti
    orl $(IF_MASK),%eax        # these just try to make sure
    andl $~NT_MASK,%eax        # the program doesn't do anything
    movl %eax,EFLAGS(%esp)        # stupid
    cmpl $0,SYMBOL_NAME(need_resched)
    jne reschedule
#ifdef __SMP__
    GET_PROCESSOR_OFFSET(%eax)
    movl SYMBOL_NAME(current_set)(,%eax), %eax
#else
    movl SYMBOL_NAME(current_set),%eax
#endif
    cmpl SYMBOL_NAME(task),%eax    # task[0] cannot have signals
    je 2f
    movl blocked(%eax),%ecx
    movl %ecx,%ebx            # save blocked in %ebx for signal handling
    notl %ecx
    andl signal(%eax),%ecx
    jne signal_return
2:    RESTORE_ALL

时钟中断TIMER_BH(bottom_half)实现分析的更多相关文章

  1. KVM VCPU线程调度问题的讨论

    2017-11-15 今天闲着没有突然想了想VCPU线程调度的问题,具体描述如下: 当代表VCPU的线程获得控制权后,首先会通过KVM接口进入到内核,从内核进入到非根模式,那么此时站在全局调度器的点上 ...

  2. Linux内核源代码情景分析-中断半

    一.中断初始化 1.中断向量表IDT初始化 void __init init_IRQ(void) { int i; #ifndef CONFIG_X86_VISWS_APIC init_ISA_irq ...

  3. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  4. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  5. Linux之时钟中断

    from:深入分析Linux内核源码(http://oss.org.cn/kernel-book/) 时钟中断的产生 Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入 ...

  6. Linux0.11内核--进程调度分析之2.调度

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数, ...

  7. Linux0.11内核--进程调度分析之1.初始化

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596746.html ] 首先看main.c里的初始化函数main函数里面有个函数是对进程调度 ...

  8. 基于Xenomai的实时Linux分析与研究

    转自:http://blog.csdn.net/cyberlabs/article/details/6967192 引 言 随着嵌入式设备的快速发展,嵌入式设备的功能和灵活性要求越来越高,很多嵌入式设 ...

  9. 《Linux内核分析》第八周 进程的切换和系统的一般执行过程

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK EIGHT ...

随机推荐

  1. dijkstra最短路

    感觉自己太懒了,以后每天更博客激励自己吧. //时间复杂度O(n*n)的最短路算法 //首先需要设置一个访问数组v[maxn],一个数组d[maxn], memset(v,,sizeof(v)); ; ...

  2. SCU 4437 Carries(二分乱搞)题解

    题意:问任意两对ai,aj相加的总进位数为多少.比如5,6,95分为(5,6)(5,95)(6,95),进位数 = 1 + 2 + 2 = 5 思路:显然暴力是会超时的.我们可以知道总进位数等于每一位 ...

  3. Markdown语法参考

    参考博客: https://www.jianshu.com/p/f3147a804368 https://www.jianshu.com/p/191d1e21f7ed https://www.jian ...

  4. 题解——洛谷P1250 种树(差分约束)

    一道看一眼就知道差分约束的题目 但是最短路spfa的时候注意松弛条件是 if(dis[u]+w[i]<dis[v[i]]) dis[v[i]]=dis[u]+w[i]; 不能写成 if(dis[ ...

  5. 论文笔记:A Review on Deep Learning Techniques Applied to Semantic Segmentation

    A Review on Deep Learning Techniques Applied to Semantic Segmentation 2018-02-22  10:38:12   1. Intr ...

  6. 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning

    论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning  2017-06-06  21: ...

  7. BZOJ 2648 SJY摆棋子(KD Tree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...

  8. Java 字符串常用操作(String类)

    字符串查找 String提供了两种查找字符串的方法,即indexOf与lastIndexOf方法. 1.indexOf(String s) 该方法用于返回参数字符串s在指定字符串中首次出现的索引位置, ...

  9. 基因组与Python --PyVCF 好用的vcf文件处理器

    vcf文件的全称是variant call file,即突变识别文件,它是基因组工作流程中产生的一种文件,保存的是基因组上的突变信息.通过对vcf文件进行分析,可以得到个体的变异信息.嗯,总之,这是很 ...

  10. P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...