Ubuntu下编译的第一个内核模块

2023-10-27

内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel ModuleLKM),我们简称为模块Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。

一、 什么是模块

模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。

 

应用程序与内核模块的比较
为了加深对内核模块的了解,表一给出应用程序与内核模块程序的比较。
表一 应用程序与内核模块程序的比较

  C语言应用程序 内核模块程序
使用函数 Libc库 内核函数
运行空间 用户空间 内核空间
运行权限 普通用户 超级用户
入口函数 main() module_init()
出口函数 exit() module_exit()
编译 Gcc –c Makefile
连接 Gcc insmod
运行 直接运行 insmod
调试 Gdb kdbug, kdb,kgdb等

从表一我们可以看出,内核模块程序不能调用libc库中的函数,它运行在内核空间,且只有超级用户可以对其运行。另外,模块程序必须通过module_init()和module-exit()函数来告诉内核“我来了”和“我走了”。

 

二、 编写一个简单的模块

模块和内核都在内核空间运行,模块编程在一定意义上说就是内核编程。因为内核版本的每次变化,其中的某些函数名也会相应地发生变化,因此模块编程与内核版本密切相关。以下例子针对Ubuntu 9.10  内核2.6.31-14-generic

 

1.程序举例

 

 


说明

所有模块都要使用头文件module.h,此文件必须包含进来。
头文件kernel.h包含了常用的内核函数。
头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。
lkp_init是模块的初始化函数,它必需包含诸如要编译的代码、初始化数据结构等内容。
使用了printk()函数,该函数是由内核定义的,功能与C库中的printf()类似,它把要打印的信息输出到终端或系统日志。
lkp_cleanup是模块的退出和清理函数。此处可以做所有终止该驱动程序时相关的清理工作。
module_init()和cleanup_exit()是模块编程中最基本也是必须的两个函数。
module_init()是驱动程序初始化的入口点。而cleanup_exit()注销由模块提供的所有功能。

2  编写Makefile 文件,与hello.c 放在同一个目录里

 

(注意makefile里面要求的tab)

 

KERNELBUILD :=/lib/modules/$(shell uname -r)/build是编译内核模块需要的Makefile的路径,Ubuntu下是

/lib/modules/2.6.31-14-generic/build

 

make -C $(KERNELBUILD) M=$(shell pwd) modules 编译内核模块。-C 将工作目录转到KERNELBUILD,调用该目录下的Makefile,并向这个Makefile传递参数M的值是$(shell pwd) modules。

 

3. 编译模块

#sudo make    (调用第一个命令default)

这时,在hello.c 所在文件夹就会有 hello.ko ,这个就是我们需要的内核模块啦

 

#sudo make clean

清理编译垃圾,hello.ko 也会清理掉。

 

4. 插入模块,让其工作。注意必须是root权限

#sudo insmod ./hello.ko
我们用dmesg 就可以看到 产生的内核信息啦,Hello world!

如果没有输出"hello from hello world",因为如果你在字符终端而不是终端模拟器下运行的话,就会输出,因为在终端模拟器下时会把内核消息输出到日志文件/var/log/kern.log中。


#sudo rmmod ./hello
再用dmesg 可以看到 Bye world!

 

 

modutils是管理内核模块的一个软件包。可以在任何获得内核源代码的地方获取Modutils(modutils-x.y.z.tar.gz)源代码,然后选择最高级别的patch.x.y.z等于或小于当前的内核版本,安装后在/sbin目录下就会有insomod、rmmod、ksyms、lsmod、modprobe等实用程序。当然,通常我们在加载Linux内核时,modutils已经被载入。
1.Insmod命令
调用insmod程序把需要插入的模块以目标代码的形式插入到内核中。在插入的时候,insmod自动调用init_module()函数运行。注意,只有超级用户才能使用这个命令,其命令格式为:
# insmod  [path] modulename.ko
2. rmmod命令
调用rmmod程序将已经插入内核的模块从内核中移出,rmmod会自动运行cleanup_module()函数,其命令格式为:
#rmmod  [path] modulename.ko
3.lsmod命令
调用lsmod程序将显示当前系统中正在使用的模块信息。实际上这个程序的功能就是读取/proc文件系统中的文件/proc/modules中的信息,其命令格式为:
#lsmod
4.ksyms命令

