linux 将模块编译进内核

原创 2016年08月29日 12:49:54

首先cd  /tmp

[root@localhost tmp]#vi hello.c


hello.c

  1. #include <</span>linux/init.h>   
  2. #include <<span style="margin: 0px; padding: 0px; border: none; color: rgb(153, 51, 0); font-weight: bold; background-color: inherit;">linux/module.h>  
  3. #include <<span style="margin: 0px; padding: 0px; border: none; color: rgb(153, 51, 0); font-weight: bold; background-color: inherit;">linux/moduleparam.h>  
  4.   
  5. static int hello_init(void)  
  6.  
  7.    printk("Hello world\n");
  8.     return 0;  
  9.  
  10.   
  11. static void hello_exit(void)  
  12.  
  13.      printk("Goodbye world\n");
  14.  
  15.   
  16. module_init(hello_init);  
  17. module_exit(hello_exit);  

这个文件需要编译成模块, 创建Makefile

 

[root@localhost tmp]# vi Makefile


Makefile

  1. obj-m   :hello.o  
  2. KERNELDIR :/lib/modules/$(shell uname -r)/build  
  3. PWD       :$(shell pwd)  
  4.   
  5. default:  
  6.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
  7.   
  8. clean:  
  9.     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions  

其中 uname -r 是查看内核版本,     我们这里显示 的是3.11.10-301.fc20.x86_64
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
-C $(KERNELDIR)
表示在$(KERNELDIR)目录下执行make命令。
-M=$(PWD)
表示包含$(PWD)下的Makefile文件。
modules
表示模块编译

在终端中执行make

[root@localhost tmp]# make

make -C /lib/modules/3.11.10-301.fc20.x86_64/build M=/tmp modules

make: *** /lib/modules/3.11.10-301.fc20.x86_64/build: No such file or directory.  Stop.

 

make: *** [default] Error 2

报错
这是因为一下几个原因:
进入到 /lib/modules/3.11.10-301.fc20.x86_64/   发现build 其实是个链接文件。
首先要确保内核开发包已经安装了,到 /usr/src/kernels/ 下看一看,  有没有类似 3.11.10-301.fc20.x86_64 这样的文件夹,  如果没有,就再终端执行 # yum install kernel-devel 
最好后面加个版本号,否则后面insmod的时候会报错
# yum install kernel-devel-3.11.10-301.fc20.x86_64
我们这里安装号以后,发现在  /usr/src/kernels/  下有了3.11.10-301.fc20.x86_64这个文件夹。

然后再重新回到/lib/modules/3.11.10-301.fc20.x86_64文件夹下

[root@localhost 3.11.10-301.fc20.x86_64]# ln -s /usr/src/kernels/3.11.10-301.fc20.x86_64/    build
这就把build 和 /usr/src/kernels/3.11.10-301.fc20.x86_64/这个文件夹创建了连接

这时,再重新回到/tmp下。执行make
[root@localhost tmp]# make
make -C /lib/modules/3.11.10-301.fc20.x86_64/build M=/tmp modules
make[1]: Entering directory `/usr/src/kernels/3.11.10-301.fc20.x86_64'
  CC [M]  /tmp/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/hello.mod.o
  LD [M]  /tmp/hello.ko
make[1]: Leaving directory `/usr/src/kernels/3.11.10-301.fc20.x86_64'


此时查看文件夹
[root@localhost tmp]# ls
可以发现生成hello.ko模块

这时候将这个模块加载
[root@localhost tmp]# insmod ./hello.ko

查看所有被加载的内核模块:
[root@localhost tmp]# cat /proc/modules
可以发现刚加载的hello
hello 12496 0 - Live 0xffffffffa03b1000 (POF)


查看记录(-c 是每次查看完缓冲区并清空    这里不加-c 就不清空)
[root@localhost tmp]# dmesg -c
可以发现
[ 8325.905181] Hello world

卸载模块
[root@localhost tmp]# rmmod hello


查看记录
[root@localhost tmp]# dmesg -c
可以发现
[ 8456.036882] Goodbye world


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux 2.6内核 编译模块Makefile 详解!

linux 2.6内核 编译模块Makefile 详解! 编译模块的make file 必须是Makefile,不能是makefile. //why? ifneq ($(KERNE...

linux 下编译内核模块(亲测可用哦)

转自:http://www.cnblogs.com/zhanglanyun/archive/2011/11/26/2264406.html一、 编写一个简单的模块模块和内核都在内核空间运行,模块编程在...

Linux内核2.4和2.6编译模块的方法

http://blogold.chinaunix.net/u3/112205/showart_2191169.html  Linux内核2.4和2.6编译模块的方法  2.6下的模块,扩展名为.ko,...

linux内核模块编译链接与加载剖析二

加载 当我们执行insmod的时候发生了什么?我们查看一下linux3.6代码在加载内核模块的时候做了什么 模块工具modutils 内核中处理模块的调用关系 include/linux/syscal...

Linux内核模块的编译基础知识

关于内核驱动的东西网络上有很多,但网上的东西还是感觉有点笼统,读过之后就忘了,还是需要写下来,或者写到本子上,自己形成一个概念好一些。读了这本书上的东西,把觉得好的东西写下来,已备不时之用,也强化记忆...

linux内核模块编译及动态加载

一个简单的内核模块程序: #include /* Defines the license for this linux kernel module */ MODULE_LICENSE("GPL")...

linux 内核模块编程之编译多个源文件(三)

编译拥有多个源文件的内核模块的方式和编译一个源文件的方式差不多,我们先来看下我们需要的文件都有哪些。 首先是main.c文件 #include #include MODULE_LICEN...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)