作者:罗宇哲,中国科学院软件研究所智能软件研究中心

在上一期中,我们介绍了Linux内核编译方法,这一期我们用一个例子来介绍如何向Linux内核中增加一个模块。

一、LKM内核模块

LKM是Loadable Kernel Module的缩写,意思是可加载内核模块。它有点儿像动态链接库,可在运行时加载,成为内核代码和数据的一部分,访问全部内核地址空间,也可运行时动态卸载(需要解决依赖关系,并释放内存空间),所谓的更新就是加载—>卸载—>加载的过程。LKM是大部分设备驱动、文件系统的存在形式。

为了编写内核模块,我们需要准备好编写的环境。首先要指定内核源码或源码的头文件(即本模块是为哪个内核版本编写的),然后可以用VIM等编辑器编写,最后可以用gcc编译。

下图展示了一个简单的内核模块的示例代码:

在示例代码中我们可以看到两个重要的宏:moduleinit和moduleexit。这两个宏包含在init.h头文件中,规定了模块的入口和出口函数。而MODULELICENSE、MODULEAUTHOR和MODULE_DESCRIPTION三个函数则被包含在module.h头文件中[4]。

为了将这个模块的源码编译成可动态加载的内核模块,我们还需要修改Makefile:

注意,运行模块代码有两种方式,第一种方法是静态编译连接进内核,在系统启动过程中进行初始化;第二种方法是编译成可动态加载的module,通过insmod动态加载重定位到内核。这两种方式可以在Makefile中通过obj-y或obj-m选项进行选择[1]。使用obj –m选项编译之后会生成.ko文件,可通过insmod将模块动态加载到内核中。

采用动态加载的方式有两个优点,一是可根据系统需要运行动态加载模块,以扩充内核功能,不需要时将其卸载,以释放内存空间;另一个是当需要修改内核功能时,只需编译相应模块,而不必重新编译整个内核[2]。

有五个与动态加载内核模块有关的命令[2]:

1.insmod:向Linux内核中插入一个模块;

2.rmmod:卸载内核中的模块;

3.lsmod:显示内核中的模块 ;

4.modprobe:可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块[3]。

5.modinfo:显示kernel模块的对象文件,以显示该模块的相关信息。

有时侯一个模块可能要调用其他模块中的函数,如果内核模块要引用内核代码中的符号则要通过内核符号表。内核符号表记录了内核中所有的符号(函数、全局变量等)的地址以及名字,在内核代码中通过 printk("%pSn", addr) 可以打印符号名[5]。使用EXPORTSYMBOL可以将一个函数或全局变量以符号的方式导出给其他模块使用在使用时应先在被调用函数之后用EXPORTSYMBOL(函数名)将函数导出,然后在调用该函数的模块中用extern关键字引用该函数。在加载模块时应注意顺序,首先加载定义该函数的模块,然后加载调用该函数的模块[6]。内核启动后生成/proc/kallsyms,它包含了内核中的函数符号和全局变量。

二、结语

本期通过一个实例介绍如何编写和编译一个新的内核模块,下一期我们将对Linux各版本进行对比分析。

参考文献

[1]https://blog.csdn.net/yanxuan321/article/details/86606329

[2]https://blog.csdn.net/CPU1994GHz/article/details/79309221?utm_source=blogxgwz3

[3]https://baike.baidu.com/item/modprobe/7939608?fr=aladdin

[4]https://www.xuebuyuan.com/3181553.html

[5]https://www.cnblogs.com/sky-heaven/p/6297679.html

[6]https://www.cnblogs.com/Caden-liu8888/p/7725293.html

