MODULE_LICENCE 机制

第二章:构造和运行模块 目录概述设置测试系统Hello World模块Makefile内核模块与应用程序的对比 概述 本章介绍所有关于模块编程和内核编程的必要概念。本章只讨论模块,不涉及任何特定类型的设备。 设置测试系统 由发行版厂商提供的内核通常打了许多的补丁,从而和主线内核存在很大差异。要学习驱动程序的编写,标准内核是最好的。 要为内核构造模块,必须在自己的系统中配置并构造好内核树。 Hello World模块 #i... 阅读详情

源代码解析:宏MODULE_LICENSE("Dual BSD/GPL")的展开

MODULE_LICENSE()在module.h定义为
#define MODULE_LICENSE(_license) MODULE_INFO(license, _license)

MODULE_INFO定义为
#define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)

在moduleparam.h中__MODULE_INFO定义为
#define ___module_cat(a,b) __mod_ ## a ## b
#define __module_cat(a,b) ___module_cat(a,b)
#define __MODULE_INFO(tag, name, info)                    \
static const char __module_cat(name,__LINE__)[]                \
__attribute_used__                            \
__attribute__((section(".modinfo"),unused)) = __stringify(tag) "=" info

__stringify(tag)在stringify.h中
#define __stringify_1(x)    #x
#define __stringify(x)        __stringify_1(x)
这个宏够复杂的,我就想看看预处理后这个宏变成了什么。
和前篇一样
[root@localhost helloworld]# gcc -I /lib/modules/2.6.23.1-4/build/include -E -P -< hello.c > hhhhh.c
In file included from /lib/modules/2.6.23.1-4/build/include/linux/module.h:9,
                 from <stdin>:5:
/lib/modules/2.6.23.1-4/build/include/linux/list.h:970:2: warning: #warning "don't include kernel headers in userspace"
In file included from /lib/modules/2.6.23.1-4/build/include/linux/module.h:20,
                 from <stdin>:5:
/lib/modules/2.6.23.1-4/build/include/asm/module.h:64:2: error: #error unknown processor family
这个报错把我搞傻了,"don't include kernel headers in userspace"这句话让我挠头,在makefile中改也没搞定,有知道的告诉我一声。
没办法,就用蠢办法,修改hello.c
#define MODULE_LICENSE(_license) MODULE_INFO(license, _license)

#define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)


#define ___module_cat(a,b) __mod_ ## a ## b
#define __module_cat(a,b) ___module_cat(a,b)
#define __MODULE_INFO(tag, name, info)                    \
static const char __module_cat(name,__LINE__)[]                \
__attribute_used__                            \
__attribute__((section(".modinfo"),unused)) = __stringify(tag) "=" info

#define __stringify_1(x)    #x
#define __stringify(x)        __stringify_1(x)

MODULE_LICENSE("Dual BSD/GPL");
int main()
{
    return 1;
} 
是的,我就是只想看看
MODULE_LICENSE("Dual BSD/GPL");变成什么
特别要提的是__LINE__是当前的行号,对于调用是调用时的行号,
接着来吧
gcc -E -P -< hello.c > hh.c

结果hh.c是
static const char __mod_license16[] __attribute_used__ __attribute__((section(".modinfo"),unused)) = "license" "=" "Dual BSD/GPL";
int main()
{
return 1;
}
至于__attribute_used__这些修饰符,我暂时也不确定是什么用的,虽然看了gcc的手册,__attribute_unused__好像是表示在修饰的函数未使用的情况下不出现警告。
有两点还要说的,一个是那个section(".modinfo"),我只知道这是模块结构中的一个段,对于我们原先的hello模块(不是这个,是以前那个),段信息如下
[guobamantou@localhost helloworld]$ objdump -t hello.o

hello.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS* 00000000 hello.c
00000000 l    d .text 00000000 .text
00000000 l    d .data 00000000 .data
00000000 l    d .bss   00000000 .bss
00000000 l    d .rodata.str1.1 00000000 .rodata.str1.1
00000000 l     F .text 00000011 hello_exit
00000011 l     F .text 00000013 hello_init
00000000 l    d .modinfo       00000000 .modinfo
00000000 l     O .modinfo       00000015 __mod_license6
00000000 l    d .note.GNU-stack        00000000 .note.GNU-stack
00000000 l    d .comment       00000000 .comment
00000000         *UND* 00000000 printk
00000011 g     F .text 00000013 init_module
00000000 g     F .text 00000011 cleanup_module
使用modinfo命令
[root@localhost helloworld]# /sbin/modinfo hello.ko
filename:       hello.ko
license:        Dual BSD/GPL
srcversion:     ABC142F4744F0BE5A5047D1
depends:
vermagic:       2.6.23.1-4 SMP mod_unload 686

