3、Linux内核模块学习
一、内核模块的学习
内核的整体框架是非常的大,包含的组件也是非常多,如何将需要的组件包含在内核中呢?选择一,就是将所有的组件全部编译进内核,虽然需要的组件都可以使用,但是内核过分庞大,势必带来效率影响;选择二是,将组件编译为模块,需要的时候,就自行加载进内核,这种就是我们称之为的模块,当模块被加载到内核的机制,不仅控制了内核大小,同时被加载的内核与被编译进内核的部分,功能意义。
3.1、内核的加载与卸载
将 hello.c 编译为模块,hello.ko,
insmod hello.ko也就可以 hello.ko 模块加载到内核,
使用 modprobe 也可以加载模块
modprobe hello.komodprobe 比 install 更加强大,modprobe 加载模块的时候,会将加载模块依赖的模块也进行加载。
卸载模块:
rmmod hello实现 模块 hello.ko 的卸载,这里需要注意,卸载的时候,直接写名字就可以了, ko 就不需要了,
同时,也可以使用 modprobe 卸载模块:
modprobe -r hellomodprobe 卸载的时候,会将 hello 模块依赖的其他模块也,卸载掉。
模块的查看:
lsmod
可以查看系统加载的模块,其实lsmod 是通过读取 /proc/modules 文件。
获得模块的信息:
modinfo hello(模块名)
就可以获得模块的信息,包含作者,说明等扽参数。
3.2、模块模块程序结构
Linux 内核模块的组成部分是比较的简单,由一下部分组成:
(1)模块加载函数
(2)模块卸载函数
(3)模块许可声明
(4)模块作者等信息
3.2.1、模块加载函数
模块的加载函数,一般是通过 __init 标志声明,一般模块加载函数为:
static int __init func_for_init(void)
{ XXXX
return 0;
} module_init(func_for_init);
通过 module_init 指定函数,这个函数就是模块的加载函数,可以理解为模块的入口,实现的是做一些初始化的工作。 __init 是告诉内核这个函数是特殊函数,实现模块的初始化的功能。
3.2.2、模块卸载函数
模块的下载函数是通过 __exit 标识来声明,典型的代码如下:
static void __exit func_for_exit()
{
XXXX
} module_exit(func_for_exit);
module_exit 函数指定了模块的卸载函数,模块的卸载函数实现的是模块加载函数完全相反的功能。
使用__exit 来修饰模块卸载函数,是告诉内核,这个模块被编译进内核,模块卸载函数 func_for_exit 不会被编译进内核,因为不会再卸载了,干嘛要编译进去呢。
3.2.3、模块的声明
模块的声明可以使用 ,MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_VERSION 等进行声明
3.3、模块的编译
将代码编译为模块,需要编写简单的 MakeFile:
// 单文件 hello.c
// 多文件 file1.c、file2.c KDIR = /XXX/XXX/XXX/XX all :
make -C $(KDIR) modules
clean:
make -C $(KDIR) modules clean
rm -rf modules.order // 当编译单文件时候
obj-m += hello.o // 当多文件编译的时候,
obj-m := mymodule.o // 模块的名字,可以自己定义
mymodule-objs := file1.o file2.o
KDIR : 指定内核的路径,因为编译的模块,需要内核的环境编译,
-C : 记得大写,是跳转内核里面进行编译,
modules : 指定编译的为模块
obj-m : 指定编译为模块
单文件的时候,就直接以模块的名字,直接进行编译就可以;
当多文件编译的时候,编译为模块的名字,模块名字可以自己定义,但是下面一行就,设置为 模块名字-objs := 各个子文件
3、Linux内核模块学习的更多相关文章
- Linux内核模块学习
注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...
- 5.linux内核模块基础,内核模块学习
linux内核模块基础 一.定义 Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法 1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会 ...
- Smart210学习记录-------linux内核模块
Linux 驱动工程师需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的Linux 操作系统映像.在编译 LDD6410 的内核时,需要配置内核,可以使用下面命令中的 一个: #ma ...
- linux 驱动学习笔记01--Linux 内核的编译
由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...
- 关于Linux内核学习的误区以及相关书籍介绍
http://www.hzlitai.com.cn/article/ARM9-article/system/1605.html 写给Linux内核新手-关于Linux内核学习的误区 先说句正经的:其实 ...
- linux内核学习之二:编译内核
在linux内核学习系列的第一课中讲述了搭建学习环境的过程(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),环境搭好后,马上就进入到下一环节 ...
- 【转】Linux 中断学习之小试牛刀篇
原文网址:http://www.linuxidc.com/Linux/2011-02/32129.htm 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入 ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux入门学习教程:虚拟机体验之KVM篇
本文中可以学习到的命令: 1. aptitude 是apt-get 不会产生垃圾的版本 2. dpkg -L virtualbox 显示属于该包的文件 lsmod | grep kvmfi ...
随机推荐
- 移动web开发问题和优化小结
之前在微信公众号上看到的一篇文章,直接给拷过来了....原文链接http://mp.weixin.qq.com/s/0LwTz-Mw2WumSztIrHucdQ 2.Meta标签 页面在手机上显示时, ...
- Couchbase应用示例(初探)
安装过程:略. 1. 新建Web项目 从NuGet获取并引用: CouchbaseNetClient,添加后引用列表显示为 : Couchbase.NetClient 2. 需要对项目添加引用,这里我 ...
- 第一章:1-20、试计算以下两种情况的发送时延和传播时延: (1) 数据长度为107bit,数据发送速率为100kbit/s,传播距离为1000km,信号在媒体上 的传播速率为2×108m/s。 (2) 数据长度为103bit,数据发送速率为1Gbit/s,传输距离和信号在媒体上的传播速率同 上。
<计算机网络>谢希仁著第四版课后习题答案答: 1):发送延迟=107/(100×1000)=100s 传播延迟=1000×1000/(2×108)=5×10-3s=5ms ...
- POJ 3686 The Windy's (费用流)
[题目链接] http://poj.org/problem?id=3686 [题目大意] 每个工厂对于每种玩具的加工时间都是不同的, 并且在加工完一种玩具之后才能加工另一种,现在求加工完每种玩具的平均 ...
- [BZOJ2095]Bridges
最大值最小,是二分 转化为判定问题:给定一个混合图,问是否存在欧拉回路 首先,有向图存在欧拉回路的充要条件是每个点的入度等于出度,现在我们有一个混合图,我们要做的就是给其中的无向边定向,使得它变成有向 ...
- [COCI2015]JABUKE
题目大意: 一个$n\times m(n,m\leq500)$的网格图中有若干个标记点,有$q(q\leq10^5)$个操作,每次新加入一个标记点,并询问和新加入点最近的点的距离. 思路: 记录对于每 ...
- kong后台接口
在nginx-kong.lua中,require('lapis').serve('kong.api'),先require文件/usr/local/share/lua/5.1/lapis/init.lu ...
- SQL 连表更新
现在数据如下: 需求如下: 要求 更新 Earnings 表中的Earnings字段 当 Table_2 KPI 大于等于1时 Earinings = KPI* 2000,否则等于 KPI* 1500 ...
- bean装配--注解
1,Dao层 package com.songyan.zhujie; public interface UserDao { public void say(); } package com.songy ...
- rpm安装、卸载、升级、查询和验证
RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下软件包的软件.Linux 安装时,除了几个核心模块以外,其余几乎所有的模块均通过RP ...