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()。

1人评论了“Linux内核编程和用户应用程序编程的几点不同之处”

  1. Greetings from Colorado! I’m bored at work so I decided to check out your site on my iphone during lunch break. I really like the knowledge you provide here and can’t wait to take a look when I get home. I’m surprised at how fast your blog loaded on my mobile .. I’m not even using WIFI, just 3G .. Anyways, fantastic blog!|

发表评论

邮箱地址不会被公开。