2.6内核模块的编写框架和编译方法

Linux内核模块的编写方法和技巧 内核模块可以在不重新编译内核的情况下添加到内核代码中运行,其可以动态加载和卸载,因此可以根据需要将内核某些功能独立出来作为模块,而不是编译到内核中,这样可以减少内核大小,并且可以按照实际需求选择裁剪或添加某些内核功能。 1. 编写一个内核模块 需要先强调一个最基本的知识,内核模块是要运行在内核态的代码,所以编写内核模块需要包含的头文件都是内核中的头文件,使用的函数都是内核的函数。 编写一 阅读详情
作者:不详
来源:http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=114089
摘要: 2.6内核有很多地方与2.4内核不同,这里就介绍了2.6内核中内核模块的编写框架和编译方法.


前一阵子在ml上升级了内核2.6.11.7,感觉速度还可以,这次和大家分享下关于
内核模块的编写过程。如果你想深入系统内部,自己写点东西看看内核是很有
意思的。

2.6内核的模块无论是编写框架还是编译方法都和2.4版有了很大不同,网络上有很多
关于这个问题的文章,但是大多没有对一些细节问题说清楚,导致了编译hello world
级的模块都会出问题,这对于刚刚开始学习内核模块编程的朋友来说是非常不好的,
下面我就来说一下整个框架的编写和编译方法,目的就是能够作出一个可以看到结果
模块。

说明
在你进行任何具体的编程前,你应该看看你自己源代码目录树中 Documentation / kbuild
中的几篇文章,对你编程大有益处的。当然如果你不愿意看,就凑合看我说的吧。:D

使用模块进行编程最大的好处就是可以和内核有个亲密接触,对于所有的内核变量和CPU
特权指令都可以在模块中使用,这里的例子是根据<<Linux Device Driver 3nd Edition>>
中的helloworld改写的,功能包括current符号和%cr3寄存器的读取,这些在Ring3下都是
不可能的。

程序框架

代码:
#include <linux/init.h>
#include <linux/sched.h>    /*为了引用current而加入的头文件*/
#include <linux/module.h>

MODULE_LICENSE("GPL");   /*这行用于告诉内核该模块拥有free license,在2.6中这是必须的*/

/*执行真正的初始化工作*/
static int hello_init(void) {
   unsigned int cr3;
   __asm__ ("movl %%cr3, %0":"=a"(cr3));
   printk(KERN_ALERT "Hello, world/n");
   printk(KERN_ALERT "The process is /"%s/" (pid %i)/n", current->comm, current->pid);
   printk(KERN_ALERT "The cr3 register is /"0x%08X/"/n", cr3);
   return 0;
}

/*执行真正的析构工作*/
static void hello_exit(void) {
   printk(KERN_ALERT "Goodbye, cruel world/n");
}

/*该函数注册模块的构造函数*/
module_init(hello_init);
/*该函数注册模块的析构函数*/
module_exit(hello_exit);


编译模块
值得说明的是,编译模块的make file的文件名必须是Makefile,而不能是makefile

Makefile的代码
代码:
ifneq ($(KERNELRELEASE),)
   obj-m := helloworld.o
else
   KERNELDIR ?= /lib/modules/$(shell uname -r)/build
   PWD := $(shell pwd)
default:
   $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif


关于GNU make工具扩展的说明
在上面的Makefile中使用了
obj-m := 这个赋值语句的含义说明要使用目标文件helloworld.o建立一个模块,最后生成
的模块的名字就是helloworld.ko,如果你有一个名为module.ko的模块依赖于两个文件
file1.o和file2.o,那么我们可以使用module-obj扩展,如下所示
obj-m := module.o
module-objs := file1.o file2.o

编译模块
只要在helloword.c所在目录执行make就好了,在编译完成后,用root身份输入/sbin/init 3
进入text mode

测试
输入 insmod ./helloworld.ko 应该能看到三行信息
输入 rmmod ./helloworld.ko 看到goodbye...

至于2.6和2.4内核模块的区别,网上的文章很多,就不在多说了。另外,关于模块,还有一些
平台相关和版本依赖的问题。小弟我目前正在学习字符设备的驱动程序,等有所心得的时候,
一起和大家分享。
编写一个简单的内核模块 #include #include #include static int __init lkp_init(void) { printk(KERN_EMERG"Hello,Kernel!\n"); printk(KERN_ALERT"Hello,Kernel!\n"); printk(KERN_CRIT"Hello,Kernel!\n"); printk(KE 阅读详情

相关推荐

linux编写一个简单的内核模块

编写一个简单的内核模块 (一)实验目的 Linux 操作系统的内核是单一体系结构(monolithic kernel)的,也就是说,整个内核是一个单独的非常大的程序。这样,系统的速度和性能都很好,但是可扩展性和维护性就相对比较差。为了弥补单一体系结构的这种缺陷,Linux操作系统使用了一种全新的机制-模块机制,用户可以根据需要,在不需要对内核重新编译的情况下,模块能动态地载入内核或从内核移出。 本...

