`
猫太的鱼
  • 浏览: 232776 次
  • 性别: 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系统内核中单独编译、加载和卸载所需的模块的一般方法和过程。

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

    linux内核模块的编译。 1、准备内核模块源码 2、编写Makefile文件 3、编译模块 4、加载/卸载模块 5、加载模块时传递参数 6、总结

    把设备驱动程序编译进嵌入式Linux内核

    由于uClinux不支持模块动态加载,而且嵌入式Linux不能够象桌面Linux那样灵活的使用insmod/rmmod加载卸载设备驱动程序, 因而这里只介绍将设备驱动程序静态编译进uClinux内核的方法。本文以uClinux为例,介绍在一个以...

    银行家算法目六、linux模块加载或内核编译

    无,可以下载,项目五、linux系统进程间通信方式分析 设计要求: ① 分析linux系统下几种主要的进程通信手段。 ② 共享存储器的方式 ③ 共享文件的通信方式 ...项目六、linux模块加载或内核编译 设计要求:

    gtp5g:Linux内核模块5G GTP-U

    gtp5g是定制Linux内核模块gtp5g,用于处理PFCP IE(例如PDR和FAR)的数据包。 有关详细信息,请参考3GPP规范TS 29.281和TS 29.244。 注意 由于Linux内核的发展,该模块不适用于每个内核版本。 请使用内核版本5.0.0-...

    模拟器专用android kernel2.6 (支持netfilter,ko文件加载与卸载)

    可支持内核模块文件(ko文件)的加载与卸载; 同时完美支持netfilter) 2.还有个编译此内核时使用的config文件。(供各位想自己编译的人参考) 使用方法: 1.如何让android模拟器运行时使用自己编译的内核? 首先进入...

    linux设备驱动程序中英文加源码

    内核模块相比于应用程序 2.3.1. 用户空间和内核空间 2.3.2. 内核的并发 2.3.3. 当前进程 2.3.4. 几个别的细节 2.4. 编译和加载 2.4.1. 编译模块 2.4.2. 加载和卸载模块 2.4.3. 版本依赖 2.4.4. 平台依赖性 2.5. ...

    深入Linux内核网络堆栈

    本文将描述如何利用Linux 网络堆栈的窍门(不一定都是漏洞)...码段,或者静态编译进内核,或者作为一个可动态加载/卸载的可卸载模块,然后就可以注 册称之为网络事件的函数(比如数据包的接收), 1.1 本文论述的内容

    Intercept-System-Calls:使用可加载的内核模块拦截系统调用

    可加载内核模块(LKM)只是对操作系统中基本内核的扩展,可以即时加载/卸载,而无需重新编译内核或重新引导系统。 打开您选择的文本编辑器,并通过添加两个头文件开始编写一个简单的可加载内核模块: #include ...

    linux内核整理.docx

    5. 嵌入式Linux内核的基本架构,内核的裁剪和交叉编译方法, 11 6.Linux根文件系统的基本架构, 14 7.Busybox的使用方法, 17 busybox的使用 18  (1) busybox后直接跟命令,如 18  (3)创建符号链接(symbolic ...

    linux设备驱动程序(第三版)CHM和配套源码

    2.3. 内核模块相比于应用程序 2.3.1. 用户空间和内核空间 2.3.2. 内核的并发 2.3.3. 当前进程 2.3.4. 几个别的细节 2.4. 编译和加载 2.4.1. 编译模块 2.4.2. 加载和卸载模块 2.4.3. 版本依赖 2.4.4. 平台...

    嵌入式Linux中增加自己的设备驱动程序

    由于uClinux不支持模块动态加载,而且嵌入式Linux不能够象桌面Linux那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而本文只介绍将设备驱动程序静态编译进uClinux内核的方法。本文以uClinux为例,介绍在一个以...

    【华为云技术分享】Linux内核编程环境 (2)

    在上一期中,我们介绍了Linux内核编译方法,这一期我们用一个例子来介绍如何向Linux内核中增加一个模块。 一、LKM内核模块 LKM是Loadable Kernel Module的缩写,意思是可加载内核模块。它有点儿像动态链接库,可在...

    操作系统课设报告-基于块的Linux驱动程序

    1.重新编译Linux内核 2.增加一个驱动程序(使用内存模拟设备),使用模块编译方式 3.动态加载和卸载新的驱动 4.通过程序或命令行使用该驱动 5.至少实现1MB数据的保存,并且可以读取 附赠加分功能:①在块设备上建立...

    Android驱动开发权威指南

    4.4 Linux内核模块基础与骨架 4.5 Linux模块的加载与卸载 4.6 Linux模块的参数与导出符号 4.7 Linux模块的使用计数 第5章Linux文件系统 5.1 Linux文件系统概述 5.1.1 Linux文件系统的目录结构 5.1.2设备驱动与Linux...

    HID-Apple:用于 Apple 无线键盘的修改内核模块,用于交换 fn 和左 ctrl 键

    HID-苹果用于 Apple 无线键盘的经过修改的 Linux 内核模块,用于交换fn和左 ctrl并将弹出 cd键更改为delete 。加载模块您可以通过在终端中键入以下内容来加载模块: 编译新模块./build.sh 卸载当前模块sudo rmmod ...

    4412开发板学习笔记---Linux驱动的学习方法

    知识点多且杂,对于想学习驱动的同学来说,需要尽快掌握基础知识:如开发板的基本使用,硬件基础知识,开发环境的搭建,Linux常用工具,内核的编译以及烧写,Linux shell命令,C语言基础,Linux内核的简单裁减和配置...

    kmod_fstrash:Linux 内核垃圾模块的 POC

    该模块是Linux内核“移到垃圾箱”实现的POC 用法 鉴于编译模块: 使用insmod fstrash.ko加载模块 使用mkdir /.fstrash创建垃圾文件夹 ...运行find /.fstrash -iname XXX_* -mmin 5 exec rm -f {} \; 或类似的 CRON ...

    LINUX安装与配置简明手册

    10.2.15 卸载内核模块 121 10.2.16 使用config程序 122 10.2.17 使用menuconfig程序 122 10.2.18 使用xconfig程序 124 第11章 配置LAN 127 11.1 概述 127 11.1.1 计划一个LAN 127 11.1.2 网络硬件 128 11.1.3 服务 ...

Global site tag (gtag.js) - Google Analytics