1. hello.c

 #include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h> MODULE_AUTHOR("TangHuimin");
MODULE_DESCRIPTION("My First Try to Kernel Module");
MODULE_LICENSE("GPL"); static int hello_init(void)
{
printk(KERN_ALERT "Hello World Enter\n");
return ;
} module_init(hello_init); static void hello_exit(void)
{
printk(KERN_ALERT "Hello World Exit\n");
} module_exit(hello_exit);

2. Makefile

obj-m += hello.o

CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)
LINUX_KERNEL_PATH:=/usr/src/kernels/$(LINUX_KERNEL) all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

3. make //编译,生成hello.ko

4. insmod hello.ko //加载hello模块,会打印“Hello World Enter”

  lsmod | grep hello //lsmod打印所有的内核模块,有显示"hello",表明hello模块已被加载

rmmod hello.ko //卸载hello模块,会打印"Hello World Exit"

lsmod | grep hello //不显示"hello",表明hello模块已被卸载

注:

  对于CentOS系统,/usr/src/kernels/xxx(内核版本)/ 目录为空,导致编译内核模块失败。

解决方法:安装kernel-devel组件 或 安装整个内核源代码
参考:http://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source
我的做法:安装kernel-devel
1.uname -r获得内核版本号,我的是2.6.32-358.el6.x86_64;
2.到http://rpmfind.net/linux/rpm2html/search.php?query=kernel-devel下载与内核版本号对应的kernel-devel,我的是kernel-devel-2.6.32-358.el6.x86_64.rpm;
3.安装kernel-devel,rpm -ivh kernel-devel-2.6.32-358.el6.x86_64.rpm;
4.ls /usr/src/kernels/2.6.32-358.el6.x86_64,此目录下不再为空。

爱之初体验---编译加载内核模块hello的更多相关文章

  1. canvas初体验之加载图片

    上一篇的介绍主要是画一些基本的图案,这一篇主要是加载图案. canvas加载图片主要分为两个步骤: 1.获取图片资源. 2.将图片资源画到画布上. 1.1获取图片资源,canvasAPI为我们提供了多 ...

  2. echart初体验 动态加载数据

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  4. CentOS启动时自动加载内核模块

    要想在CentOS中自动加载内核模块,需要在/etc/sysconfig/modules/目录中增加一个脚本,在此脚本中加载所需的模块. 下面是我所用的一个名为8021q.modules的脚本,用来在 ...

  5. ue4 plugin的编译加载

    插件Plugin: 本来应该是指一种纯以接口与外界打交道的程序模块,在同一接口背后可以有多种实现,更换实现完全不影响客户端代码(不用重编). 但是在ue4的世界里,插件似乎不是这个意思,仅仅是一种可以 ...

  6. Ubuntu16.04下的modules模块编译加载

    一.首先编写对应的驱动程序的相关内容:(最简单的hello.c程序) #include<linux/init.h> #include<linux/module.h> MODUL ...

  7. 加载内核模块-Unknown symbol错误分析

    Unknown symbol 说明  有些函数不知道(未定义). 在调试过程中,发现一个问题,编译生成一个KO文件,insmod加载后报错: Unknown symbol var_set_intege ...

  8. Qt 5.2中编译加载MySQL数据库驱动问题的总结

    背景: 本科毕业设计涉及图形界面与数据库查询.选择使用Qt实现图形界面编程,使用MySQL构建数据库.之前安装了Qt 5.2,后来又安装了MySQL Server 5.6 (FULL完全安装).接着就 ...

  9. linux下设备驱动的结构&编译&加载

    构造和运行模块 insmod modprobe rmmod 用来装载模块到正运行的内核和移除模块的用户空间工具. #include<linux/init.h> module_init(in ...

随机推荐

  1. 客户端使用自定义代理类访问WCF服务 z

    通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或 web.config文件中产生WCF服务的客户端配置信息.若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否 ...

  2. sql工作问题总结

    1. sql排序:1. order by ……2. row_number() over(partition by …… order by ……) 使用说明:此函数适合做分组.排序,而不能在使用它分组的 ...

  3. VisualStudio使用小技巧——快捷键(转)

    1. 怎样调整代码排版的格式?选择:编辑—>高级—>设置文档的格式或编辑—>高级—>设置选中代码的格式.格式化cs代码:Ctrl+k+f 格式化aspx代码:Ctrl+k+d2 ...

  4. nyoj 108 士兵杀敌(一)

    点击打开链接 士兵杀敌(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师, ...

  5. java类包第十一章

    1.同一个包中的类互相访问,不需要制定包名. 2.java中包名的规则是全部使用小写字母 3.final 方法不能被覆盖, public class OuterClass {    innerClas ...

  6. 关于前置式递增和后置式递增的小知识(++x与x++)

    list<char>::iterator pos; //list<char> coll; for(pos=coll.begin();pos!=coll.end();++pos) ...

  7. 11gr2 alert日志中报TNS-12535 TNS-00505原因及解决方法 (转载)

    前面新装了11GR2 RAC,某天在做巡检的时候发现alert日志中存在如下报错:Fatal NI connect error 12170. VERSION INFORMATION:        T ...

  8. 菜鸟-教你把Acegi应用到实际项目(9)-实现FilterInvocationDefinition

    在实际应用中,开发者有时需要将Web资源授权信息(角色与授权资源之间的定义)存放在RDBMS中,以便更好的管理.事实上,我觉得一般的企业应用都应当如此,因为这样可以使角色和Web资源的管理更灵活,更自 ...

  9. struts2页面上如何操作字符串

    <s:if test="prodName.length()>15"><s:property value='prodName.substring(0,15)' ...

  10. HTML控件-Select

    从今天开始,编写对于html控件的特性的探索文章,会广泛的引用网络的资源,所以本文的版权属于广大人民群众,欢迎转载,也同样禁止商业应用. [高手勿喷,标签页点击红色叉叉] select控件有一个特性: ...