内核源码编译ko文件如何调用math.h_第八期-Linux内核编程环境(2)相关推荐

  1. xilinx linux内核,Xilinx-Zynq Linux内核源码编译过程

    本文内容依据http://www.wiki.xilinx.com网址编写,编译所用操作系统为ubuntu 14 1.交叉编译环境的安装配置 2.uboot的编译 1)下载uboot源代码 下载uboo ...

  2. v45.05 鸿蒙内核源码分析(Fork) | 一次调用 两次返回 | 百篇博客分析HarmonyOS源码

    孔子于乡党,恂恂如也,似不能言者.其在宗庙朝廷,便便言,唯谨尔. <论语>:乡党篇 百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用 两次返回 进程管理 ...

  3. 不同的内核源码编译出来的ko文件,区别到底是什么?

    之前一直在考虑,不同的内核源码编译出来的ko文件,区别到底是什么? 能不能不编译内核加载内核模块呢?最近逆向分析了linux内核ko模块的结构,事实证明,是可以的. 我在这里给大家分享一些我的心得. ...

  4. Linux下imx6dl开发板从镜像的烧写、内核源码编译到第一个驱动运行的详细步骤

    文章目录 前言 一.对开发板烧写镜像 1.镜像烧写 2.串口测试 二.搭建交叉编译环境 1.Ubuntu下搭建交叉编译环境 2.WSL下搭建交叉编译环境 三.编译Linux内核源码 1.Ubuntu下 ...

  5. Android 内核源码编译记录

    注:此处内容总结自google官网:AOSP 编译内核.编译完成后刷机部分参考自其他大佬的文章.文中末尾提供了上传至CSDN的msm内核和Aarch64gcc工具 的下载链接,不想从官网下载的可以直接 ...

  6. 【linux内核-源码编译之centos7】

    linux内核-源码编译之centos7 一. 为什么要编译内核 二.疑难杂症 三.演示环境 四.下载源码 4.1.两者源码区别 4.2.将获取到的源码放在/usr/src/kernels/ 下 五. ...

  7. 编译linux源码报错,记录一次Linux内核源码编译实验

    记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...

  8. linux内核源码只有makefile文件没有c文件,linux内核代码的编写初步以及makefile的配置...

    在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准 而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块. 在GNU C标准中, ...

  9. Jetson Agx Xavier USB驱动裁剪+can时钟修改+内核源码编译流程(jetpack4.6.1)

    自己做了一块Xavier载板,硬件裁剪了一些功能,导致官方镜像usb无法使用,我使用的是jetpack4.6.1(R32.7.1),所以进行驱动修改,重新编译内核. 一.虚拟机环境 在Windows下 ...

  10. Petalinux 使用外部ADI的内核源码编译记录-附oe_runmake解决办法

    最近在使用zynq+ad9361,需要使用ADI提供的内核源码.按照UG1144的,Using External Kernel and U-Boot with PetaLinux.配置工程petali ...

最新文章

  1. ios 圆形旋转菜单_iOS实现滑动弧形菜单的思路与方法
  2. Mozilla新特性只支持https网站
  3. 《LeetCode力扣练习》剑指 Offer 28. 对称的二叉树 Java
  4. arcgis python规划地类-作为规划师,为什么我建议你学Python数据分析?
  5. 黄金法则之《终身学习》
  6. How is syntax error in Vue detected - Vue的语法错误检查机制介绍
  7. JAVA面试常考系列三
  8. 数学题 HDOJ——2086 简单归纳
  9. tcp协议之三次握手,四次挥手
  10. 量子计算机西南交大,交大量子光电实验室
  11. 公众号获取token失败_恶意请求微信公众号token,导致access_token超过10万次解决思路...
  12. Vue3开发教程(全)
  13. 深入理解Java类加载器(ClassLoader)
  14. 光学中的几个物理量的意义
  15. 2016年11月30日 angularJS input=file 绑定change事件
  16. Flak的分页器的使用
  17. 复旦大学计算机学院江湾校区,复旦大学江湾校区
  18. 思科德Exynos4412(2G内存)四核平板电脑方案
  19. KDevelop开发环境的搭建
  20. discuz 3.1修改浏览器顶部标题 - Powered by Discuz!

热门文章

  1. hdu1527取石子游戏---(威佐夫博弈)
  2. mysql select_type
  3. 一个元素的偏移的方法
  4. 荣耀30s刷鸿蒙,荣耀终于放出大招!4部荣耀旗舰可升级鸿蒙,网友:终于等到了...
  5. 安装RabbitMQ无法访问(http://localhost:15672)解决方案
  6. 《前端面试之道-JS篇》(上)
  7. android 资源文件
  8. T 沙龙 2018 年 1 月上海第 10 次线下活动总结
  9. Ubuntu学习 mkdir
  10. python 分类树_python中列表的分类树实现