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. 5.sql2008分组与嵌套

    1.Group by基本介绍;2.Having的使用;3.分组综合应用;4.子查询基本介绍;5.In/Exists/Any/Some/All;6.子查询综合应用; 1.Group by基本介绍:依据B ...

  2. C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

    用管理员身份运行CMD,输入netsh winsock reset并回车(注意,必须是已管理员身份运行,这个重置LSP连接)运行后提示要重启生效,结果没重启就OK了(重启不重启看最终效果).

  3. Python常用库之Pilow

    基本用法 静态方法 PIL.Image.open(fp, mode=’r’) 传入文件路径(str),返回一个image对象 PIL.Image.alpha_composite(im1, im2) 混 ...

  4. C语言 字符串大小写转换 自定义函数

    #include <stdio.h>#include <stdlib.h>#include <string.h> char * strtolower(char * ...

  5. HDU 1465 不容易系列之一

    扯淡 貌似有傻逼的做法XD 话说我没开long long,忘读入n,忘了清零ans WA了三遍是什么操作啊 傻了傻了 思路 显然是一个错排问题啊XD 但是我们不套公式,我们用一发二项式反演 二项式反演 ...

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

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

  7. Shiro学习笔记四(Shiro集成WEB)

    这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...

  8. skype for business 无法共享桌面、无法传输图片

    以管理员身份运行如下PowerShell命令,清除Skype for Business缓存记录 #以管理员身份运行如下PowerShell命令,清除Skype for Business缓存记录 Sto ...

  9. 动态LINQ(Lambda表达式)

    1.准备数据实体 public class Data { public string AccountNO { get; set; } public int Count { get; set; } } ...

  10. Windows下Oracle创建数据库的3种方式

    1.   Creating a Database with DBCA DatabaseConfiguration Assistant (DBCA) is the preferred way to cr ...