不得不说网上坑爹的文章比虱子还多,参考这位仁兄调试成功

喜欢C的人却靠着Java产业吃饭,人艰不拆...

对于未知的东西,有个习惯,run success first,then research

environment

[root@vohst etc]# uname -a
Linux vohst 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

[root@vohst bin]# make
make -C /lib/modules/3.10.0-123.el7.x86_64/build/ M=/home/voh/bin modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-123.el7.x86_64'
  CC [M]  /home/voh/bin/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/voh/bin/hello.mod.o
  LD [M]  /home/voh/bin/hello.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-123.el7.x86_64'
[root@vohst bin]#

command(root):

make

insmod

lsmod | head

rmmod

[17842.192368] Hello World!
[18340.765263] Good bye, ubuntu
[18413.168837] Hello World!
[18832.134751] Good bye, ubuntu  //i like centos and suse,but suse is allways not purl
不会打印到屏幕,不重要,logdir=/var/log/dmesg,不是每次都能找到呢...

c & Makefile

 //Begin---hello.c
//my kernel path
//[root@vohst bin]# ls /usr/src/kernels/3.10.0-123.el7.x86_64/include/linux/module.h
#include</usr/src/kernels/3.10.-.el7.x86_64/include/linux/init.h>
#include</usr/src/kernels/3.10.-.el7.x86_64/include/linux/module.h> MODULE_LICENSE("GPL");
//printk(KERN_ALERT "Begin\n");
static int hello_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return ;
} static void hello_exit(void)
{
printk(KERN_ALERT "Good bye, ubuntu\n");
// return 0;
} module_init(hello_init);
module_exit(hello_exit);
//End---hello.c
#Begin---Makefile
KERNELDIR=/lib/modules/3.10.-.el7.x86_64/build/
PWD:=$(shell pwd)
INSTALLDIR=/home/voh/bin
obj-m:= hello.o
modules:
#this line should begins with "#"
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
##########
cp hello.ko $(INSTALLDIR)
clean:
##########
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY: modules modules_install clean
#End---Makefile

---------------------------------------------------------------------------------------------

http://blog.csdn.net/fareast8612/article/details/7470386

【0】笔者的配置环境
XP->VMWare 7.1->Ubuntu 9.04

【1】有必要查询下Linux内核
# uname -r
2.6.28-11-generic

# ls /usr/src/
linux-headers-2.6.28-11 linux-headers-2.6.28-11-generic

由此可见内核版本和内核头文件版本是一致的,都是2.6.28-11。(如果不一致的话在insmod一步必定出错:
Error inserting './hello.ko': -1 Invalid module format
网上有纠正这个错误的方法,但是感觉是在投机——躲避内核的版本检查;笔者在安装Ubuntu 8.04的时候出现过header头文件和内核版本不匹配的问题,后来通过重装Ubuntu为9.04解决之)。

【2】编写hello.c
新建自己的工作目录,如:
# mkdir /home/wk/hello

编写hello.c
# cd /home/wk/hello
# gedit hello.c
加入以下内容:
//Begin---hello.c
#include</usr/src/linux-headers-2.6.28-11/include/linux/init.h>
#include</usr/src/linux-headers-2.6.28-11/include/linux/module.h>

MODULE_LICENSE("GPL");
//printk(KERN_ALERT "Begin\n");
static int hello_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Good bye, ubuntu\n");
// return 0;
}

module_init(hello_init);
module_exit(hello_exit);
//End---hello.c
注意第一行
#include</usr/src/linux-headers-2.6.28-11/include/linux/init.h>
位置要正确;或者你只要写成
#include<linux/init.h>
保存退出(Ctrl+Q)。

【3】编写Makefile
# cd /home/wk/hello
# gedit Makefile
注意大小写。
#Begin---Makefile
KERNELDIR=/lib/modules/2.6.28-11-generic/build
PWD:=$(shell pwd)
INSTALLDIR=/home/wk/hello/install
obj-m:= hello.o
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
cp hello.ko $(INSTALLDIR)
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY: modules modules_install clean
#End---Makefile

