スキップしてメイン コンテンツに移動

投稿

注目

Linux设备驱动 (3)

唔,幸好以前有一点点开发OS的经历,所以现在的内容还能跟得上,以后么...如果看不懂的话就不会有下文了吧(笑) 内核的并发处理 设备驱动编程和应用程序编程的一个很大的不同就是并发处理。应用程序通常会独立的运行,从头到尾,不需要担心会不会有别的东西改变它的环境。内核代码不是在这样一个简单的世界中运行,在编写的时候必须抱着很多事情会同时发生的戒心。 在内核编程里有一些并发性的来源。Linux系统在多处理器平台上执行的时候,可能会有多个处理器同时要使用你的驱动。多数的设备能够中断处理器,中断处理程序异步的执行,可以在你的驱动尝试做其他事情的时候被调用,一些软件抽象(例如内核计时器,在第六章介绍)也会异步的执行。另外,Linux可以在对称多处理器上执行,结果你的驱动可能会同时执行在多个CPU上。 结果,Linux内核代码,包含驱动代码,必须是可重入的。他必须有能力同时运行在多个上下文环境中。必须要小心的设计数据结构以保证多线程处理可以独立的执行。并且代码必须小心的访问共享数据,防止把它搞坏。编写处理并发并避免竞争条件(由于某种特定的执行顺序而导致的预期外的行为)的代码,需要深思熟虑并且充满技巧。这本书里的没有个例子驱动在编写时都考虑了并发的情况,当我们用到这些技术的时候我们会做出解释。 驱动程序开发者的一个常见的错误是想当然的认为只要代码段不转入睡眠状态(或者“阻塞状态”),并发性就不是问题。的确,Linux的内核是非抢占式的。除了服务中断这个重要的例外,他不会将控制权从内核代码那里夺走。在过去,这种非抢占式的做法对于防止不想要的并发处理来说是足够了,然而在SMP系统上,并发处理并不需要抢占式才发生。 如果你写代码的时候假设不会有被抢占的情况,那么它在SMP系统下就不会正常工作。甚至即使你没有一个这样的系统,其他运行你代码的人也许会有。在将来内核也可能改变自己以抢占式的方式运行,那样的话,即使是单处理器的系统也需要时时考虑并发处理(这在某些内核的变体上已经成为现实)。所以,一个严谨的程序员应该总是像在SMP系统那样编程。

最新の投稿

Linux设备驱动 (2)

Linux设备驱动

KOMODO IDE 4.0 で日本語を使おう

Djvu viewer on Zaurus

郷愁

C++ and .NET

これから、頑張ります

The road to the future