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. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(3)

    4. 主从表关系 名称 类型 说明 MasterSource 从表对应于主表的DataSource组件 DetailFields 从表中对应于主表字段的外键字段 MasterFields 主表中关联从 ...

  2. CSV是什么文件格式【转】

    本文转载自:https://blog.csdn.net/huyanping/article/details/6384687 CSV即Comma Separate Values,这种文件格式经常用来作为 ...

  3. L2-001:dijskstra + 多条最短路径 + 记录中间路径

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 思路: dijkstra算出最短路 ...

  4. POJ 1486 Sorting Slides(二分图完全匹配必须边)题解

    题意:给你n张照片的范围,n个点的坐标,问你能唯一确定那几个点属于那几张照片,例如样例中4唯一属于A,2唯一属于C,1唯一属于B,3唯一属于C 思路:进行二分图完全匹配,怎么判断唯一属于?匹配完之后删 ...

  5. 【MVC】Spring MVC常用配置

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  6. Centos 7 官网下载安装mysql server 5.6

    Centos 7 官网下载安装 mysql server # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rp ...

  7. 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场

    第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...

  8. 深度学习课程笔记(四)Gradient Descent 梯度下降算法

    深度学习课程笔记(四)Gradient Descent 梯度下降算法 2017.10.06 材料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS1 ...

  9. Latex 左右引号

    参考: LaTeX技巧218:LaTeX如何正确输入引号:双引号""单引号'' Latex 左右引号 在latex中加引号时,使用""的输出为两个同向的引号: ...

  10. 5、iptables之nat

    iptables: 显式扩展.网络防火墙 显式扩展:multiport, iprange, string, time, connlimit, limit, state state:无关是哪种协议 /p ...