qq_41032508的博客 5527

Linux内核编译框架

(2)menuconfig中间的选择区中有很多个选择项,每个选择项对应.config文件中的一个配置项,每一个选择项都可以被选择和配置操作,选择区中的每一项都是有子目录的,将光标放在选择项上按Enter键可以进入子目录(子目录可能还会有子目录)。那么这么是怎么实现的?(3).config文件是linux内核在编译过程中很重要的一个文件,其作用类似与uboot中的include/configs/x210_sd.h,内核在编译过程中会读取.config中的配置项,并且用这些配置项去指导整个编译链接过程。

生活需要深度 1289

内核模块编写,编译,加载和卸载过程

1.编写hello.c内核模块 <!-- @page {margin:2cm} p {margin-bottom:0.21cm} a:link {} --> //hello.c #include #include staticint hello_init(void){ printk(KERN_INFO"hello world enter\n");

无为而无不为 2257

Linux内核编译框架,Linux内核的编译

编译内核解压 Linux 内核文件包:1tar -xzvf linux-5.4.5.tar.gz编译最小文件系统:解压 busybox,进入目录并编译:12345tar -jxvf busybox-1.28.4.tar.bz2cdbusybox-1.28.4exportARCH=armexportCROSS_COMPILE=arm-linux-gnueabi-make menuconfig以上内容...

weixin_34626306的博客 524

内核模块的基本编写以及Makefile的编写

前面讲了内核模块怎么安装和卸载,那么现在就正式讲解一下内核模块怎么编写。 以一个在内核中打印出”hello world”到终端的例子讲解。 1、  首先要写模块加载时的入口函数和模块卸载时的入口函数 static  int  hello_init() {            printk(“hello  world\n”);            return 0; }   s

yangboyuan的专栏 9401

WSL2 编译安装Linux内核模块

WSL2 编译安装Linux内核模块

一些C++相关的技术笔记或者教程. 2429

内核体系结构和编译体系分析

1、Linux操作系统体系结构 (1)操作系统可以分为两个层次:内核空间和用户空间。内核和用户空间使用不同的保护地址空间,内核不能将用户空间传递的地址进行直接的操作,需要先转换; (2)系统调用:内核空间管理设备资源,应用程序通过内核提供的内核调用接口来申请资源; (3)频繁的系统调用会影响操作系统性能,于是标准C库(glibc)对内核的系统调用进行了封装,glibc最终也是通过系统调用访问内核,但是增加了缓冲区,可以减少 系统调用的次数; 2、内核体系结构 (1)系统调用接口(SCI):提供某些机

weixin_42031299的博客 616

Labelme AI-Polygon闪退排查与修复指南

本文详细介绍了Labelme AI-Polygon功能闪退问题的排查与修复方法,包括环境配置检查、模型路径设置、依赖库版本控制等关键步骤。通过系统性的解决方案和实用技巧,帮助用户快速解决闪退问题,确保数据标注工作的高效进行。

weixin_29311017的博客 140

Linux内核2.4和2.6编译模块的方法

<br />http://blogold.chinaunix.net/u3/112205/showart_2191169.html<br /> <br /> <br />Linux内核2.4和2.6编译模块的方法<br />  2.6下的模块,扩展名为.ko,而不是2.4下的.o。很多初学者写完模块之后,会使用2.4的方法来编译模块。<br /><br /><br />/*filename: test.c*/<br />#include <linux/init.h><br />#include <linux

ivan240的专栏 1149

Xilinx FPGA 10G Ethernet Subsystem example

The 10G Ethernet subsystem provides 10 Gb/s Ethernet MAC, Physical Coding Sublayer(PCS) and Physical Medium Attachment (PMA) transmit and receive functionality over anAXI4-Stream interface.

青城扬沙的博客 2380

机器学习---xgboost算法

问题上表现的十分顶尖,本节将较详细的介绍XGBoost的算法原理。成和剪枝分别对应了经验风险最小化和结构风险最小化, XGBoost的决策树生成是结构风险最小。式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。出结果, 是模型的输出结果;等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这里。其中,F是假设空间,假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情。最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测。的正则化项是K棵树的正则化项相加而来的。

weixin_43961909的博客 1万+

Linux2.6下内核模块编译

 Linux2.6下内核模块编译经过几天的努力,自己写的内核模块终于可以在linux2.6下编译并加载道内核中了,现在对这几天的努力做个总结。在旧的版本下(如linux 2.4)linux内核模块的编译只需要有内核的头文件就行了,就可以通过和编译其他程序一样的方法编译成filename.o文件,这个.o文件是直接可以加载道内核中的,加载之后就可以用了,然而在2.6下就截然不同了,在li

nmzrl的专栏 1724

QGC二次开发实战指南(一):从零构建自定义地面站界面

