`
haoningabc
  • 浏览: 1465629 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个内核模块的helloworld

阅读更多
helloworld.c
#include <linux/kernel.h>
#include <linux/module.h>
static int __init helloworld_init(void)
{
    printk("<0>""helloworld!\n");
    return 0;
}
static void __exit helloworld_exit(void)
{
    printk("<0>""byebye!\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("haoning");

Makefile
ifneq ($(KERNELRELEASE),)

obj-m := helloworld.o
else

PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
                $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
                rm -rf *.cmd *.o *.mod.c *.ko *.mod.o *.ko.unsigned  modules.order  Module.symvers
endif



make
[root@mytest kernel]# make
make -C /lib/modules/2.6.32-431.11.2.el6.x86_64/build M=/data/haoning/kernel modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-431.11.2.el6.x86_64'
  CC [M]  /data/haoning/kernel/helloworld.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /data/haoning/kernel/helloworld.mod.o
  LD [M]  /data/haoning/kernel/helloworld.ko.unsigned
  NO SIGN [M] /data/haoning/kernel/helloworld.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-431.11.2.el6.x86_64'
[root@mytest kernel]# 


[root@mytest kernel]# ls
helloworld.c  helloworld.ko  helloworld.ko.unsigned  helloworld.mod.c  helloworld.mod.o  helloworld.o  Makefile  modules.order  Module.symvers
[root@mytest kernel]# 

[root@mytest kernel]# insmod helloworld.ko
[root@mytest kernel]# 
Message from syslogd@mytest at Jun  4 19:30:47 ...
 kernel:helloworld!

[root@mytest kernel]# rmmod helloworld.ko

Message from syslogd@mytest at Jun  4 19:31:02 ...
 kernel:byebye!
[root@mytest kernel]# 


tailf /var/log/messages
查看日志

obj-m   意思是将后面跟的东西编译成内核模块。相对应还有:
obj-y    编译进内核
obj-n   不编译

hello.o            为模块名称
hello.o-objs    为模块依赖的文件名
KID 指定了内核源码的路径
PWD
为当前路径
-C                  选项的作用是指将当前工作目录转移到你所指定的位置。
“M=”            
选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,
                      需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,
                      将其编译,生成KO文件
分享到:
评论

相关推荐

    linux-2.4内核模块 helloworld

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

    LINUX内核模块编程

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

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

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

    08 内核模块Hello1

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

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

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

    linux内核驱动模块模板之hello

    关于多文件编译,当一个内核模块包含多个源文件时,我们需要一个Makefile来组织编译过程。一个基本的Makefile模板可能如下: ```makefile obj-m += hello.o KERNEL_DIR ?= /lib/modules/$(shell uname -r)/build ...

    linux内核模块编程

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

    ubuntu12.04编译内核模块

    这个 C 文件定义了一个简单的内核模块,包含一个 init 函数和一个 exit 函数。init 函数将在模块加载时调用,exit 函数将在模块卸载时调用。 三、编写 Makefile 文件 创建一个名为 Makefile 的文件,内容如下: `...

    HelloWorld程序编写及内核驱动

    本教程旨在通过创建一个简单的`HelloWorld`驱动程序来介绍如何将其编入Linux内核并在系统启动时加载,进而实现打印“Hello World”的功能。这不仅有助于理解驱动程序的基本结构,还能够为学习更复杂的内核编程打下...

    Windows x64内核模块-HelloWorld

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

    Linux内核模块实例

    Linux内核模块是Linux操作系统中一个重要的组成部分,它允许用户在不重新编译整个内核的情况下,添加、修改或删除内核功能。这对于系统管理员和开发者来说是非常实用的,因为可以动态地扩展内核功能,而不需要每次...

    linux 内核模块调用实例

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

    linux内核模块设计实验

    内核模块本身是一个未链接的目标文件,它们在被加载到内核后成为内核的一部分,并能访问内核的公共符号。 加载内核模块的过程通常由内核模块管理守护进程kmod控制,它调用modprobe来查找和加载必要的模块。modprobe...

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

    2. **创建源代码文件**:创建一个C语言源代码文件,例如`helloworld.c`。在这个文件中,我们将编写基本的“Hello, World!”输出功能。 ```c #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR...

    linux 内核模块

    2. **内核模块链接**:当一个模块需要使用另一个模块提供的功能时,它可以通过查找导出的符号来链接。`modprobe`命令在加载模块时会自动处理符号解析。 3. **限制导出**:为了维护内核的稳定性和安全性,有些导出...

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

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

    linux 第一个HelloWorld驱动带测试源码.rar

    "linux 第一个HelloWorld驱动带测试源码.rar" 提供了一个简单的入门级示例,帮助初学者熟悉Linux内核驱动的开发过程。这个压缩包包含了创建、编译和测试一个基本驱动程序的所有必要文件。 首先,"HelloWorld"驱动...

    Linux 2.6内核模块编程范例

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

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

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

Global site tag (gtag.js) - Google Analytics