分享

嵌入式系统:linux内核驱动模块与应用程序的区别

 guitarhua 2011-12-29

嵌入式系统:linux内核驱动模块与应用程序的区别

标签:嵌入式系统linux,嵌入式linux 时间:2010-10-12 09:36 点击: 选择字体大小:  

在嵌入式系统linux学习的过程中,有必要对嵌入式linux内核驱动模块与应用程序的区别有一个比较清晰的认识,这对深入学习研究嵌入式系统有重要的帮助。

大部分中、小规模的应用程序从头至尾处理一个单个任务,而每个内核模块却只是事先注册自己以便服务将来的某个请求,并且它的初始化函数立刻终止。换句话说,模块初始化函数的任务是为以后调用模块的函数做准备;好像是模块说,“我在这里,这是我能做的.”模块的退出函数(例子里是hello_exit )就在模块被卸载时调用。它好像告诉内核,“我不再在那里了,不要要求我做任何事了.”这种编程的方法类似于事件驱动的编程,但是虽然不是所有的应用程序都是事件驱动的,但每个内核模块都是。在事件驱动的应用程序和内核代码之间的另外一个主要的不同是:应用程序退出时,可以不管资源的释放和其他的清除工作,但是模块的退出函数必须小心恢复每个由初始化函数建立的东西,否则会保留一些东西直到系统重启。

能够卸载模块是模块化驱动程序的一大特色,因为它有助于缩短驱动程序的开发时间;我们可以反复地调试和测试新的驱动,而不用每次经历漫长的关机和重启时间。

我们知道一个应用程序可以调用它并未定义的函数,这是因为连接过程能够解析外部引用从而使用适当的函数库。例如,定义在libc中的printf就是这种可调用的函数之一。 然而,模块仅仅被连接到内核,它能够调用的唯一的函数是内核输出的那些函数;没有任何可供连接的函数库。例如,在hello.c中使用的printk函数,是在内核中定义的printf版本并且输出给模块。除了几个细小的差别外,它和printf函数功能类似,最大的不同在于缺乏对浮点的支持。

因为没有任何函数库和模块连接,因此,源文件中不应当包含通常的头文件, 和一些非常特殊的情况是仅有的例外。只有实际上是内核的一部分的函数才可以在内核模块里使用。和内核相关的任何内容都在内核源代码树的头文件里声明;大部分相关的头文件位于include/linux和include/asm目录中。

内核编程和应用程序编程之间的另外一个重要不同在于各环境下处理错误的方式不同:在应用程序开发中段错误是无害的,并且总是可以使用调试器跟踪到源代码中的问题所在,而一个内核错误即使不影响整个系统,至少会杀死当前进程。

更多嵌入式系统linux知识请咨询安博中程嵌入式专家,或访问官方网站主页。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多