`
tcspecial
  • 浏览: 918171 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

内核模块之hello world

阅读更多

  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

    根据提供的文件信息,本文将详细介绍如何在Linux 2.4内核环境下编写、编译、加载及卸载一个名为“helloworld”的内核模块。通过本教程的学习,读者可以掌握基本的内核模块开发流程。 ### 一、环境准备 #### 1.1 ...

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

    接下来,我们创建一个简单的内核模块,名为“helloworld”。这个模块的主要目标是在系统日志中打印出“Hello, World!”的信息。首先,我们需要创建一个C源文件,比如`helloworld.c`,并在其中写入以下代码: ```c #...

    Windows x64内核模块-HelloWorld

    Windows内核安全与驱动开发书的第一个示例程序,在新版本开发环境中调试通过,使用Visual Studio 2017加上WDK 1803环境编译。在调试过程中,由于x64驱动程序禁止使用嵌入汇编,采用Shellcode方式进行软件中断调用,...

    linux内核驱动模块模板之hello

    内核模块的编程通常使用C语言,并且需要包含特定的头文件,例如`&lt;linux/init.h&gt;`和`&lt;linux/module.h&gt;`,这些头文件提供了内核模块编程所需的函数原型和定义。例如,我们会在`init_module()`中使用`printk()`函数来...

    08 内核模块Hello1

    【标题】: "08 内核模块Hello1" 涉及的知识点 【描述】: 描述中提到了深入理解UNIX系统内核、Linux设备驱动程序以及建立和运行Linux内核模块,这些都是与操作系统内核、设备驱动开发和内核模块编程相关的主题。 ...

    LINUX内核模块编程

    Linux内核模块编程是Linux系统开发中的一个重要环节,它允许开发者在不重新编译整个操作系统内核的情况下,添加、修改或删除内核功能。这种方式极大地提高了系统的灵活性和可扩展性。下面将详细介绍Linux内核模块的...

    ubuntu12.04编译内核模块

    二、编写 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源码

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

    HelloWorld程序编写及内核驱动

    - 将编译好的内核模块复制到目标系统。 - 重启系统,确保`HelloWorld`模块能够在系统启动时自动加载。 #### 总结 以上步骤介绍了如何从零开始创建一个简单的`HelloWorld`内核驱动程序,并将其集成到Linux内核中...

    linux内核模块编程

    ### HelloWorld 示例 一个典型的“Hello World”级别的内核模块示例涉及编写一个最简单的内核模块,它在加载时通过模块的初始化函数打印一条消息,并在卸载时再次打印一条消息。这个过程演示了模块的加载和卸载,是...

    linux 内核模块调用实例

    例如,我们创建一个名为`hello_world.c`的内核模块,代码如下: ```c #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple kernel module example")...

    Linux内核模块实例

    这些示例通常涵盖了从简单到复杂的各种场景,比如基本的“Hello, World!”模块,到复杂的设备驱动和中断处理。通过研究和运行这些示例,开发者可以更好地掌握Linux内核模块的编写技巧,为后续的内核开发打下坚实的...

    linux内核模块设计实验

    对于初学者,从编写简单的“Hello World”模块开始,逐步理解内核模块的生命周期和工作原理。通过实践,不仅可以掌握内核模块的基本概念,还能深入理解Linux内核的内部工作机制,这对于Linux系统管理员和内核开发者...

    linux 内核模块

    Linux内核模块是Linux操作系统内核可动态加载和卸载的部分,它们允许用户根据需要扩展内核的功能,而无需重新编译整个内核。在Linux系统中,内核模块主要用于设备驱动程序,网络协议,文件系统等。了解如何编写、...

    内核模块编写,初学者必备

    接下来编写一个简单的“Hello World”内核模块。使用文本编辑器(如vi)创建名为`hello.c`的C语言源文件,并将以下代码复制进去: ```c #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("DAVID"); ...

    UBUNTU14.04下helloworld内核驱动源文件与makefile

    "Hello World"内核驱动程序是一个简单的起点,它可以帮助初学者熟悉内核模块的构建过程。这里我们将深入探讨如何在Ubuntu 14.04上创建并编译一个"Hello World"内核驱动,以及涉及到的关键文件。 首先,`hello.c`是...

    Linux内核模块的编写

    **2.1 HelloWorld(第1部分):创建基本的内核模块** 在这个阶段,我们的目标是创建一个最基本的内核模块,它能够在加载时打印一条消息。我们将使用`printk()`函数来输出这条信息。 ```c #include #include ...

    Linux 2.6内核模块编程范例

    "Linux 2.6内核模块编程范例"是针对这一主题的教程,它包括一个基本的"Hello, World!"程序以及一个标准的Makefile模板,帮助开发者了解如何编写和构建内核模块。 首先,我们来看"Hello, World!"程序,Exhello.c。这...

    学习内核的肯定要些第一个程序helloworld

    然后在终端中运行`make`,这将生成`helloworld.ko`的内核模块。 4. **加载模块**:使用`insmod`命令将模块加载到内核中。你可以通过`dmesg`查看模块的输出。 5. **卸载模块**:使用`rmmod`命令移除模块。 6. **...

    linux内核模块编程,基于2.6内核,中文版

    #### 三、Hello World示例 ##### 3.1 最简单的内核模块 - **代码框架**:最简单的内核模块包含两个函数:一个用于初始化模块,另一个用于清理模块。 - **打印消息**:通过`printk()`函数向内核日志中输出信息。 - **...

Global site tag (gtag.js) - Google Analytics