linux kernel学习(2) - 中断

1. 顺着教程书往下看,看到了系统调用,过程不复杂:

       用户函数 =>  libc库 => 触发 0x80 软中断

                            (到了内核了)     => 由system_call()执行中断处理 =>  (根据调用号,到具体处理函数) sys_call_table(eax, 4);    说明参数和调用号是通过寄存器下来的。

       这个system_call与体系结构有关,PC上定义在 arch/x86/kernel/entry_32.s.

       增加一个调用的方法:  在sys_call_table中加入函数声明, 并在unistd_32.h添加宏; sys_call_table的出处我没找到,已经不用显示声明了?


2.  中断:

     关于中断的概念,有介绍的够多了。

     基本过程:

     1. 驱动注册irq到自己的硬件上,用request_irq(int irq,  handler, flags,  name, dev );

         flags可以设定共享,IRQF_SHARED,这样大家能一起注册上了; dev表明device,主要用于share中断线的各驱动区分device;

     2. 当硬件发生中断时,cpu走到对应驱动的中断

     3. 这时处在中断上下文,上半部处理紧急任务,然后出上下文

     4. 继续执行下半部.

     用/proc/interrupts能看当前中断的记录;

    关于上下文:

             用in_interrupt()能判断是否在中断上下文,与之对立就是进程上下文;中断上下文的current指向被中断的进程,但是本身并没有后备进程,所以不能schedule调度;

             上下文不会被同级中断重入,因为当前中断线被禁止了;但是可能被其它中断线中断;


3.  下半部:

      用来处理不那么紧急的,与硬件无关的代码;

      一般分两种:软中断和tasklet;

     a. 软中断:

                 软中断在单cpu安全,不会被重入。因为它显示的调用了local_bh_disable。 但是SMP还是会同时运行一段softirq代码,要注意保护.

                执行时机:硬件中断返回 + ksoftirqd线程 + 显示调用;都会执行do_softirq。

                如何注册:open_softirq(id, handler),其实就是写全局数组。然后raise_softirq(id),就能确保下一次do_softirq能进来执行。

    b. tasklet:

              与软中断类似。不过可以动态注册。




               

 










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值