Linnx提供了非常丰富的网络,IO等内核API,可以很方便开发驱动模块。典型的应用程序有一个main函数,内核模块只需要一个初始化,退出函数。下面看下第一个hello world内核模块。
一. 准备环境
#uname -a 2.6.32-431.el6.x86_64 #yum -y install kernel-devel.x86_64 #开发内核必须安装对应的内核源码
二. 编码
// hello.c #include <linux/module.h> #include <linux/init.h> static int __init helloworld_init(void) { printk(KERN_ALERT "Hello world module init\n"); return 0; } static void __exit helloworld_exit(void) { printk(KERN_ALERT "Hello world module exit\n"); } module_init(helloworld_init); // 模块初始化 module_exit(helloworld_exit); // 模块退出 MODULE_LICENSE("GPL"); // 版权 MODULE_AUTHOR("kettas"); // 作者 MODULE_DESCRIPTION("Hello world Demo"); // 描述 MODULE_VERSION("1.0.1"); // 版本 MODULE_ALIAS("hello 01"); // 别名
注:内核模块为纯C代码,对代码格式要求严格,1.变量声明必须放在函数第一行,否则报ISO C90 不允许混合使用声明和代码警告。2. 无参函数声明参数要加上void,否则报函数声明不是一个原型的警告
三. 编译
#hello.ko obj-m += hello.o #指定编译模块名称,会自动寻找hello.c CURRENT_PATH:=$(shell pwd) LINUX_KERNEL:=$(shell uname -r) LINUX_KERNEL_PATH:=/usr/src/kernels/2.6.32-431.el6.x86_64/ #内核源码目录 all: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #C进入内核目录读取Makefile,M表明后回到当前目录读取Makefile clean: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
四. 运行
#modinfo helloworld.ko #查看内核模块信息 filename: hello.ko alias: Example 01 version: 1.0.1 description: Hello world Demo author: kettas license: Dual BSD/GPL srcversion: 478008C1F7974ACC15407DB depends: vermagic: 2.6.32-431.el6.x86_64 SMP mod_unload modversions #sudo inmsmod helloworld.ko #安装helloworld内核模块,此时控制台没有打印hello world #dmesg #printk日志信息会写入内核环形缓冲区内,运行dmesg可查看 hello world module init hello world module exit
相关推荐
根据提供的文件信息,本文将详细介绍如何在Linux 2.4内核环境下编写、编译、加载及卸载一个名为“helloworld”的内核模块。通过本教程的学习,读者可以掌握基本的内核模块开发流程。 ### 一、环境准备 #### 1.1 ...
接下来,我们创建一个简单的内核模块,名为“helloworld”。这个模块的主要目标是在系统日志中打印出“Hello, World!”的信息。首先,我们需要创建一个C源文件,比如`helloworld.c`,并在其中写入以下代码: ```c #...
Windows内核安全与驱动开发书的第一个示例程序,在新版本开发环境中调试通过,使用Visual Studio 2017加上WDK 1803环境编译。在调试过程中,由于x64驱动程序禁止使用嵌入汇编,采用Shellcode方式进行软件中断调用,...
内核模块的编程通常使用C语言,并且需要包含特定的头文件,例如`<linux/init.h>`和`<linux/module.h>`,这些头文件提供了内核模块编程所需的函数原型和定义。例如,我们会在`init_module()`中使用`printk()`函数来...
【标题】: "08 内核模块Hello1" 涉及的知识点 【描述】: 描述中提到了深入理解UNIX系统内核、Linux设备驱动程序以及建立和运行Linux内核模块,这些都是与操作系统内核、设备驱动开发和内核模块编程相关的主题。 ...
Linux内核模块编程是Linux系统开发中的一个重要环节,它允许开发者在不重新编译整个操作系统内核的情况下,添加、修改或删除内核功能。这种方式极大地提高了系统的灵活性和可扩展性。下面将详细介绍Linux内核模块的...
二、编写 Hello World 内核模块 创建一个名为 hello.c 的文件,内容如下: ```c #include #include static int hello_init(void) { printk(KERN_INFO "Hello World enter\n"); return 0; } static void ...
Linux驱动开发之编写第一个内核模块--Hello World源码, 亲测OK,对应文章链接: https://dingdong.blog.csdn.net/article/details/106329048
- 将编译好的内核模块复制到目标系统。 - 重启系统,确保`HelloWorld`模块能够在系统启动时自动加载。 #### 总结 以上步骤介绍了如何从零开始创建一个简单的`HelloWorld`内核驱动程序,并将其集成到Linux内核中...
### HelloWorld 示例 一个典型的“Hello World”级别的内核模块示例涉及编写一个最简单的内核模块,它在加载时通过模块的初始化函数打印一条消息,并在卸载时再次打印一条消息。这个过程演示了模块的加载和卸载,是...
例如,我们创建一个名为`hello_world.c`的内核模块,代码如下: ```c #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple kernel module example")...
这些示例通常涵盖了从简单到复杂的各种场景,比如基本的“Hello, World!”模块,到复杂的设备驱动和中断处理。通过研究和运行这些示例,开发者可以更好地掌握Linux内核模块的编写技巧,为后续的内核开发打下坚实的...
对于初学者,从编写简单的“Hello World”模块开始,逐步理解内核模块的生命周期和工作原理。通过实践,不仅可以掌握内核模块的基本概念,还能深入理解Linux内核的内部工作机制,这对于Linux系统管理员和内核开发者...
Linux内核模块是Linux操作系统内核可动态加载和卸载的部分,它们允许用户根据需要扩展内核的功能,而无需重新编译整个内核。在Linux系统中,内核模块主要用于设备驱动程序,网络协议,文件系统等。了解如何编写、...
接下来编写一个简单的“Hello World”内核模块。使用文本编辑器(如vi)创建名为`hello.c`的C语言源文件,并将以下代码复制进去: ```c #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("DAVID"); ...
"Hello World"内核驱动程序是一个简单的起点,它可以帮助初学者熟悉内核模块的构建过程。这里我们将深入探讨如何在Ubuntu 14.04上创建并编译一个"Hello World"内核驱动,以及涉及到的关键文件。 首先,`hello.c`是...
**2.1 HelloWorld(第1部分):创建基本的内核模块** 在这个阶段,我们的目标是创建一个最基本的内核模块,它能够在加载时打印一条消息。我们将使用`printk()`函数来输出这条信息。 ```c #include #include ...
"Linux 2.6内核模块编程范例"是针对这一主题的教程,它包括一个基本的"Hello, World!"程序以及一个标准的Makefile模板,帮助开发者了解如何编写和构建内核模块。 首先,我们来看"Hello, World!"程序,Exhello.c。这...
然后在终端中运行`make`,这将生成`helloworld.ko`的内核模块。 4. **加载模块**:使用`insmod`命令将模块加载到内核中。你可以通过`dmesg`查看模块的输出。 5. **卸载模块**:使用`rmmod`命令移除模块。 6. **...
#### 三、Hello World示例 ##### 3.1 最简单的内核模块 - **代码框架**:最简单的内核模块包含两个函数:一个用于初始化模块,另一个用于清理模块。 - **打印消息**:通过`printk()`函数向内核日志中输出信息。 - **...