本文详细介绍了QGC二次开发实战指南,从零开始构建自定义地面站界面。通过QT和QML技术结合MAVLINK协议,开发者可以打造适合特定业务场景的无人机监控系统,提升操作效率与用户体验。文章包含环境搭建、界面设计、数据绑定等完整开发流程,是QGC二次开发的实用教程。

weixin_28693683的博客 496

Linux 2.4和2.6内核模块编译的差别

Linux 2.4和2.6内核模块编译的差别  (2006-02-25 22:31:40) 从2.4到2.6,外部可装载内核模块的编译、连接过程以及Makefile的书写都发生了改变 2.4内核中,模块的编译只需内核源码头文件;需要在包含linux/modules.h之前定义MODULE;编译、连接后生成的内核模块后缀为.o。 2.6内核中,模块的编译需要配置过的内核源码;编译

stonesharp的专栏 963

Lama:基于傅立叶卷积的分辨率鲁棒性大掩模修复

为了缓解修复网络和损失函数都缺乏有效的感受野这个问题,提出了大掩模修复(LaMa)。LaMa基于一种新的修复网络架构,该架构使用快速傅立叶卷积(FFC),具有图像范围的感受野;高感受野感知损失;大型训练掩码,释放前两个组件的潜力。

qq_44926214的博客 1417

AgentScope 2.0 源码解析-工具系统解读:从内置工具到权限管控的完整实践

本文深入解析AgentScope 2.0工具系统的完整架构,覆盖内置工具集(文件读写、命令执行、搜索匹配)、MCP协议集成(STDIO/HTTP双传输、客户端封装、工作空间网关)、工具包管理与动态分组、权限引擎的多级决策机制(危险路径保护、只读识别、模式控制),以及自定义工具开发流程。通过分层架构图和时序图直观展示组件协作关系,结合安全最佳实践与故障排除指南,为开发者提供从工具使用到安全管控的全链路参考。

program哲学 570

简单内核模块编写

非常简单的内核模块编写

weixin_43908963的博客 1615

如何使用 Python 爬虫获取猫眼电影数据:电影评分与评论分析

随着互联网的快速发展,越来越多的人开始使用各种在线平台来了解电影信息,猫眼电影作为一个非常流行的在线电影票务平台,提供了详细的电影评分、评论和票房数据。本篇博客将详细介绍如何使用 Python 爬虫技术获取猫眼电影平台上的电影数据,重点关注电影评分和用户评论的爬取,分析其背后的数据处理和反爬虫技术。如果你对数据分析、电影评论分析等话题感兴趣,可以根据本文的示例进一步深入挖掘更多的数据,为决策提供支持,或为电影产业的相关研究提供有价值的分析依据。有些猫眼电影的页面数据是动态加载的,使用。

2201_76125261的博客 1623

内核模块编译方法

新功能源码与内核其它代码一起编译进uImage文件内。

zxd_yyds的博客 2244

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

内核模块编写及编译

操作系统是运行在硬件层之上的,给应用程序提供运行环境的裸机程序。目前操作系统有两种典型的内核实现模式:1、单内核(宏内核):所有子模块代码编译到一个比较大的可执行文件(镜像文件)中。各子模块代码共用同一套运行资源,各模块间的交互直接通过函数调用来进行。如:linux ​2、微内核:只将任务管理、内存管理、启动管理最其本的三个子模块编译到一个微型可执行文件中。其它子模块则各自编译成独立的后台服务程序,这些服务程序与微型内核以及APP间主要通过各种IPC进行通讯。如:windows ​。

qq_40896451的博客 1127

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

内核模块(编译方法)

内核模块(编译方法、参数和依赖)静态加载内核、动态加载内核、内核模块基础代码解读

qq_52479948的博客 3915

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

 内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。一、什么是模块模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空

和大黄的博客 5万+

操作系统 | 编写内核模块

史上最全的操作系统编写内核模块教学汇总,这是您迈向内核编程专家的绝佳起点!这一令人振奋的资源汇总包括了各种操作系统内核模块开发的指南,无论您是初学者还是有经验的程序员,都能从中受益匪浅。我们提供了超详细、超全面的教程,涵盖了多种操作系统,包括Linux、Windows、和BSD等。从编写简单的模块到实现高级内核功能,我们为您提供了一站式解决方案。

朝花夕拾 1万+

操作系统-实验四、内核模块编写

可接受LICENSE:"GPL", "GPL v2", "GPL and additional rights", "Dual BSD/GPL", "Dual MPL/GPL", "Proprietary"。本次实验和实验3相似,进行的比较顺利,并无出现太多问题,唯一需要注意的就是helloworld.c和Makefile文件的编写,不要出现错误,make需要在对应的文件夹中执行。当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。本身对应模块内部的全局变量。

qq_56101688的博客 1461
上一篇: Linux下汇编语言开发指南
下一篇: 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
lphpc
博客等级 码龄22年 32粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值