许多编程书籍从一个 "hello world" 例子开始, 作为一个展示可能的最简单的程序的方法. 本书涉及的是内核模块而不是程序; 因此, 对无耐心的读者, 下面的代码是一个完整的 "hello world"模块:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
这个模块定义了两个函数, 一个在模块加载到内核时被调用( hello_init )以及一个在模块被去除时被调用( hello_exit ). moudle_init 和 module_exit 这几行使用了特别的内核宏来指出这两个函数的角色. 另一个特别的宏 (MODULE_LICENSE) 是用来告知内核, 该模块带有一个自由的许可证; 没有这样的说明, 在模块加载时内核会抱怨.
printk 函数在 Linux 内核中定义并且对模块可用; 它与标准 C 库函数 printf 的行为相似. 内核需要它自己的打印函数, 因为它靠自己运行, 没有 C 库的帮助. 模块能够调用 printk 是因为, 在 insmod 加载了它之后, 模块被连接到内核并且可存取内核的公用符号 (函数和变量, 下一节详述). 字串 KERN_ALERT 是消息的优先级. [3]
我们在此模块中指定了一个高优先级, 因为使用缺省优先级的消息可能不会在任何有用的地方显示, 这依赖于你运行的内核版本, klogd 守护进程的版本, 以及你的配置. 现在你可以忽略这个因素; 我们在第 4 章讲解它.
你可以用 insmod 和 rmmod 工具来测试这个模块. 注意只有超级用户可以加载和卸载模块.
% make
make[1]: Entering directory `/usr/src/linux-2.6.10'
CC [M] /home/ldd3/src/misc-modules/hello.o
Building modules, stage 2.
MODPOST
CC /home/ldd3/src/misc-modules/hello.mod.o
LD [M] /home/ldd3/src/misc-modules/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.10'
% su
root# insmod ./hello.ko
Hello, world
root# rmmod hello
Goodbye cruel world
root#
请再一次注意, 为使上面的操作命令顺序工作, 你必须在某个地方有正确配置和建立的内核树, 在那里可以找到 makefile (/usr/src/linux-2.6.10, 在展示的例子里面 ). 我们在 "编译和加载" 这一节深入模块建立的细节.
依据你的系统用来递交消息行的机制, 你的输出可能不同. 特别地, 前面的屏幕输出是来自一个字符控制台; 如果你从一个终端模拟器或者在窗口系统中运行 insmod 和 rmmod, 你不会在你的屏幕上看到任何东西. 消息进入了其中一个系统日志文件中, 例如 /var/log/messages (实际文件名子随 Linux 发布而变化). 内核递交消息的机制在第 4 章描述.
如你能见到的, 编写一个模块不是如你想象的困难 -- 至少, 在模块没有要求做任何有用的事情时. 困难的部分是理解你的设备, 以及如何获得最高性能. 通过本章我们深入模块化内部并且将设备相关的问题留到后续章节.
//Makefile
obj-m := hello.o
KERNELBUILD :=/lib/modules/`uname -r`/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions
1.编译模块
$sudo make
这时,在hello.c 所在文件夹就会有 hello.ko ,这个就是我们需要的内核模块.
$sudo make clean
清理编译垃圾,hello.ko 也会清理掉.
2.插入模块,让其工作
$sudo insmod ./hello.ko
我们用dmesg 就可以看到产生的内核信息啦,Hello, world
$sudo rmmod ./hello
再用dmesg 可以看到 Goodbye, cruel world
这就是在2.6.xx下一个最简单的模块编写过程
分享到:
相关推荐
Linux内核模块编程是深入Linux操作系统核心的一种编程实践,它允许开发者动态地向内核添加代码(模块),而无需重新编译整个内核。这种机制极大地提高了系统的可扩展性和灵活性,使得增加、更新或删除特定功能成为...
Linux内核模块编程是Linux系统开发中的一个重要环节,它允许开发者在不重新编译整个操作系统内核的情况下,添加、修改或删除内核功能。这种方式极大地提高了系统的灵活性和可扩展性。下面将详细介绍Linux内核模块的...
接下来,我们创建一个简单的内核模块,名为“helloworld”。这个模块的主要目标是在系统日志中打印出“Hello, World!”的信息。首先,我们需要创建一个C源文件,比如`helloworld.c`,并在其中写入以下代码: ```c #...
"Linux 2.6内核模块编程范例"是针对这一主题的教程,它包括一个基本的"Hello, World!"程序以及一个标准的Makefile模板,帮助开发者了解如何编写和构建内核模块。 首先,我们来看"Hello, World!"程序,Exhello.c。这...
### Linux内核模块编程指南(经典):知识点详解 #### 一、内核模块简介与基础知识 **1. 内核模块概念** - **定义**:内核模块是可加载到Linux内核中的独立程序片段,它允许在系统运行时动态地添加、删除或更改...
### Linux内核模块编程指南:深入理解与实践 #### 核心知识点概览: 1. **内核模块基本概念**:内核模块是Linux内核的动态加载组件,允许开发者扩展内核功能而不需重新编译整个内核。 2. **Hello World模块**:首...
### Linux内核模块编程知识点概览 #### 一、引言 **内核模块简介** - **定义**:内核模块是一种特殊的软件组件,可以动态加载到Linux内核中,用于扩展内核的功能而不需重启整个系统。这些模块通常用于添加硬件支持...
### Linux内核模块编程概述 #### 什么是内核模块? 内核模块是可加载到Linux内核中的独立软件组件,它们允许系统管理员和开发者在不重新编译整个内核的情况下扩展或修改内核功能。模块可以动态加载和卸载,这使得...
【描述】: 描述中提到了深入理解UNIX系统内核、Linux设备驱动程序以及建立和运行Linux内核模块,这些都是与操作系统内核、设备驱动开发和内核模块编程相关的主题。 【标签】: "linux" 【内容】: 内核模块是Linux...
内核模块的编程通常使用C语言,并且需要包含特定的头文件,例如`<linux/init.h>`和`<linux/module.h>`,这些头文件提供了内核模块编程所需的函数原型和定义。例如,我们会在`init_module()`中使用`printk()`函数来...
Linux内核模块编程指南 致谢 前言 第1章 Hello, World 145 1.1 内核模块的Makefiles文件 146 1.2 多重文件内核模块 147 第2章 字符设备文件 149 第3章 /proc文件系统 158 第4章 把/proc用于输入 162 第5章 把设备...
总的来说,开发和编译内核驱动涉及的知识点包括:内核模块编程,`makefile`的编写,内核构建系统的使用,以及如何通过`dmesg`查看内核日志。理解这些概念是深入学习Linux内核和系统级编程的基础。
《Linux内核模块编程指南》是一本由Peter Jay Salzman、Michael Burian和Ori Pomerantz共同编著的专业书籍,旨在为读者提供深入理解Linux内核模块编程的知识与技能。该书版权始于2001年,并在2007年进行了更新,版本...
- 将编译好的内核模块复制到目标系统。 - 重启系统,确保`HelloWorld`模块能够在系统启动时自动加载。 #### 总结 以上步骤介绍了如何从零开始创建一个简单的`HelloWorld`内核驱动程序,并将其集成到Linux内核中...
Linux驱动和内核模块编程是Linux系统开发中的关键部分,主要涉及如何与硬件交互和扩展内核功能。本文将深入探讨这一主题,包括Linux驱动程序的基础知识、内核模块的构造和装载方法。 首先,设备驱动程序是操作系统...
##### 3.5 HelloWorld (part 4): 内核模块证书和内核模块文档说明 这部分介绍了如何为内核模块添加许可证信息和文档描述,这对于遵守开源许可证以及提高代码的可读性至关重要。 ##### 3.6 从命令行传递参数给内核...
`lkmpg-1.1.0.examples`这个压缩包很可能是《Linux内核模块编程指南》(Linux Kernel Module Programming Guide)中的示例代码集合,它为学习内核模块开发提供了丰富的实践材料。 在Linux内核模块开发中,我们需要...