ksyms这个程序用来显示内核符号和模块符号表的信息。与lsmod相似,它的功能是读取/proc文件系统中的另一个文件/proc/kallsyms。

 

这就是在2.6.xx下一个最简单的模块编写过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu下编译的第一个内核模块 的相关文章

  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • 使用 terminfo 的终端颜色?

    我正在编写一个 C 类 允许在终端中使用颜色 我希望它适用于每个终端 在支持真彩色 24 位 的终端上打印 在支持它的终端上具有 256 色 6x6x6 其他都是基本的 16 种颜色 我曾经使用 termcap 编写过一次 C 函数 并且我
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • 如何从 Linux 命令行确定 LCD 显示器是否打开

    如何通过 Linux 命令行判断计算机的显示器是否打开 关闭 我传统上认为显示器是仅输出的设备 但我注意到 Gnome 显示器首选项对话框具有 检测显示器 功能 这可以推广到确定显示器是否物理关闭吗 VESA DDC 连接是I2C http
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • 描述 makefile 中的头文件位置

    在我正在开发的一个新项目中 我有以下目录结构 Project base src bin h Makefile 在我的源文件中 我包含如下内容 include h SomeHeaderFile h 而不是更正确的形式 include Some
  • 如何为 Python 2 安装 pip

    I run python version and get Python 2 7 3 I run pip version and get pip 1 5 from usr local lib python3 2 dist packages p
  • 如果目录不存在,有没有办法让 mv 创建要移动到的目录?

    因此 如果我在主目录中并且想将 foo c 移动到 bar baz foo c 但这些目录不存在 是否有某种方法可以自动创建这些目录 以便你只需要输入 mv foo c bar baz 一切都会顺利吗 似乎您可以将 mv 别名为一个简单的
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • 有没有办法只安装mysql客户端(Linux)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有不需要安装整个mysql db安装包的Linux mysql命令行工具 我想做的是从服务器 1 应用程序服务器 执行将在服务器 2
  • 为什么 RHEL 上的 bash 中 `read -t` 没有超时?

    Why read t在 RHEL5 或 RHEL6 上从管道读取时不会超时 这是我的示例 在从管道读取数据时 我的 RHEL 盒子不会超时 tail f logfile log grep something read t 3 variabl
  • 有没有办法让 Linux CLI IO 重定向持久化?

    我有多个管道命令 如下所示 find options grep options xargs grep options 它们中的每一个都可能产生我不感兴趣的错误 权限错误 文件名空格错误等 因此 我想将所有错误重定向到 dev null 我知
  • 在哪里可以找到所有 C 标准库的源代码?

    我正在寻找所有 C 标准库的完整源代码 也就是说 我正在寻找 stdio h stdlib h string h math h 等的源代码 我想看看它们是如何创建的 我认为这取决于不同的平台 但 Linux 或 Windows 都会受到欢迎
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • 警告:无法加载 sqljdbc_auth.dll 原因:java.library.path 中没有 sqljdbc_auth

    我正在使用 Ubuntu 12 05 并尝试连接到 Windows Server 2012 来获取数据库 我的数据库名称是 jobs 电脑的IP地址是192 160 1 33 托管在1433 但是当我尝试连接时出现以下错误 WARNING
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h

