`
cm14k
  • 浏览: 30700 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

编写第一个内核模块

阅读更多

    内核模块是Linux内核向外部提供的一个接口,其全称是 动态可加载内核模块(Loadabkle Kernel Module,LKM)。 Linux 内核之所以提供模块机制,是因为它本身是一个单内核( monolithic kernel )。单内核的最大优点是效率高,因为所有的内 容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。

 

一、什么是模块


模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或内核中其他上层功能。


二、 编写一个简单的模块

模块和内核都在内核空间运行, 模块编程在一定意义上说就是内核编程。因为内核版本的每次变化,其中的某些函数名也会相应地发生变化,因此模块编程与内核版本密切相关。

 

第一个内核模块:

内核版本:2.6.31-4
在RedFlag 6.0测试通过

 

/*
 * hellomod.c
 * 第一个内核模块
 * author:cm
 * date:2010-3-28
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int __init lkp_init(void)
{
    printk("<1>Hello,Kernel! from the kernel space...\n");
    return 0;
}

static void __exit lkp_cleanup(void)
{
    printk("<1>Goodbye,Kernel! leaving the space...\n");
}

module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_LICENSE("GPL");

说明:

8~10行 一些必要的头文件

所有模块都要使用头文件module.h,此文件必须包含进来。
头文件kernel.h包含了常用的内核函数。

头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。

 

12~16行

这是模块的初始化函数,它必需包含诸如要编译的代码、初始化数据结构等内容

printk()函数 该函数是由内核定义的,功能与C库中的printf()类似,它把要打印的信息输出到终端或系统日志。字符串中的<1>是输出的级别,表示立即在终端输出。

 

18~21行

这是模块的退出和清理函数。此处可以做所有终止该驱动程序时相关的清理工作。

 

23~24行

函数module_init()和module_exit()是模块编程中最基本也是必须的两个函数。module_init()向内核注册模块所提供的新功能,而module_exit()注销由模块提供的功能。

module_init() 是驱动程序初始化的入口点。对于内置模块,内核在引导时调用该入口点;对于可加载模块则在该模块插入内核时才调用,在卸载模块时调用module_exit()函数。

 

25行

GNU公共许可证 (必须)


编译

 

编译工具:gcc make

Makefile文件:

#Makefile2.6
obj-m += hellomod.o #产生hellomod模块的目标文件
CURRENT_PATH := $(shell pwd) #模块所在的当前路径
LINUX_KERNEL := $(shell uname -r) #内核版本
#内核源码的绝对路径 (RedFlag 6.0)
LINUX_KERNEL_PATH := /usr/src/kernels/2.6.31-4-i686
all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块
clean:
	rm -rf *.mod.c *.o *.ko *.markers *.symvers *.order #清理 

执行make命令,会自动生成模块相关文件(如 .o  .ko文件)

 

插入模块到内核

[root@localhost module]# insmod hellomod.ko

 

成功插入后,可以通过dmesg命令查看这个模块所执行的显示内容

[root@localhost module]# dmesg

 

...

Hello,Kernel! from the kernel space...

 

卸载模块

[root@localhost module]# rmmod hellomod

 

再次执行dmesg 显示

Hello,Kernel! from the kernel space...
Goodbye,Kernel! leaving the space...

 

注:查看(dmesg)其实是看日志,只要是看日志的方法应该都是可以的比如:tail /var/log/messages

 

 

 

 

分享到:
评论

相关推荐

    Linux驱动开发之编写第一个内核模块--Hello World源码

    Linux驱动开发之编写第一个内核模块--Hello World源码, 亲测OK,对应文章链接: https://dingdong.blog.csdn.net/article/details/106329048

    linux内核模块.pdf

    最后第4章是驱动设计指导规范, 它是一个提纲性质的, 提醒我们在编写内核模块时的主要注意事项. 我们在做具体项目的时候, 可以查询此章节获得一个快速指引, 如果你对快速指引的细节遗忘了, 则需要重新理解第3章的内容...

    08 内核模块Hello1

    6参考文献深入理解UNIX系统内核 [美] Uresh Vahalia著 第2章进程与内核Linux设备驱动程序第3版 第2章建立和运行模块7实验拓展编写自己的

    Ubuntu下内核编程之第一个模块

    图文并茂的展示了第一个简单模块编写的全过程。。。。

    编写属于你的第一个Linux内核模块

    内核编程常常看起来像是黑魔法,而...  学习内核编程的简单的方式也许是写个内核模块:一段可以动态加载进内核的代码。模块所能做的事是有限的——例如,他们不能在类似进程描述符这样的公共数据结构中增减字段(LCTT

    编写属于你的第一个模块源码

    关于属于你的第一个模块的源码,来自github上原作者的源码。还有一份我自己写的,回头传上来

    kmod:一个用C编写的linux内核的简单模块,与《操作系统概念》一书兼容

    一个用C编写的linux内核的简单模块,与《操作系统概念》一书兼容 实验说明 项目1 在这个项目中,您将在Linux系统中开发内核模块。 作业:完成并提交教科书(操作系统概念)第3章中的项目2(用于列出任务Linux内核...

    Ubuntu下内核编程之第一个模块helloworld(附源码)

    图文并茂的描述了Ubuntu下内核编程之第一个模块helloworld的编写全过程,另附有代码。

    杭电操作系统实验

    实现两个模块,第一个模块列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID。通过`for_each_process`来遍历进程列表;用`task_struct-&gt;mm`判断是否为内核线程;用`get_task_parent`来获得父...

    将驱动及应用软件移植到Linux2.6内核

    内核设置编辑器可对每个内核设置变量进行描述,帮助用户决定哪些变量需要被清除,哪些需要写入内核,或者编成一个可加载内核模块在需要时进行加载。建立新内核的第一步是对内核进行设置。当用户对内核进行设置时,...

    深入分析Linux内核源码

    第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核 1.3.1 Linux内核的特征 1.3.2 Linux内核版本的变化 1.4 分析Linux内核的意义 1.4.1 开发适合自己的操作系统 ...

    深入分析Linux内核源码.chm

    10.5 编写内核模块 第十一章 设备驱动程序 11.1 概述 11.2 设备驱动基础 11.3 块设备驱动程序 11.4 字符设备驱动程序 第十二章 网络 12.1 概述 12.2 网络协议 12.3 套接字(socket) 12.4 套接字缓冲区(sk_buff) 12.5 ...

    procfs_example:proc文件系统示例模块

    编写一个内核模块,该模块在/proc目录下创建我们自己的目录proc_example 然后在这个目录下创建三个普通文件(foo、bar、jiffies)和一个文件链接(jiffies_too)。foo和bar是两个可读写文件,各自实现读取操作函数与...

    HiddenWall:使用Netfilter挂钩生成用于自定义规则Linux内核模块的工具。 (阻止端口,隐藏模式,保护功能等)

    暗墙 HiddenWall是Linux内核模块生成器,用于使用netfilter的自定义规则。 (阻止端口,隐藏模式,rootkit功能等)。 动机:在糟糕的情况下,攻击者可以使您的iptables / ufw崩溃。 但是,如果您具有HiddenWall,则...

    寒江独钓-Windows内核安全编程(高清完整版).part1

    1.1.2 编写第一个C文件 3 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机中运行 9 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows ...

    银行家算法目六、linux模块加载或内核编译

    无,可以下载,项目五、linux系统进程间通信方式分析 设计要求: ① 分析linux系统下几种主要的进程通信手段。 ② 共享存储器的方式 ③ 共享文件的通信方式 ...项目六、linux模块加载或内核编译 设计要求:

    寒江独钓-Windows内核安全编程(高清完整版).part4

    1.1.2 编写第一个C文件 3 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机中运行 9 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows ...

    Windows内核安全与驱动开发光盘源码

    1.1.2 编写第一个C文件 4 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机中运行 8 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置...

    寒江独钓-Windows内核安全编程(高清完整版).part3

    1.1.2 编写第一个C文件 3 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机中运行 9 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows ...

    寒江独钓-Windows内核安全编程(高清完整版).part7

    1.1.2 编写第一个C文件 3 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机中运行 9 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows ...

Global site tag (gtag.js) - Google Analytics