First insmod a module的更多相关文章

  1. linux 命令之 insmod

    man insmod: INSMOD(8) insmod INSMOD(8) NAME insmod - Simple program to insert a module into the Linu ...

  2. linux下insmod lsmod rmmod

    insmod(install module) 功能说明:载入模块 install loadable kernel module 语法:insmod [-fkmpsvxX][-o <模块名称> ...

  3. Linux设备驱动程序加载/卸载方法 insmod和modprobe命令

    linux加载/卸载驱动有两种方法. 1.modprobe 注:在使用这个命令加载模块前先使用depmod -a命令生成modules.dep文件,该文件位于/lib/modules/$(uname ...

  4. [Android ] linux命令英文缩写的含义(方便记忆)

    du -sh */ reference to : http://blog.chinaunix.net/uid-27164517-id-3299073.html linux常用命令的英文单词缩写 命令缩 ...

  5. Linux 常见的单词缩写

    命令缩写:ls:list(列出目录内容)cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat package manager 红帽子打包管理 ...

  6. linux常用命令的英文单词缩写

    命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户rpm:redhat package manager 红帽子打包管 ...

  7. [Linux]常用命令与目录全拼

    命令缩写: ls:list(列出目录内容)cd:Change Directory(改变目录)su:switch user 切换用户rpm:redhat package manager 红帽子打包管理器 ...

  8. 鸟哥的linux私房菜——第20章 启动流程、模块管理与loader

    20.1 Linux启动流程分析 Linux启动过程: 按下开机电源后计算机硬件主动读取BIOS来加载硬件信息以及硬件系统的自我测试,之后系统会主动读取第一个可启动的设备(由BIOS设置),此时就可以 ...

  9. jz2440烧写开发板uboot,内核和文件系统等的相关命令

    下载文件{ftpget -u 1 -p 1 192.168.2.110 a.out a.outnfs 30000000(destination) 192.168.2.109:/home/fs/work ...

随机推荐

  1. 洛谷 P1546 最短网络 Agri-Net Label:Water最小生成树

    题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其 ...

  2. js中的this关键字详解

    this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, 复制代码 代码如下: function test(){ this.x = 1; ...

  3. Excel中COUNTIFS函数统计词频个数出现次数

    Excel中COUNTIFS函数统计词频个数出现次数   在Excel中经常需要实现如下需求:在某一列单元格中有不同的词语,有些词语相同,有的不同(如图1所示).需要统计Excel表格中每个词语出现的 ...

  4. HBase1.0以上版本的API改变

    HBase1.0以上版本已经废弃了 HTableInterface,HTable,HBaseAdmin等API的使用,新增了一些API来实现之前的功能: Connectioninterface: Co ...

  5. Photoshop教您快速的制作标准一寸证件照教程

    Photoshop教您快速的制作标准一寸证件照教程 对急需证件照的朋友,只要有一部相机,有电脑安装了PS软件,就可很快自己完成一寸照片的制作. 首先将相机卡里的照片存放在电脑硬盘里: 打开PS图片处理 ...

  6. java实现BitMap

    package bitmap; public class BitMap { private byte[] bytes; public BitMap(byte[] bytes) { super(); t ...

  7. TLV简介

    引子: 前段时间在项目中第一次接触TLV,项目中用这种格式来传输图片,语音等. 关于TLV TLV是一种可变的格式,意为:Type类型, Lenght长度,Value值.Type:该字段是关于标签和编 ...

  8. android夜间模式实现

    一.概述 android夜间模式实现分为两大类 重启activity的实现 不重启activity的实现 二.正文 1.重启activity实现夜间模式[在界面文件中的实现部分] 1.1在attrs. ...

  9. JDBC的事务处理

    JDBC的事务处理 事务,也是数据库事务,指的是作为单个逻辑工作单元执行的一系列操作.正常的情况下,操作应该顺利进行,与操作相关的所有数据库信息也成功地更新: 但是,如果在这一系列过程中任何一个环节出 ...

  10. Java获取前天和后天的时间

    import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import j ...