随机推荐

  • java mvc中重复提交表单,spring mvc 防止重复提交表单的两种方法,推荐第二种

    第一种方法 判断session中保存的token 比较麻烦 每次在提交表单时都必须传入上次的token 而且当一个页面使用ajax时 多个表单提交就会有问题 注解Token代码 package com thinkgem jeesite co
  • ubuntu安装oracle 10g

    http blog chinaunix net u1 41982 showart 340216 html 目录 1 安装准备 1 1 设置用户
  • 再见 Typescript,你好 Javascript 原生打字 ✨

    打字 不管你喜欢它还是讨厌它 它都有很多优点 更好的 DX 通过智能感知自动完成 更好的代码文档 更少的耗时错误 它的好处大大超过了它的成本 那么为什么有些人仍然避免使用它呢 一个词 打字稿 您必须对其进行设置并确保您的工具正常工作 这会给
  • SpringMVC的响应处理

    目录 一 返回值分类 1 返回字符串 2 返回void 3 返回ModelAndView对象 二 SpringMVC提供的转发和重定向 三 通过ResponseBody 响应 json 数据 1 配置不拦截静态资源 2 使用 Request
  • easyui+实现ajax分页,EasyUI的datagrid组件结合jsonp实现分页显示跨域数据

    前台页面 Untitled Page document ready function dg datagrid loader function param success error var rows 30 var beginIndex 0
  • HTML——设置滚动文字

    滚动文字标签 marquee 使用标签可以将文字设置为动态滚动的效果 语法格式
  • Javase基础思维导图

    大家好 我是努力奋斗的小程序猿 时隔几个月终于下定决心写博客 最近我把javaweb快学完了 javase的基础也正在同步二刷 我相信不止我一个人对javase的一部分内容遗忘了 反射 io流 网络编程 在我二刷的期间 我每刷完一个板块就会
  • Linux 安装maven两种方式(使用yum或手动安装)

    使用yum自动安装 yum install maven y 如果是Ubuntu apt install maven y 手动安装 下载maven wget https archive apache org dist maven maven
  • Unity3d的NavMesh信息导出与服务器端(KBEngine)的使用(二)

    前言 上篇已经讲述了Unity3d的客户端NavMesh导航信息的导出 现在一起看下怎么在服务器使用 因为我们使用的服务器引擎是KBEngine 以此为例 1 将生成的srv xinshuocun文件放到服务器的资源目录下 确保在cell
  • A a = new A();

    JAVA new class A int i class Test public static void main String args A a
  • java agent简介

    1 什么是 Java Agent 笼统地来讲 Java Agent 是一个统称 该功能是 Java 虚拟机提供的一整套后门 通过这套后门可以对虚拟机方方面面进行监控与分析 甚至干预虚拟机的运行 Java Agent 又叫做 Java 探针
  • 浅谈前端水印

    又是一个有关安全的问题 一般情况下 我们说的水印是指图片角落上的平台用户名水印 类似于下方图片上的这种 通常只要将图片上传到平台上 平台就会在图片上嵌入水印 当然 有些平台也会提供设置是否需要显示这种水印的开关 或者设置保存的时候才会加上水
  • 放个手机在单位自动打卡_打卡助手——移动考勤 so easy

    考勤与员工的工作息息相关 公司每天都要记录员工的考勤 近些年 企业考勤存在四大怪象 接下来一起看看是什么现象呢 01 替打卡现象 小李 我要迟到了 麻烦替我打卡啊 我稍后就到 这是采用传统打卡方式经常遇到的问题 02 排队打卡现象 企业考勤
  • atod, atoi,atoboo,atoint64源码实现

    atoint 字符串转int32 int atoint const char nptr int c current char int total current total int sign if then negative otherwi
  • DateUtil工具类,解决时间格式问题

    DateUtil工具类 解决常见的日期格式转换问题 日期格式转换 public static final String format yyyy MM dd HH mm ss 时间格式 yyyy MM dd public final stat
  • OJ-数组形式的整数加法

    题目含义举例 Note The returned array must be malloced assume caller calls free int addToArrayForm int num int numSize int k in
  • 最新的SpringCloud(H版&Alibaba)技术(17-18高级部分,服务注册和配置中心【Nacos】)

    文章目录 十七 SpringCloud Alibaba入门简介 Netflix进入维护模式 Spring Alibaba简介 十八 SpringCloud Alibaba Nacos服务注册和配置中心 安装并运行nacos Nacos作为服
  • 用户相似度计算-协同过滤

    协同过滤中用户距离计算 构建共同的评分向量 def build xy user id1 user id2 bool array df loc user id1 notnull df loc user id2 notnull return d
  • 在VC中创建DLL文件的方法步骤

    一 Win32动态链接库 1 制作的步骤 1 新建WIN32 Dynamic link Library工程 工程名为MyDll 选择A simple DLL project类型 2 MyDll h的内容如下 以下是引用片段 extern C
  • Ubuntu下编译的第一个内核模块

    内核模块是Linux内核向外部提供的一个插口 其全称为动态可加载内核模块 Loadable Kernel Module LKM 我们简称为模块 Linux内核之所以提供模块机制 是因为它本身是一个单内核 monolithic kernel