`
猫太的鱼
  • 浏览: 239245 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux内核模块编译、加载&卸载及查看运行结果

阅读更多
这里我仅使用了最简单的代码HelloWorld


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

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_EMERG "Hello World enter!\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_EMERG "Hello world exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);


//MODULE_AUTHOR("stone.shi");
//MODULE_DESCRIPTION("This is an example of programming driver!");
//MODULE_ALIAS("a simplest module”);

==============================================
[Makefile文件内容]
obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD ?= $(shell pwd)
defalult:
make -C ${KERNELDIR} M=${PWD} modules
install:
insmod hello.ko
uninstall:
rmmod hello.ko
clear:
make -C ${KERNELDIR} M=${PWD} clean

****说明:
-C选项指定内核头文件的路径,所以如果这里不正确的话,就得仔细检查你的目录是不是正确。build只是一个符号链接,一般它指定的正是你的源码所在的目录,如果有的话。如果它不能正确链接,那么可能是你的源码并未安装或者安装的版本与当前正在工作的内核不对应。这时你就需要安装正确的与当前内核匹配的源码。

注意,Makefile的命令行要以TABLE开头,依赖条件顶格

==============================================
[编译]
好了,这时已经有两个文件了,hello.c和Makefile,随便找个目录放下,shell到这目录,输入#make:
MODPOST 1 modules
看到这个的话说明编译通过了,生成正确的内核模块文件hello.ko
===============================================
[加载]
执行#insmod hello.ko
[卸载]
#rmmod hellomod
[查看内核输出]
#tail /var/log/messages
这时就可以看到内核模块在加载和卸载时输出的信息了。
================================================



相关调试信息:

[root@localhost drivertest]# make
make -C /lib/modules/2.6.23.1-42.fc8/build  M=/home/stone/drivertest modules
make[1]: Entering directory `/usr/src/kernels/2.6.23.1-42.fc8-i686'
  CC [M]  /home/stone/drivertest/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "struct_module" [/home/stone/drivertest/hello.ko] undefined!
  CC      /home/stone/drivertest/hello.mod.o
  LD [M]  /home/stone/drivertest/hello.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.23.1-42.fc8-i686'
[root@localhost drivertest]# ls
hello.c   hello.ko     hello.mod.o  helloworld  Makefile~       myproject1-0.9.10
hello.c~  hello.mod.c  hello.o      Makefile    Module.symvers
[root@localhost drivertest]# insmod hello.ko
[root@localhost drivertest]#
Message from syslogd@localhost at Feb 17 19:50:45 ...
kernel: Hello World enter!

[root@localhost drivertest]# rmmod hello
[root@localhost drivertest]#
Message from syslogd@localhost at Feb 17 19:51:43 ...
kernel: Hello world exit!

[root@localhost drivertest]# vi hello.c
[root@localhost drivertest]# tail /var/log/messages
Feb 17 19:33:21 localhost gconfd (root-1949): 地址“xml:readonly:/etc/gconf/gconf.xml.mandatory”解析为位于 0 的只读配置源
Feb 17 19:33:21 localhost gconfd (root-1949): 地址“xml:readwrite:/root/.gconf”解析为位于 1 的可写入配置源
Feb 17 19:33:21 localhost gconfd (root-1949): 地址“xml:readonly:/etc/gconf/gconf.xml.defaults”解析为位于 2 的只读配置源
Feb 17 19:33:26 localhost pulseaudio[1965]: main.c: This program is not intended to be run as root (unless --system is specified).
Feb 17 19:33:26 localhost pulseaudio[1965]: pid.c: Daemon already running.
Feb 17 19:33:26 localhost pulseaudio[1965]: main.c: pa_pid_file_create() failed.
Feb 17 19:33:33 localhost gconfd (root-1949): 地址“xml:readwrite:/root/.gconf”解析为位于 0 的可写入配置源
Feb 17 19:34:11 localhost yum-updatesd-helper: error getting update info: Cannot retrieve repository metadata (repomd.xml) for repository: fedora. Please verify its path and try again
Feb 17 19:50:45 localhost kernel: Hello World enter!
Feb 17 19:51:43 localhost kernel: Hello world exit!
分享到:
评论