可见modinfo这个段的信息(modinfo命令学自http://linux.chinaunix.net/bbs/archiver/?tid-963292.html)

第二。就是那个字符串的初始化,static const char __mod_license16[]="license" "=" "Dual BSD/GPL";这显然是我们不习惯了,试过了,的确是可以的。看过《C++编程思想》的读者也许记得书中讲过类似 char str[]="xxxx"
                                                                                "11111";
这样换行的赋值都是正确的。
Keil C51软件安装:新手教程(零基础必看) 手把手带你完成Keil C51软件安装全过程,从官网下载、环境配置到首个工程验证,一步不落。专为单片机初学者设计,避开常见报错和兼容性坑点,确保keilc51软件安装一次成功。 阅读详情

相关推荐

SDIO协议

SDIO协议1 概述  SDIO,全称:Secure Digital Input and Output ,即安全数字输入输出接口。2 特点①与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。②与较早的多媒体卡系统规格版本全兼容(向前兼容)。③与SD存储卡规格版本2.0全兼容。④与SD I/O卡规格版本2.0全兼容:支持两种不同的数据总线模式:1位(默认)和4

Let the development board fly! 3万+

MODULE_LICENSE的展开和检测

我们在写驱动模块的时候,一定会包含 <linux/module.h>,在我们的驱动模块代码中,一定会写MODULE_LICENSE("GPL"); 这个语句发生了什么,起到了什么作用?不写会怎么样? 在kernel/module.c 和 include/linux/module.h #define ___PASTE(a,b) a##b #define __PASTE(a,b) ___PASTE(a,b) #define __UNIQUE_ID(prefix) __PASTE(__PASTE(_

吃苹果的毛毛虫 4122

从零到一:ESP32-P4 PPA加速的配置陷阱与避坑指南

本文详细解析ESP32-P4结合LVGL的PPA硬件加速配置中的常见陷阱,包括内存对齐、缓冲区设置和同步机制等关键问题。提供实用的避坑指南和优化方案,帮助开发者高效启用esp32p4的PPA加速功能,显著提升图形渲染性能。

sky77的博客 395

编写模块时的声明(含MODULE_LICENSE等)

编写模块必须先声明下面两句:#include               //这个头文件包含了许多符号与函数的定义,这些符号与函数多与加载模块有关#include                      //这个头文件包含了你的模块初始化与清除的函数另外,如果你的模块需要用

lihaoweiV的专栏 2万+

识别产品外观的合格软件_工业视觉工业质检视觉识别机器视觉视觉检测智能制造工业检测缺陷...

随着工业物联网技术的迅猛发展,掀起了以云计算、大数据、以及人工智能 AI 等信息技术正与传统工业深入融合,由此衍生的 “智能制造4.0” 理念,正在为全球工业带来深远变革。中国的制造业巨头也纷纷借此发力,向智能化、数字化制造演进,实施战略转型。如何高效科学的管理和分析制造业务链上的生产价值,推进制造企业生产工艺优化与产品质量提升是每一个制造企业在数字化、智能化转型过程中的必经之路。业务发展带来的挑...

weixin_42502419的博客 751

别再为CAD和GIS数据对不上而头疼了!一份完整的ArcGIS for AutoCAD坐标系定义与数据套合指南

本文详细介绍了如何通过ArcGIS for AutoCAD插件解决CAD与GIS数据坐标系不匹配的问题,实现数据的精准套合。文章从坐标系冲突分析、插件核心功能解析到五步标准化工作流,提供了完整的解决方案,帮助工程师和设计师提升跨平台协作效率。

weixin_42531886的博客 216

为什么Linux驱动程序模块的C文件末尾要加上`MODULE_LICENSE(“GPL“);`

是告诉内核该模块是遵循 GPL 协议的开源模块。它是内核模块开发中的重要组成部分,直接影响模块的加载、符号使用权限以及内核的“污染”状态。开发者应根据模块的实际使用和分发需求正确声明许可证。是用于声明模块许可证的宏。它告诉内核该模块使用的许可证类型,从而决定是否允许加载该模块。此时,内核会标记为“污染状态”(Tainted Kernel)。如果将许可证声明为非 GPL,例如。在 Linux 内核模块中,

昊虹AI笔记 965

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2236

WARNING: modpost: missing MODULE_LICENSE()以及内核模块无法验证

missing MODULE_LICENSE()以及内核模块无法验证的解决方法

jinking01的专栏 5731

使用MATLAB实时处理摄像头图像

本文介绍了如何使用MATLAB进行实时图像处理,包括从摄像头获取图像、对图像进行处理并显示处理结果。我们将演示如何使用MATLAB的图像处理工具箱来实现常见的图像处理任务,如图像增强、边缘检测和物体检测。

XsiJava的博客 918

Java小白入门200例81之Java接口

作者简介 作者名:编程界明世隐 简介:优快云博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞! 引言 很多Java初学者问我,新手明明很用心、很努力学习的Java知识,转头又忘记了,很让人犯愁,小白如何能够快速成长、成为大牛呢? 其实要成为大神的技巧只有一个:“多学多练”,于是明哥就整理了比较典型的练习实例,通过练习能够快速提升编码技巧和熟练度,让你在成为大

编程界明世隐的博客 1358

linux内核模块的实现机制,Linux 内核模块工作原理及内核模块编译案例

一、Linux内核模块基本原理Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。它们扩展了操作系统内核功能却不需要重新编译内核、启动系统。如果没有内核模块,就不得不反复编译生成操作系统的内核镜像来加入新功能,当附加的功能很多时,还会使内核变得臃肿。一个Linux 内核模块主要由以下几个部分组成:(1) 模块加载函数(必须):当通过ins...

weixin_36387104的博客 790

基于YOLOv10的PCB电子元件智能识别系统设计与实现

数据预处理模块:负责对原始PCB图像进行标注、增强和格式转换模型训练模块:基于YOLOv10架构进行模型训练和优化推理检测模块:加载训练好的模型进行实时检测用户界面模块:提供友好的交互界面,方便用户操作和结果可视化YOLO(You Only Look Once)系列算法自2016年提出以来,经历了多次迭代更新。YOLOv1-v3:奠定了YOLO系列的基础架构YOLOv4-v7:引入大量优化技巧和网络结构改进YOLOv8-v9:进一步优化模型结构和训练策略YOLOv10。

YOLO 155

linux-platform机制实现驱动层分离(详解)

https://www.cnblogs.com/lifexy/p/7569371.html 自己理解: 主要是把设备和驱动进行分离: device:主要是硬件描述相关。地址,中断等等; driver:主要是驱动硬件工作,连接硬件与上层应用的桥梁; device与driver就通过某种机制进行连接起来。就是通过platform_bus_type,把驱动和设备联系起来。 platform_...

haigand的专栏 287

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

linux模块编写

一、linux模块化机制简介 模块化的优势: linux内核是单内核结构,由于所有内容都集成在一起,效率很高,但可扩展性和可维护性相对较差,模块机制弥补这一缺陷。 Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载;动态加载是指在内核运行的过程中随时加载。一个模块被加载到内核中时,就成为内核代码的一部分。模块加载入系统时,系...

dizhuao1328的博客 189

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux驱动开发学习记录系列(1)-初探Linux驱动开发

Linux驱动开发学习记录系列(1)-初探Linux驱动开发 因为项目需求,自己也想学Linux驱动很久了,乘此机会进行系统化学习,本系列主要记录实际开发时Linux驱动相关的整个流程和有趣的技术点。后续随着项目深入可能会更新其他知识,在不侵害公司利益及以职业道德为前提的情况下尽可能记录更多的技术开发流程,供自己加深记忆以及共同学习。 系列文章中,将会以第一视角由浅入深进行学习,博主本身具有一些嵌入式开发工作经验,对C和Python有一定开发经验,了解过Makefile,shell等一些基础知识。对Linu

weixin_43129735的博客 353

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Linux】Linux基础知识(Linux模块)

Linux的内核模块机制允许开发者动态的向内核添加功能,我们常见的文件系统、驱动程序等都可以通过模块的方式添加到内核而无需对内核重新编译,这在很大程度上减少了操作的复杂度。模块机制使内核预编译时不必包含很多无关功能,把内核做到最精简,后期可以根据需要进行添加。 而针对驱动程序,因为涉及到具体的硬件,很难使通用的,且其中可能包含了各个厂商的私密接口,厂商几乎不会允许开发者把源代码公开,这就和lin...

Yngz_Miao的博客 1万+

Linux内核模块

1. Linux内核模块 Linux本身是宏内核(单内核),但是又提供了模块这样一种机制,构成了Linux独有的模块特性。 Linux内核模块的特点: (1)模块本身不被编译入内核镜像,从而控制了内核的大小。 (2)模块一旦被加载,它就和内核中的其他部分完全一样。 2. Linux内核模块操作指令 (1)lsmod 显示系统中已加载的所有模块,实际就是读取并分析“/p...

linuxweiyh的博客 801

8.3linux竞争与并发(自旋锁实验)_csdn

这两者作用在后续./dev/beep 1/0中创建/dev/beep。方便执行代码程序,传入到设备执行,关联设备号1.添加pinctrl信息。2.检查当前设备树中要使用的IO有没有被其他设备使用,如果有的话要处理。3.添加设备节点,在设备节点中创建一个属性,吃属性描述所使用的gpio。4.编写驱动,获取对应的gpio编号,并申请IO,成功后即可使用此IO。申请失败绝大部分情况是被其他外设给占用了!!!这种情况在根节点或者设备树检查一下pinctrl复用情况。加油!!!

m0_66676819的博客 884

java.unit.base64_Base64

/*********************************************************************\MODULE NAME: b64.cHOMEPAGE:AUTHOR: Bob Trower 08/04/01PROJECT: Crypt Data PackagingCOPYRIGHT: Copyright (c...

weixin_34005090的博客 268

WVGuesserExtension-NextGen核心原理揭秘:从PSSH提取到License解析全过程

WVGuesserExtension-NextGen是一款强大的Chrome/Firefox浏览器扩展,专为Widevine加密内容的密钥提取与解析而设计。作为开源项目"GitHub加速计划/wv/wvg"的核心组件,它为安全测试人员提供了从PSSH提取到License解析的完整解决方案,帮助用户在合法授权范围内分析Widevine加密机制。 ## 一、Widevine加密与WVGuesserE

gitblog_00754的博客 990

早期工作项目总结

2008年毕业参加工作,在FOXCONN参与了 手机嵌入式APP开发工作,今天总结下: 硬件: 手机嵌入式 平台: window mobile 6.1 图形绘制引擎: Edgelib 场景:  短信及拨号界面开发 开发的UI界面如下:                        图1-1

Sunny04的专栏 729

跟著Qcadoo MES系统学习产品设计

Manufacturing Execution System,MES是工业4.0的核心系统,智能制造的大脑,跟踪Qcadoo MES学习产品设计001

通达的博客 2133

linux驱动开发之HelloWorld

最近实习,公司项目搞的是平板开发,而我分配的任务是将驱动加载到内核中。   准备工作,必要知识了解:加载有两种方式,一种是动态加载和卸载即模块加载,另一种是直接编译进入内核;Linux内核把驱动程序划分为3种类型:字符设备、块设备和网络设备。字符设备和块设备可以像文件一样被访问。它们的主要区别不在于能否seek,而是 在于系统对于这两种类型设备的管理方式。应用程序对于字符设备的每一个...

weixin_34402090的博客 118

技术揭秘:开源10.5GHz相控阵雷达的系统架构创新与性能优化

在传统雷达系统被高昂成本和封闭架构所束缚的时代,AERIS-10项目的出现标志着雷达技术民主化的新纪元。这个开源10.5GHz相控阵雷达系统不仅实现了从概念到产品的完整技术栈,更重要的是展示了如何通过创新的系统架构设计,在保持高性能的同时将成本降低两个数量级。其核心技术创新在于将商用现货组件与定制化设计相结合,创造出一个既专业又开放的技术平台。 AERIS-10的技术突破并非简单的功能堆砌,而是

gitblog_02291的博客 527

开源相控阵雷达终极指南:从零构建10.5GHz AERIS-10系统

开源相控阵雷达技术正在重新定义雷达系统的可及性。AERIS-10作为一个开源、低成本的10.5GHz相控阵雷达系统,为研究人员、无人机开发者和SDR爱好者提供了完整的硬件和软件解决方案。这个项目不仅打破了传统雷达系统的高成本壁垒,还展示了现代开源硬件与软件协同创新的巨大潜力。 ## 为什么传统雷达系统难以触及? 雷达技术长期以来一直被视为专业领域的高端技术,主要原因包括: - **高昂的硬件

gitblog_00154的博客 1143
上一篇: Java Virtual Machine
下一篇: Linux initrd.img的加载机制
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值