在学习Linux驱动开发之前,有必要了解内核模块与应用程序之间的各种不同点。
首先,应用程序(一般的小应用)是从头到尾执行单个任务,而模块是将自己预先注册到内核中一便于为将来某个请求服务。当注册模块时,只是执行其初始化函数,为其后续运行做好准备工作后就立即结束。换句话说,模块的注册时告诉内核:“我在这里,并且我可以干这些工作,以后有这类工作可以找我做。”模块的退出函数是在模块被卸载之前执行的,它告诉内核:“我走了,以后有工作别找我干了。”另外,应用程序在退出时可以不去释放在其调用前申请的资源,而模块在退出时必须要确定其加载时所申请的一切资源,否则,在系统重启之前它所申请的资源将一直残留系统之中。
Linux内核的模块化开发给开发者带来了很大的便利,由于其每次加载或者卸载驱动模块不需要重启系统,从而有助于缩小开发周期,为开发带来方便。
内核模块和应用程序的另外一个区别是,应用程序的开发者必须可以在程序中调用它并未定义的函数(如C语言的库函数printf()),而内核模块仅仅被连接到内核,因此模块所能调用的函数仅仅是由内核导出的那些函数。
最后,应用程序和内核模块的另外一个重要区别是他们处理错误的方式,应用程序开发中出现段错误一般可以通过调试技术跟踪到代码中,而内核模块中的一个错误,即使不会影响到整个系统,至少也会杀死当前进程。
文章来源:http://kaffeel.org/archives/248
相关文章
- 在Ubuntu Linux中从Eclipse交叉编译Windows应用程序?
- Rails + Apache +乘客+ EC2 Linux AMI“来自应用程序的不完整响应”
- 在Mac OS X上使用Eclipse CDT调试远程Linux应用程序
- 获取linux中打开的应用程序窗口的数量
- 如何在Linux上编译一个编译并运行良好的“C”应用程序?
- 如何将.Net Core应用程序部署在Linux操作系统上运行
- Linux应用程序启动过程的静态分析
- Kali-linux攻击WordPress和其他应用程序
- 在Linux上的Eclipse RCP应用程序中加载本机库
- UCS-2与UTF8之间的选择(4)--linux中各编码字符串的C/C++输出支持及方式比较