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

喜欢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. YSLOW

    什么是YSlow? YSlow是Yahoo发布的一款基于FireFox的插件. 如何安装YSlow? 安装YSlow必须首先先安装 Firebug,然后下载YSlow,再对其安装. YSlow有什么用 ...

  2. Spring中@Async用法总结

    引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3. ...

  3. java之redis篇(spring-data-redis整合一)

    redis的知识:官网 1.利用spring-data-redis整合 项目使用的pom.xml: <project xmlns="http://maven.apache.org/PO ...

  4. How parse REST service JSON response

    1. get JSON responses and go to : http://json2csharp.com/ 2. write data contracts using C# All class ...

  5. Convert between cv::Mat and QImage 两种图片类转换

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

  6. javascript通过时区获取时间

    /* 描述:时区的换算 参数:offset时区位置 使用:东八区calcTime(”+8"); */ function calcTime(offset) { // 创建一个本地日期 var ...

  7. Android Studio 环境部署 (转载)

    Android Studio的安装和使用过程经常需要下载以来文件和Gradle版本,而Google网站在天朝的访问可谓步履维艰,没有稳定的FQ工具是非常痛苦的.何况,作为一个优秀的程序员,不能访问国外 ...

  8. DBConfigReader.java

    package com.vcredit.ddcash.batch.util; import java.sql.Connection;import java.sql.PreparedStatement; ...

  9. decode 函数将字符串从某种编码转为 unicode 字符

    环境:Ubuntu, Python 2.7 基础知识 这个程序涉及到的知识点有几个,在这里列出来,不详细讲,有疑问的直接百度会有一堆的. 1.urllib2 模块的 request 对像来设置 HTT ...

  10. loading.gif