时钟中断TIMER_BH(bottom_half)实现分析
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)实现分析的更多相关文章
- KVM VCPU线程调度问题的讨论
		2017-11-15 今天闲着没有突然想了想VCPU线程调度的问题,具体描述如下: 当代表VCPU的线程获得控制权后,首先会通过KVM接口进入到内核,从内核进入到非根模式,那么此时站在全局调度器的点上 ... 
- Linux内核源代码情景分析-中断半
		一.中断初始化 1.中断向量表IDT初始化 void __init init_IRQ(void) { int i; #ifndef CONFIG_X86_VISWS_APIC init_ISA_irq ... 
- 【内核】linux内核启动流程详细分析
		Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ... 
- 【内核】linux内核启动流程详细分析【转】
		转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ... 
- Linux之时钟中断
		from:深入分析Linux内核源码(http://oss.org.cn/kernel-book/) 时钟中断的产生 Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入 ... 
- Linux0.11内核--进程调度分析之2.调度
		[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数, ... 
- Linux0.11内核--进程调度分析之1.初始化
		[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596746.html ] 首先看main.c里的初始化函数main函数里面有个函数是对进程调度 ... 
- 基于Xenomai的实时Linux分析与研究
		转自:http://blog.csdn.net/cyberlabs/article/details/6967192 引 言 随着嵌入式设备的快速发展,嵌入式设备的功能和灵活性要求越来越高,很多嵌入式设 ... 
- 《Linux内核分析》第八周 进程的切换和系统的一般执行过程
		[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK EIGHT ... 
随机推荐
- ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(3)
			4. 主从表关系 名称 类型 说明 MasterSource 从表对应于主表的DataSource组件 DetailFields 从表中对应于主表字段的外键字段 MasterFields 主表中关联从 ... 
- CSV是什么文件格式【转】
			本文转载自:https://blog.csdn.net/huyanping/article/details/6384687 CSV即Comma Separate Values,这种文件格式经常用来作为 ... 
- L2-001:dijskstra + 多条最短路径 + 记录中间路径
			题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 思路: dijkstra算出最短路 ... 
- POJ 1486 Sorting Slides(二分图完全匹配必须边)题解
			题意:给你n张照片的范围,n个点的坐标,问你能唯一确定那几个点属于那几张照片,例如样例中4唯一属于A,2唯一属于C,1唯一属于B,3唯一属于C 思路:进行二分图完全匹配,怎么判断唯一属于?匹配完之后删 ... 
- 【MVC】Spring MVC常用配置
			一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ... 
- Centos 7 官网下载安装mysql server 5.6
			Centos 7 官网下载安装 mysql server # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rp ... 
- 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场
			第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ... 
- 深度学习课程笔记(四)Gradient Descent 梯度下降算法
			深度学习课程笔记(四)Gradient Descent 梯度下降算法 2017.10.06 材料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS1 ... 
- Latex 左右引号
			参考: LaTeX技巧218:LaTeX如何正确输入引号:双引号""单引号'' Latex 左右引号 在latex中加引号时,使用""的输出为两个同向的引号: ... 
- 5、iptables之nat
			iptables: 显式扩展.网络防火墙 显式扩展:multiport, iprange, string, time, connlimit, limit, state state:无关是哪种协议 /p ... 
