Linux内核编程和用户应用程序编程的几点不同之处

     在此之前也不清楚linux内核编程跟用户应用程序编程之间有什么不同,正好这几天做了一点linux模块编程,遇到问题请教朋友并查一些资料,感觉对内核编程和

用户应用程序编程的几点不同有了一点体会,就写了下来。



1.linux内核编程和用户应用程序编程最大的不同是,前者是在内核态下运行的,而后者主要在用户态下运行,有时通过一些系统调用切换到内核态下运行,

但这时间不会太长。



2.内核编程引进的头文件都在内核源码的include文件夹下,比如我的debian linux 2.6环境下是:/usr/src/linux/include下,而用户应用程序编程引进的头文件都是从

开发环境头文件的include文件夹下,比如 我的环境下是:/usr/include下。也就是凡是要include的头文件在内核源码include底下没有的都不能用。



3.要查询一个函数能否在内核编程中用,可以通过http://lxr-itec.uni-klu.ac.at/linux-2.6.4/ident查 (这是针对linux2.6内核,也有针对2.4内核的),如果能查到

Defined as a function,那就可以用,否则就不行。


4.举个简单的例子:当socket编程时,用户在应用程序编程时,基本上都用到socket()函数创建一个socket描述符,include的头文 件主要是<sys/socket.h>,

<sys/types.h>和<netinet/ip.h>,这几个头文件 在内核源码include下都没有,所有不能用,但内核编程有它自己的一套。内核socket编程时,需要用sock_create()

得到一个 socket结构体,如果想跟用户应用程序一样用socket描述符来操作socket,可以再用sock_map_fd()新建一个对应的描述符,而且 需要时可以通过

sockfd_lookup(),实现通过描述符查找对应的socket结构体。其实socket函数内核实现时就是先有 sock_create(),再有sock_map_fd()。


 

原文链接: (一个内核编程,应用编程都做过的人也未必能短时间内说全,所以有必要整理下)

http://www.arrowapex.cn/archives/66.html


另外补充:

 对于linux内核编程如果只是驱动编程的话那么涉及到的程序框架基本都是死的,设计好了的,要跟linux系统匹配才行,但是应用程序则是很灵活

随着linux内核更新和linux发行版更新应用程序调用的api变化很小无需相应改进;但是内核态的api 和数据结构 变动一般就很大了。




你可能感兴趣的:(Linux内核编程和用户应用程序编程的几点不同之处)