1.关于内核模块开发的问题之前要晓得Linux内核模块是如何来的?是怎样一回事?
Linux内核的整体结构十分庞大,包括的组件特别多,怎么使用须要的组件?
方式一:把所有的组件都编译进内核文件,即:zlmage或bzlmage。
然而会出现两个问题:
一是生成内核文件过大。
二是假如要添加或删掉某个组件,须要重新编译整个内核。
方式二:我们希望的是有一种机制让内核文件本身不包含某组件,而是在该组件须要使用的时侯,动态的添加到正在运行的内核中?
这就是我们谈到的内核模块的概念。
2.哪些是内核模块?
内核模块是具有独立功能的程序。它可以被单独编译,而且不能单独运行linux查看端口占用,它的运行必须被链接到内核,并作为内核的一部份在内核空间中运行。
模块编程和内核版本密切相连,由于不同的内核版本中个别函数的函数名会发生变化,因而模块编程也可以说是内核编程
3.内核模块的特征
模块本身并不被编译进内核文件,可以按照须要linux内核开发头文件,在内核运行期间动态的安装或卸载
剖析一段内核模块程序:
就里面简单的内核模块程序中出现了与我们传统所见的C不同的代码linux内核开发头文件,这地方十分有必要的了解一下内核开发的特性。
相对于用户空间应用程序的开发红旗linux操作系统,内核开发有一些其独到之处。最主要的差别有如下几种:
1)内核编程时侯既不能访问C库也不能访问标准的C头文件
2)内核编程必须使用CUNC
3)内核编程缺少像用户空间那样的显存保护机制
4)内核给每一个进程只有一个很小的定长栈
5)因为内核支持异步中断、抢占和SMP,因而必须时刻注意同步和并发
继续里面的几点,我们首先有疑惑,既然内核编程不能访问C库也不能访问标准的C头文件,且编程必须使用GNUC。这么GNUC究竟是哪些,和标准C有哪些区别?
1.首选回答第一个问题:为何不能访问C库和访问标准C头文件?
这个问题显然就是涉及到了先有蛋还是先有鸡的问题,而且最主要的还是对内核而言,完整的C库,哪怕是一个子集,都太大且效率太低。
既然不才能使用,这么C库函数带来的便捷就不能否被我们所用,虽然大部份C库函数都早已在内核中实现了。诸如操作字符串的函数就坐落lib/string.c文件中,只要包含头文件就可以了。
2.里面还提及了一个关于GNUC的问题,那哪些是GNUC呢?
在说GNUC之前,先了解下gcc,gcc似乎就是多种GNU编译器的集合,它包含的C编译器既可以编译内核,也可以编译Linux系统上用C语言写的其他代码。而GCC之前就称作GNUC
3.内核开发中无libc库或无标准头文件
所以在内核开发中所提及的头文件,都指的是组成内核代码树的内核头文件(之前提到的lib目录)。
内核源代码不能包括外部头文件,如同它们不能用外部库一样。
基本的头文件集坐落内核源代码树顶尖目录下的include目录中。
比如头文件坐落include/linux/inotify.h