5.2.2.最简单的模块源码分析1

本节主要讲解模块安装和过程,及其和module_init宏的关联,并且重点讲解了模块安装时的安全性兼容性校验问题。

5.2.2.1、常用的模块操作命令

* lsmod(list module):打印当前内核中已经安装的模块

[email protected]:~$ lsmodModule Size Used byvmhgfs 48609 1snd_ens1371 24547 2snd_ac97_codec 105709 1 snd_ens1371

* modinfo(module info):打印出内核模块的自带信息。modinfo xxx.ko

modinfo module_test.komodinfo module_test.kofilename: /root/winshare/driver/5.2.1/module_test.ko 带全路径的模块名字license: GPLsrcversion: 9607C92CC3B26CACAF59BA3 不用管depends: vermagic: 3.13.0-32-generic SMP mod_unload modversions 686 (uboot)vermagic: 2.6.35.7 preempt mod_unload ARMv7 版本魔数(版本信息)校验与内核是否相同模块有版本信息,内核的zImage也有版本信息,两者必须相同才能安装

* insmod(install module):insmod xxx.ko

insmod module_test.koinsmod: ERROR: could not insert module module_test.ko: Invalid module format解决:Makefile打开#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个KERN_VER = $(shell uname -r)KERN_DIR = /lib/modules/$(KERN_VER)/build 重新编译安装后打印:lsmodModule Size Used bymodule_test 12394 0 (最前面)vmhgfs 48609 1>>dmesg[11804.303931] chrdev_init

* rmmod(remove module):卸载模块(最好不要.ko)。rmmod xxx

rmmod module_test.ko>>dmesg[11804.303931] chrdev_init[12165.167548] chrdev_exit代码中:module_init(chrdev_init);代码insmod所做的事情:

* 调用module_init宏声明的函数

module_init(chrdev_init); //声明驱动(函数)入口,用module_init把chrdev_init这个函数与insmod绑定起来。module_exit(chrdev_exit); //声明驱动(函数)出口,用module_init把chrdev_init这个函数与rmsmod绑定起来。

原文地址:https://www.cnblogs.com/Ocean-Star/p/9250234.html

时间: 2024-10-28 22:56:21

5.2.2.最简单的模块源码分析1的相关文章

5.2.4.最简单的模块源码分析3

printk:printk内核态,printf用户态(没什么用) 打印级别内核把级别比命令行低的所有消息显示在终端(console)上.但是所有信息都会记录在printk的"ring buffer"中. cat /proc/sys/kernel/printk(4 4 1 7)(比4小的能显示) echo 4 > /proc/sys/kernel/printk(更改级别) 但是Ubuntu中中不管级别是怎样,都不能显示,必须dmesg日志等级: 头文件: include <l

(二)最简单的模块源码分析

一.常用的模块操作命令(1)lsmod(list module,将模块列表显示),功能是打印出当前内核中已经安装的模块列表 (2)insmod(install module,安装模块),功能是向当前内核中去安装一个模块,用法是insmod xxx.ko(3)modinfo(module information,模块信息),功能是打印出一个内核模块的自带信息.,用法是modinfo xxx.ko(4)rmmod(remove module,卸载模块),功能是从当前内核中卸载一个已经安装了的模块,用

5.2.3.最简单的模块源码分析2

本节主要讲解了模块的卸载过程.MODULE_LICENSE等信息添加宏和__init.__exit宏. static 声明函数,全局变量,则它们不能被其它文件函数调用 声明静态局部变量,具有记忆功能.它与其他普通局部变量区别:static局部变量只被初始化一次,下一次的运算依据上一次的结果值. __init:一个宏定义,__cold notrace标记内核启动时所用的初始化代码,内核启动完成后就不再使用.__section(.init.text)其修饰的内容放到.init.text段中 defi

shiro登录模块源码分析

接触和使用shiro还是有好大一段时间,可惜并没有搞明白其实的原理和机制.因为工作中使用的框架都封装好了,so......并没有去研究. 原来一直猜想的是shiro可以直接连接数据库,验证用户名和密码.但是又没在实体类中找到有什么特殊的标记注解之类的. 就有点好奇了,于是趁这两天工作不是那么紧张了,就跟了下源码. 如有不对,请留言指正.蟹蟹! 红色部分是主要代码: UsernamePasswordToken token = new UsernamePasswordToken(user.getUs

Backbone事件模块源码分析

事件模块Backbone.Events在Backbone中占有十分重要的位置,其他模块Model,Collection,View所有事件模块都依赖它.通过继承Events的方法来实现事件的管理,可以说,它是Backbone的核心组成部分. 此外,事件模块的所有方法都挂在了全局的Backbone上,如果你的代码中需要用到自定义事件(实现观察者模式),可以直接使用它. 所以很有必要一起来研究下Backbone.Events的源码,一来学习Backbone事件模块优秀的写法和思想,二来可以更好的灵活使

Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

(一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和算法实现细节,只需要用这些类创建一些对象,然后直接应用就可以了,这样就大大提高了编程效率. (二)集合框架包含的内容: (三)集合框架的接口(规范)   Collection接口:存储一组不唯一,无序的对象 List接口:存储一组不唯一,有序的对象 Set接口:存储一组唯一,无序的对象 Map接口:

Django-djangorestframework-异常模块-源码及自定义异常

目录 异常模块 为什么要自定义异常模块 常见的几种异常情况 异常模块源码分析 自定义 drf 异常处理 异常模块 为什么要自定义异常模块 所有经过 drf APIView 视图类产生的异常,都可以提供异常处理方案(没有继承 APIVIew 的视图函数不会触发) drf 默认提供了异常处理方案(rest_framework.views.exception_handler),但是处理范围有限 drf 提供的处理方案有两种 有对应处理,处理了返回异常信息 没有对应处理(处理范围之外),返回 None,

Android异步消息处理机制详解及源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 最近相对来说比较闲,加上养病,所以没事干就撸些自己之前的知识点为博客,方便自己也方便别人. 1 背景 之所以选择这个知识点来分析有以下几个原因: 逛GitHub时发现关注的isuss中有人不停的在讨论Android中的Looper , Handler , Me

Retrofit源码分析以及MVP框架封装使用

阅读此文前请先阅读Retrofit+okhttp网络框架介绍 从上文中我们已经了解通过如下代码即可得到返回给我们call 以及 response对象,今天我们通过源码来分析这个过程是如何实现的. /** * 获取天气数据 * @param cityname * @param key * @return */ @GET("/weather/index") Call<WeatherData> getWeatherData(@Query("format") S