linux编译内核模块?ubuntu内核版本对应
linux编译内核模块linux编译内核模块
在linux中编写了一个小的内核模块,怎么编译成.ko文件?
从网上找一个编译模块的Makefile,放到你的模块的文件夹里面,然后修改里面的路径指定编译的内核,以及目标名称。make就可以了。
Linux编写内核模块编译时找不到头文件?
-I/usr/src/linux-headers-2.6.32-24/include其中,-I和后面的路径没有空格-I/usr/src/linux-headers-2.6.32-24/include一般也很少直接用gcc命令,大部分是用makefile,make-Ckernel_pathmodules
windows操作系统是由消息驱动的,那linux呢,是由什么驱动的,求高人解答,简要将下原理,谢谢?
Linux内核中采用可加载的模块化设计(LKMs,LoadableKernelModules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。
如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。
我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。
理解这一点很重要。因此,加载驱动时就是加载内核模块。
如何编译新添加的netfilter功能模块?
所以要实现netfilter(iptables)就要从两方面来着手:
1)内核支持netfilter;
2)用户层的iptables配置命令。1、编译内核,支持netfilter在宿主机上进入Linux内核目录,配置所需的内核模块:cd/usr/SRC/linuxmakemenuconfig选中如下内
linux的编译内核和编译内核模块有什么区别
当然需要。。。
第一点,就是源码树中有相应的头文件和函数的实现,没有源码树,你哪调用去呢?(PC上编译的时候内核有导出符号,系统中有头文件,这样就可以引用内核给你的接口了,但是只能编译你PC上版本的内核可加载的模块)。
第二个,内核模块中会记录版本号的部分,需要记录版本号的原因是不同的内核版本之间,那些接口和调用可能会有比较大的差异,因此必须要保证你的代码和某个特定的内核对应,这样编译出来的模块就可以(也是只能)在运行这个内核版本的Linux系统中加载,否则一个很简单的异常就会导致内核崩溃,或者你的代码根本无法编译通过(接口名变了)。
我上面说的是编译模块的情况,当然如果是把模块直接编译到内核当中去的话,那就不用说了,没有内核源码,你无法编译内核。
linux module命令
linux系统下module命令是什么呢?下面是具体介绍:
1、module命令简介:
modules的字面意思是模块,模块化有两个方法解决:设计者可以把各项功能分离到单独的叫做线程的处理中去,或者是将内核以包含/排除一些功能的方式重新编译。如果把功能分离到线程中去,那么内核就叫做“微内核”(micro-kernel),这种解决方法增加了线程间协调工作的通信开销,这种解决方案的优点在于内核的大小。
Linux的解决方案是包含内核模块,这些模块是可以按需要随时装入和卸下的。这样做可以使得内核的大小和通信量都达到最小。将模块从内核中独立出来,不必预先『绑』在 kernel codes中。
这样做有三种优点:一,将来修改 kernel时,不必全部重新compile,可节省不少时间;二,若需要安装新的 modules,不必重新 compile kernel,只要插入(通过insmode指令)对应的 modules即可;三,减少内核对系统资源的占用,内核可以集中精力做最基本的事情,把一些扩展功能都交由modules实现。
模块也可以用来尝试新的内核代码而不需要每次都创建和重激活内核。但是,这样做带来的问题是:使用内核模块通常会轻微的增加性能和内存开支。一个可加载模块肯定会产生更多的代码,这种代码和额外的数据结构会占用更多一点的内存。另外因为间接访问内核资源也让模块的效率轻微降低。
2、加载模块方法:
加载内核模块的方法有两种。
一是使用insmod命令手工把它插入到内核。
二是在需要的时候加载这个模块,叫做按需加载(demand loading)。当内核发现需要一个模块的时候,例如当用户安装一个不在内核的文件系统的时候,内核会请求内核守护进程(kerneld)试图加载合适的模块。
3、与modules有关的命令:
lsmode:列出已经被内核调入的模块
insmode:将某个module插入到内核中
rmmod:将某个module从内核中卸载
depmod:生成依赖文件,告诉将来的 insmod要从哪儿调入 modules。这个依赖文件就在/lib/modules/[您的kernel版本]/modules.dep。
Kerneld:负责自动的将模块调入内核和把模块从内核中卸载。
举例:
编译一个最小的Linux内核
必须要编译到内核中的内容:
1、root所在的硬盘配置。哪果您的硬盘是IDE接口,就把 ide的选项标记下来。如果是SCSI接口,请把您的接口参数及 SCSI id记标下来。
2、选择使用哪一个文件系统。Linux的默认文件系统是是 ext2,那么就一定要把它标记下来。如果机器中还其它的操作系统,如win98或windows NT,您还会可能选择FAT32或NTFS的支持,不过后面你可以通过手工加载的方式来加入新的模块支持。
3、选择Linux所支持的可执行文件格式。这里有两种格式可供选择:elf:这是当前Linux普遍支持的可执行文件格式,必须编译到内核中。
a.out:这是旧版的Linux的可执行文件各函数库的格式,如果你确认肯定用不到这种格式的可执行文件,那么就可以不把它编译到内核当中。
其它内容凡是所有选项中m提示的,都选择m,这样可以通过手工的方式添加该模块。
** Loadable module support*Enable loadable module support(CONFIG_MODULES) [Y/n/?]Set version
information on all symbols for modules(CONFIG_MODVERSIONS) [N/y/?]Kernel daemon support(e.g.
autoload of modules)(CONFIG_KERNELD) [Y/n/?]
分别回答 Y,N,Y。其中 CONFIG_KERNELD的 default值是 N,所以要注意选择Y。
make config完后,仍旧是 make dep; make clean。接下来要 make zlilo或 make zImage。然后 make modules; make modules_install。完成之后,就编译出一个没有调入多余模块的一个“干净的”内核映像文件了。