First insmod a module

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

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

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

environment

[[email protected] 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

[[email protected] 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‘
[[email protected] 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

 1 //Begin---hello.c
 2 //my kernel path
 3 //[[email protected] bin]# ls /usr/src/kernels/3.10.0-123.el7.x86_64/include/linux/module.h
 4 #include</usr/src/kernels/3.10.0-123.el7.x86_64/include/linux/init.h>
 5 #include</usr/src/kernels/3.10.0-123.el7.x86_64/include/linux/module.h>
 6
 7 MODULE_LICENSE("GPL");
 8 //printk(KERN_ALERT "Begin\n");
 9 static int hello_init(void)
10 {
11   printk(KERN_ALERT "Hello World!\n");
12   return 0;
13 }
14
15 static void hello_exit(void)
16 {
17   printk(KERN_ALERT "Good bye, ubuntu\n");
18   // return 0;
19 }
20
21 module_init(hello_init);
22 module_exit(hello_exit);
23 //End---hello.c
#Begin---Makefile
KERNELDIR=/lib/modules/3.10.0-123.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

时间: 2024-11-08 20:26:52

First insmod a module的相关文章

linux 命令之 insmod

man insmod: INSMOD(8) insmod INSMOD(8) NAME insmod - Simple program to insert a module into the Linux Kernel SYNOPSIS insmod [filename] [module options...] DESCRIPTION insmod is a trivial program to insert a module into the kernel. Most users will wa

insmod lsmod rmmod

insmod(install module) 功能说明:载入模块 install loadable kernel module 语法:insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值] 参数: -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入.-k 将模块设置为自动卸除.-m 输出模块的载入信息.-o   <模块名称> 指定模块的名称,可使用模块文件的文件名.-p 测试模块是否能正确地载入kernel

Linux insmod命令

|--Linux insmod命令 说明: Linux insmod(install module)命令用于载入模块. Linux有许多功能是通过模块的方式,在需要时才载入kernel. 如此可使kernel较为精简,进而提高效率,以及保有较大的弹性. 这类可载入的模块,通常是设备驱动程序. 基本语法 insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值] |--常用选项: -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模

自制linux临时保存草稿

内核编译 单内核体系设计.但充分借鉴了微内核设计体系的优点,为内核引入模块化机制. 内核组成部分: kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE: kernel object: 内核对象,一般放置于 /lib/modules/VERSION-RELEASE/ [ ]: N [M]: M [*]: Y 辅助文件:ramdisk initrd initramfs 运行中的内核: uname命令: uname-print

Linux kernel模块管理相关详解

一.Linux内核模块化设计 1.Linux内核设计:单内核.模块化(动态装载和卸载) (1 )Linux:单内核设计,但充分借鉴了微内核体系的设计的优点:为内核引入了模块化机制: (2) 内核的组成部分: kernel:内核核心,一般为bzImage格式,通常位于/boot目录,名称为vmlinuz-VERSION-release: 当系统启动之后该文件就不在使用,因为已经加载到内存,放置/boot下方便管理 kernel object:内核模块,一般放置于/lib/modules/VERSI

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

du -sh */ reference to : http://blog.chinaunix.net/uid-27164517-id-3299073.html linux常用命令的英文单词缩写 命令缩写:ls:list(列出目录内容)cd:Change Directory(改变目录)su:switch user 切换用户rpm:redhat package manager 红帽子打包管理器pwd:print work directory 打印当前目录 显示出当前工作目录的绝对路径ps: proc

Linux 命令缩写

ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat package manager 红帽子打包管理器 pwd:print work directory 打印当前目录显示出当前工作目录的绝对路径 ps: process status(进程状态,类似于 windows 的任务管理器) 常用参数:-auxfps -auxf 显示进程状态 df: disk free 其功能是显示磁盘可用空间数目信息及空间结点信

系统启动和内核管理

CentOS 5和6的启动流程 服务管理 Grub管理 自制Linux 启动排错 编译安装内核 Linux组成 Linux: kernel+rootfs kernel: 进程管理. 内存管理. 网络管理. 驱动程序. 文件系统. 安全功能 rootfs:程序和glibc 库:函数集合, function, 调用接口(头文件负责描述) 过程调用:procedure,无返回值 函数调用:function 程序:二进制执行文件 内核设计流派: 单内核(monolithic kernel):Linux

Linux 常见的单词缩写

命令缩写:ls:list(列出目录内容)cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat package manager 红帽子打包管理器 pwd:print work directory 打印当前目录 显示出当前工作目录的绝对路径 ps: process status(进程状态,类似于windows的任务管理器) 常用参数:-auxf ps -auxf 显示进程状态 df: disk free 其功能是显示磁盘可用空间数目信息及空