关于g-bios的中断问题

发布于 2022-09-18 19:03:06 字数 2178 浏览 13 评论 0

我回家想了一下,中断问题可否如下处理

先建立一个数据结构

struct isr_call{
      int (*fun)(void*)          //中断返回处理函数
      void *data                  //中断返回处理函数所需的数据
      struct isr_call *next    //单链表
      int status                    //相关的一些状态信息(如网卡是收中断还是发中断等)
      int irq                         //中断号
    int id                          //用于区分相同的中断号其中断返回处理函数
                           //如有两个函数都同时产生相同的中断,则根据此id号进行区别,在回调时选择正确的中断返回处理函数
                           //可以是进程id或线程id
                                         //由于现在是单进程.可以不考虑,不过可以为以后扩展使用(不会永远是单进程吧-_-!)
}

struct isr_call irq_call[32] //对应于中断数组队列

如网卡收到数据,发生中断,从网卡中取出数据后,初始化struct isr_call(也可一开始就初始化好,像初始化irq一样,不过........^_^)

       isr_call->fun = netif_ix
       isr_call->data = sockbuff
       add_tail(isr_call)

      则中断返回后,在相应的地方根据中断号访问irq_call[irq],进行调用中断返回处理函数即可
    但不知如果中断返回处理函数中又包含中断会如何?如中断返回处理函数执行时间过长又该如何处理?

      顺便问一下内核代码问题
    在schedule()方法中,将task的状态设置为TASK_RUNNING,进程就会执行?(如果没记错的话)
      是否先将其链入运行队列,然后再执行?
      那又是如何链入的?又如何执行的?
      能否说明其详细过程?(以2.6.26或2.6.28内核为标准进行说明)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文