一、内核模块的学习  

内核的整体框架是非常的大,包含的组件也是非常多,如何将需要的组件包含在内核中呢?选择一,就是将所有的组件全部编译进内核,虽然需要的组件都可以使用,但是内核过分庞大,势必带来效率影响;选择二是,将组件编译为模块,需要的时候,就自行加载进内核,这种就是我们称之为的模块,当模块被加载到内核的机制,不仅控制了内核大小,同时被加载的内核与被编译进内核的部分,功能意义。

  

3.1、内核的加载与卸载

    将 hello.c 编译为模块,hello.ko,

  1. insmod hello.ko

    也就可以 hello.ko 模块加载到内核,

    使用 modprobe 也可以加载模块

  1. modprobe hello.ko

   modprobe 比  install 更加强大,modprobe 加载模块的时候,会将加载模块依赖的模块也进行加载。

 

卸载模块:

  1. rmmod hello

    实现 模块 hello.ko 的卸载,这里需要注意,卸载的时候,直接写名字就可以了, ko 就不需要了,

   同时,也可以使用 modprobe 卸载模块:

  1. modprobe -r hello

    modprobe 卸载的时候,会将 hello 模块依赖的其他模块也,卸载掉。

模块的查看:

  1. lsmod

 

    可以查看系统加载的模块,其实lsmod 是通过读取 /proc/modules 文件。

获得模块的信息:

  1. modinfo hello(模块名)

    就可以获得模块的信息,包含作者,说明等扽参数。

 

3.2、模块模块程序结构

    Linux 内核模块的组成部分是比较的简单,由一下部分组成:

(1)模块加载函数

(2)模块卸载函数

(3)模块许可声明

(4)模块作者等信息

 

3.2.1、模块加载函数

    模块的加载函数,一般是通过 __init 标志声明,一般模块加载函数为:

  1. static int __init func_for_init(void)
  2. {
  3.  
  4. XXXX
  5. return 0;
  6. }
  7.  
  8. module_init(func_for_init);

 

    通过 module_init 指定函数,这个函数就是模块的加载函数,可以理解为模块的入口,实现的是做一些初始化的工作。 __init 是告诉内核这个函数是特殊函数,实现模块的初始化的功能。

3.2.2、模块卸载函数

       模块的下载函数是通过 __exit 标识来声明,典型的代码如下:

  1. static void __exit func_for_exit()
  2. {
  3. XXXX
  4. }
  5.  
  6. module_exit(func_for_exit);

 

    module_exit 函数指定了模块的卸载函数,模块的卸载函数实现的是模块加载函数完全相反的功能。

    使用__exit 来修饰模块卸载函数,是告诉内核,这个模块被编译进内核,模块卸载函数 func_for_exit 不会被编译进内核,因为不会再卸载了,干嘛要编译进去呢。

3.2.3、模块的声明

    模块的声明可以使用 ,MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_VERSION 等进行声明

3.3、模块的编译

  将代码编译为模块,需要编写简单的 MakeFile:

  1. // 单文件 hello.c
  2. // 多文件 file1.c、file2.c
  3.  
  4. KDIR = /XXX/XXX/XXX/XX
  5.  
  6. all :
  7. make -C $(KDIR) modules
  8. clean:
  9. make -C $(KDIR) modules clean
  10. rm -rf modules.order
  11.  
  12. // 当编译单文件时候
  13. obj-m += hello.o
  14.  
  15. // 当多文件编译的时候,
  16. obj-m := mymodule.o // 模块的名字,可以自己定义
  17. mymodule-objs := file1.o file2.o

 

    KDIR :  指定内核的路径,因为编译的模块,需要内核的环境编译,

    -C : 记得大写,是跳转内核里面进行编译,

    modules : 指定编译的为模块

    obj-m : 指定编译为模块

    单文件的时候,就直接以模块的名字,直接进行编译就可以;

    当多文件编译的时候,编译为模块的名字,模块名字可以自己定义,但是下面一行就,设置为 模块名字-objs  := 各个子文件

3、Linux内核模块学习的更多相关文章

  1. Linux内核模块学习

    注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...

  2. 5.linux内核模块基础,内核模块学习

    linux内核模块基础 一.定义 Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法 1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会 ...

  3. Smart210学习记录-------linux内核模块

    Linux 驱动工程师需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的Linux 操作系统映像.在编译 LDD6410 的内核时,需要配置内核,可以使用下面命令中的 一个: #ma ...

  4. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

  5. 关于Linux内核学习的误区以及相关书籍介绍

    http://www.hzlitai.com.cn/article/ARM9-article/system/1605.html 写给Linux内核新手-关于Linux内核学习的误区 先说句正经的:其实 ...

  6. linux内核学习之二:编译内核

    在linux内核学习系列的第一课中讲述了搭建学习环境的过程(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),环境搭好后,马上就进入到下一环节 ...

  7. 【转】Linux 中断学习之小试牛刀篇

    原文网址:http://www.linuxidc.com/Linux/2011-02/32129.htm 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入 ...

  8. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  9. Linux入门学习教程:虚拟机体验之KVM篇

    本文中可以学习到的命令: 1. aptitude 是apt-get 不会产生垃圾的版本 2.       dpkg -L virtualbox 显示属于该包的文件 lsmod | grep kvmfi ...

随机推荐

  1. dict和set背后的实现原理

    # 先说结论 ''' dict的性能远大于list 在list中,随着数据的增大,时间也会增大 在dict中,随着数据的增大,时间没有变化 ''' # 目的:我们研究为什么dict的性能远大于list ...

  2. python 操作数据库1--连接、执行sql语句

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/20 16:03 # @Author : lijunjiang # @Fi ...

  3. 阿里云Ubuntu快速建站

    阿里云Ubuntu快速建站 有一个小笑话: 从前有个程序员遇到了一个问题.他想,没事,我懂,用线程就好了.现他有两个问题了. 本人小白,对网站部署什么都不懂,只是申请个阿里云服务器,把我的站点放上去. ...

  4. hdu 1558(计算几何+并查集)

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. ReportView控件的使用

    ReportView控件的使用Posted on 2012-01-06 17:02 随遇 阅读(3006) 评论(0)  编辑 收藏 最近使用了ReportView控件绑定数据,总结下: 1.在设计器 ...

  6. Vue.js入门第一课

    这个好像比ANGULAR.JS要轻量一些,看看. <!DOCTYPE html> <html> <head> <meta charset="utf- ...

  7. NOIP2018提高组模拟题(二)

    咒语(curse) Description 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路. 正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. 亮亮拿起纸条的一端, ...

  8. 洛谷——P1469 找筷子

    P1469 找筷子 题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘 ...

  9. Xcode_9_beta.xip 更新下载

    Xcode_9_beta.xip 更新下载 Xcode_9_beta.xip 链接: pan.baidu.com/s/1dFJ33tJ 密码: 89mv

  10. bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】

    参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...