我想写一个简单的设备驱动, 但对驱动模块的可重入方面不甚了解. 有的书说驱动模块不会被中断, 除非主动地调用schedule()(或是隐式 地调用, 如vmalloc()); 有的书则说即使schedule()被调用, 它也不会 去作进程切换, 因为schedule()不对内核态进程切换. 不知谁对? 望高人指点一二. 谢谢 |
|
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : jkl Posted : 2000-11-29 11:55 Length : 327 byte(s) |
|
[Original ] [Print] [Top] |
|
可 以认为内核态的代码是一种协作式的多线程机制,只有当前线程主动的放弃执行才能引导到新的线程.或者说,当内核有代码不能立即返回到用户代码时,它必须运 行调度过程,将自身挂起,释放对CPU的控制权,当这段线程被唤醒后,代码又从调度过程中返回,它又重新获得CPU控制权,它完成用户指定操作后就可以立 即返回到用户代码中去了. |
|
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : pengchengzou Posted : 2000-11-29 17:40 Length : 178 byte(s) |
|
[Original ] [Print] [Top] |
|
非常感谢JKL的指点. 得寸进尺, 追加一个问题. 如果内核模块不主动放弃CPU, 时钟中断程序是否还会被调用. 是否可以认为在内核模块中中断是被屏蔽调的? |
|
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : difeijing Posted : 2000-11-29 18:47 Length : 83 byte(s) |
|
[Original ] [Print] [Top] |
|
普通情况下,时钟中断仍然会被调用,除非你 显式的关中断. |
|
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : jkl Posted : 2000-11-29 20:33 Length : 325 byte(s) |
|
[Original ] [Print] [Top] |
|
在 执行操作系统调用时,是不关CPU中断的,时钟中断永远按精确的节拍发生,不管当前CPU是在用户态还是核心态.硬件中断发生时,内核要屏蔽该中断源,当 中断返回时再打开这一号中断,因此同一中断是不会重入的.用户态的硬件中断返回之前要运行调度过程,核心态中断返回时则不运行调度过程,这就是内核过程为 什么不会被抢占的原因. |
|
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : pengchengzou Posted : 2000-11-30 09:17 Length : 863 byte(s) |
|
[Original ] [Print] [Top] |
|
谢谢两位的回答. 得尺进丈一下.
我的理解是, 时钟中断处理函数(do_timer())没有进行实质性的中断服务, * schedule() 我的问题是, 如果系统上运行了两个计算量很大的程序. 它们没有调用任何 我一直以为时钟中断处理函数会作调度工作, 但是看了书和源代码后, 发现 我觉得我是哪儿搞错了,很是迷惑. 请大家指点. 多谢. |
|
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : jkl Posted : 2000-11-30 11:08 Length : 3,927 byte(s) |
||
[Original ] [Print] [Top] |
||
看如下的代码应该就清楚了,ret_from_intr是所有硬件中断的返回点.arch/i386/kernel/entry.S: |
|
|
[Original ] [Print] [Top] |
Subject : 万分感谢jkl, 这下清楚了. Author : pengchengzou Posted : 2000-11-30 12:40 Length : 47 byte(s) |
|
[Original ] [Print] [Top] |
|
万分感谢jkl, 这下清楚了. | |
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : bravebird Posted : 2002-10-10 17:06 Length : 323 byte(s) |
|
[Original ] [Print] [Top] |
|
update_process_timers在2.4内核里面应该是在上半部中处理的. 我理解的顺序应该是这样: 时间中断产生->update_process_times(计算各个进程的时间片和优先级,决定是否需要重新调度need_sched ?=1) ->ret_from_intr->ret_with_reschedule->call schedule(如果需要的话); |
|
----
我是一只小小小鸟,想要飞却怎么也飞不高....
|
|
[Original ] [Print] [Top] |
Subject : Re: 设备驱动的可重入问题 Author : xunclapton Posted : 2002-10-10 18:24 Length : 152 byte(s) |
|
[Original ] [Print] [Top] |
|
进程不调用系统调用也就是一直运行在用户态,但时钟中断还是会发生,如果这个进程时间片到期,时钟中断会把他的need_schedule置1,这样在返回用户态前被schedule() |