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内核添加模块(驱动)有如下两种方式: (1)动态方式:采用insmod命令来给运行中的linux加载模块。 (2)静态方式:修改linux的配...
  • MARZ07101
  • MARZ07101
  • 2012-06-09 07:39:32
  • 4957

【Linux】对比直接编译进内核和模块形式

Compiling directly into a kernel vs. modules You have two options for adding functionalit...
  • Joanna_yan
  • Joanna_yan
  • 2015-12-16 20:33:17
  • 743

如何把自己的驱动编译进内核或模块(Kconfig和Makefile)

2.6内核的源码树目录下一般都会有两个文文:Kconfig和Makefile。分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015-04-16 19:19:48
  • 1672

将wifi固件编译进内核,成功加载sdio wifi模块

Wifi驱动以编译进内核的形式加载,因此需要将wifi所需的固件一同编译进内核,首先将helper_sd.bin sd8686.bin两个固件复制到内核源代码目录下的firmware目录下。将help...
  • hanmengaidudu
  • hanmengaidudu
  • 2013-12-13 11:43:54
  • 2264

驱动编译进内核和编译模块的区别

linux内核中Kconfig文档的作用 2.6内核的源码树目录下一般都会有两个文文:Kconfig和Makefile。分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kco...
  • yangjiancool
  • yangjiancool
  • 2013-12-18 21:09:57
  • 6407

驱动模块静态编译到 Linux 内核

一、准备好可以正常引导开发板的源码 二、在内核源码kernel文件夹的driver目录下,创建led_arm文件夹 mkdir drivers/led_arm 三、将“LED驱动实验”...
  • xy010902100449
  • xy010902100449
  • 2015-04-19 20:03:00
  • 1933

编译驱动到内核的两种方式

搜索公众号:itxxgh  (IT学习干货)更名为《IT首席技术官》,全公益,免费提供,《IT学习教程》。传播正能量,扫码关注新浪微博 http://weibo.com/sageAqi 今日头条 ...
  • u011164819
  • u011164819
  • 2015-11-23 17:35:49
  • 4055

将自己编写的程序静态编译进内核

自己编写了驱动程序,现在需要把驱动程序加入到内核里面静态编译。 网上找了一些方法,但是都不是很理想。 经过一番折腾终于搞定。 我的linux内核版本是3.08  Linux内核源码树的每个目录...
  • u011613545
  • u011613545
  • 2014-12-09 13:50:49
  • 852

linux 编译进内核 && 编译成模块module

refer: http://blog.csdn.net/yicao821/article/details/6740269 http://blog.csdn.net/yicao821/artic...
  • lxl584685501
  • lxl584685501
  • 2015-06-15 11:21:56
  • 4365

怎样将驱动静态的编译到内核中。

怎样将驱动静态的编译到内核中。   使用的开发板:tq210的s5pv210开发板 内核版本:linux-3.8.3 编译器:arm-linux-gcc 4.4.3 相关下载地址:   一、准备好...
  • a1299600490
  • a1299600490
  • 2016-07-20 10:37:59
  • 888
收藏助手
不良信息举报
您举报文章:linux&nbsp;将模块编译进内核
举报原因:
原因补充:

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