相关推荐

    linux内核模块的编译详解(有图)

    编译 Linux 内核模块需要准备好内核模块源码、编写 Makefile 文件、编译模块、加载/卸载模块等步骤。 1. 准备内核模块源码 在编译 Linux 内核模块之前,需要准备好内核模块源码。源码文件通常以 `.c` 结尾,例如 `...

    Linux内核模块编译及加载

    通过本实验,使学生掌握在Linux系统内核中单独编译、加载和卸载所需的模块的一般方法和过程。

    linux内核模块编译方法

    ### Linux内核模块编译方法 #### 概述 在Linux操作系统中,内核作为操作系统的核心部分,负责管理和调度硬件资源、提供系统调用接口等关键功能。为了满足不同的应用场景需求,用户通常需要对内核进行扩展或定制,...

    Linux实验模块加载和卸载及内存管理

    本文将深入探讨Linux内核模块加载、卸载以及内存管理的知识点。 首先,内核模块(Loadable Kernel Module,LKM)是Linux内核功能的一种动态扩展方式。它们是未链接的目标代码,不能单独运行,但可以通过`insmod`...

    嵌入式Linux内核模块的配置与编译.pdf

    嵌入式Linux内核模块的配置与编译是嵌入式开发中的重要环节,随着Linux在嵌入式领域的广泛应用,掌握这一技能对于开发者至关重要。内核模块是一种可以在操作系统需要时动态加载和执行的代码,它们扩展了内核功能,而...

    LInux内核模块开发

    Linux内核模块开发是指在Linux操作系统中开发和编译内核模块的过程。内核模块是一种特殊的程序,它可以被加载到Linux内核中,以提供新的功能或扩展现有的功能。本文将详细介绍Linux内核模块开发的基本概念、开发步骤...

    Linux内核模块与_proc文件系统.pdf

    Linux 内核模块是 Linux 操作系统中的一种关键机制,它允许用户动态地修改内核、加载自己编写的程序,而不需要每次都编译内核。这种机制极大地改善了 Linux 的灵活性。 Linux 内核模块可以分为静态可加载模块和动态...

    Linux编程之内核模块编程.pdf

    首先,Linux内核模块(LKM)是一种可动态加载和卸载的内核代码片段,它们提供了扩展Linux内核的机制。这种模块通常用于支持特定的硬件设备驱动或者特定的文件系统等。使用内核模块的优点很多,主要包括动态加载不...

    LINUX内核模块编程

    Linux内核模块(Kernel Module)是动态加载到内核空间的一段代码,它可以在需要时加载,不需要时卸载,以实现对硬件设备驱动、文件系统或其他特定功能的支持。这使得系统能够根据实际需求调整内核的功能集,降低了...

    linux内核模块设计实验

    本实验主要关注Linux内核模块的设计和使用,这对于深入理解和定制Linux内核至关重要。 首先,现代Linux内核采用的是混合内核架构,结合了微内核和宏内核的优点。内核模块机制的引入解决了内核过于庞大的问题,通过...

    Linux内核模块开发指南

    Linux内核模块是Linux操作系统中一个重要的组成部分,它们允许开发者在不重新编译整个内核的情况下,添加、修改或删除内核功能。本指南将深入探讨Linux内核模块的开发流程,涵盖从基础概念到高级技术,帮助你成为一...

    linux内核模块编程

    Linux内核模块编程是深入Linux操作系统核心的一种编程实践,它允许开发者动态地向内核添加代码(模块),而无需重新编译整个内核。这种机制极大地提高了系统的可扩展性和灵活性,使得增加、更新或删除特定功能成为...

    linux内核模块分析

    本篇文章将深入探讨Linux内核模块的开发,以及内核驱动的编写。 首先,我们来理解一下内核模块的基本概念。内核模块是Linux内核的一部分,但它们不被包含在编译好的内核镜像中。当需要使用某个功能或驱动时,可以...

    Linux 2.6内核的编译步骤及模块的动态加载

    Linux内核支持模块的动态加载,允许在运行时添加或删除内核功能,而不必重新编译和安装整个内核。以下是一个简单的模块加载示例: 1. **编写模块代码**: - 创建一个C文件,如`hello.c`,包含必要的头文件和初始化...

    linux 内核模块调用实例

    在Linux操作系统中,内核模块(Kernel Module)是一种动态加载和卸载的代码段,用于扩展内核功能。本教程将通过一个实际的内核模块调用实例,深入讲解如何编写、编译以及理解内核模块的工作原理。这对于开发Linux...

    Linux内核按需动态装载和卸掉模块

    Linux内核的动态加载和卸载模块特性是其灵活性和可扩展性的重要体现。Linux作为一个单内核操作系统,它的所有组件都可以直接访问共享的数据结构和函数,与多核结构相比,单内核在添加新功能时,传统的做法是重新编译...

    嵌入式Linux内核模块的配置与编译.docx

    ### 嵌入式Linux内核模块的配置与编译 #### 一、概述 随着Linux操作系统的广泛应用和发展,特别是其在嵌入式领域的迅速普及,越来越多的技术人员和爱好者投身于这一领域。对于想要深入研究Linux内核及其相关组件的...

    Linux内核模块介绍 PPT版

    `Linux内核模块介绍.ppt`很可能是对这些概念的详细讲解,可能包含模块的编写、编译、加载和卸载方法。通常,开发者会使用`insmod`、`rmmod`或`modprobe`命令来管理内核模块。 `jb51.net.txt`可能是一个与技术相关的...

    Linux内核模块实例

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

Global site tag (gtag.js) - Google Analytics