本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用、功能及基本编程方法,以便于读者能快速理解什么是Linux内核,能看懂Linux内核。

拥有超过1300万行的代码,Linux内核是世界上最大的开源项目之一,但是内核是什么,它用于什么?

一、什么是linux内核模块?

内核是与计算机硬件接口的易替换软件的最低级别。它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。

Linux内核与硬件的关系

内核可以通过所谓的中断来管理系统的硬件。 当硬件要与系统接口时,会发出一个中断,中断处理器,从而对内核执行相同的操作。 为了提供同步,内核可以禁用中断,无论是单个中断还是全部中断。 但是,在Linux中,中断处理程序不是在进程上下文中运行,而是在不与任何进程相关联的中断上下文中运行,这种特殊的中断上下文仅是为了让中断处理程序快速响应单个中断然后最终退出而存在 。

linux内核整体非常庞大,包含组件特别多,当我们把需要的部分包含到内核中,直接把需要的所有功能都编译到内核中会导致内核很大,而且当需要新增或者删除功能,又要重新编译,非常麻烦,因此linux提供了模块(Modele)的机制。

可以把内核比喻成一个很长的火车,每个车厢就是一个内核模块,内核在运行这个火车就会一直在开动,但是我们想在火车开动的情况下增加新的车厢,这个时候就需要insmod,意思就是往这个长长的火车车厢增加一个内核模块。

模块的特点:不编译入内核镜像;一旦加载和内核其他部分完全一样。

为了使读者对模块有个感性认知,先看一下简单的HelloWorld模块,代码如下:

二、Linux内核模块组成结构

一个Linux内核模块主要由以下几个部分组成。

1)模块加载函数(必须)

当通过 insmod 或 modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。模块加载函数一般以__init标识声明

static int __init FuntionA(void)

{

}

module_init( FuntionA);

2)模块卸载函数(必须)

当通过 rmmod 命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。 模块卸载函数一般以__exit标识声明:

static void __exit  FuntionB(void)

{

}

module_exit( FuntionB );

通常来说,模块卸载函数要完成与模块加载函数相反的功能,如下所示。

a)若模块加载函数注册了XXX,则模块卸载函数应该注销XXX。

b)若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。

c)若模块加载函数申请了硬件资源(中断,DMA通道,I/O端口和I/O内存等)的占用,则模块卸载函数应释   放这些硬件资源。

d)若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件。

3)模块许可证声明(必须)

模块许可证(LICENSE)声明描述内核模块的许可权限,如果不声明 LICENSE,模块被加载时,将收到内核被污染的警告。大多数情况下,内核模块应遵循GPL 兼容许可权。

Linux2.6 内核模块最常见的是以MODULE_LICENSE(“Dual BSD/GPL”)语句声明模块采用BSD/GPL 双LICENSE

4)模块参数(可选)是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量

用“module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数

例如: module_param(num,int,S_IRUGO);

5)模块导出符号(可选)可以导出符号(symbol,对应于函数或变量),这样其它模块可以使用本模块中的变量或函数

可以使用如下宏导出符号到内核符号表:

EXPORT_SYMBOL(符号名);

EXPORT_SYMBOL_GPL(符号名);

6)模块作者等信息声明(可选)

我们可以使用MODULE_AUTHOR,MODULE_DESCRIPTION,MODULE_VERSION,MODULE_DEVICE_TABLE,MODULE_ALLAS

分别声明模块的作者,描述,版本,设备表和别名

例如:

MODULE_AUTHOR(author);

MODULE_DESCRIPTION(description);

三、Linux内核模块的编译

首先为HelloWorld模块编写MakeFile文件

该MakeFile文件应该与源码位于同一目录

在Makefile中,在obj-m := helloworld.o这句中,.o的文件名要与编译的.c文件名一致。

如果一个模块包含多个.c文件(如file1.c、file2.c)则应该使用如下方式编写MakeFile:

Obj -m :=modulename.o

Modulename -obj :-file1.o file2.o

KERNELDIR ?= /usr/src/linux-headers-$(shell uname -r)指示当前linux系统内核的源码位置。

1.在Makefile及helloworld.c所在目录下,直接make,成功后查看当前目录下有无helloworld.ko文件产生,有则内核模块生成成功。

2.使用insmod命令,把此内核模块程序加载到内核中运行。结合lsmod及管道命令,查看内核模块程序在内核中是否正确运行。

四、总结

本文主要讲解了linux内核模块的概念和基本编程方法、内核模块组成结构,由于linux设备驱动以内核模块的形式存在,因此了解本文内容是编写任何设备驱动的必需。

LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译相关推荐

  1. 嵌入式linux头文件,飞凌嵌入式知识汇092期:C工程的组织方式(头文件的功能)以及Linux下常用的头文件的作用...

    1.1每个C++/C程序通常分为两个文件.一个文件用于保存程序的声明(declaration),称为头文件.另一个文件用于保存程序的实现(implementation),称为定义(definition ...

  2. ok6410linux开发环境搭建,飞凌嵌入式知识汇021期:OK6410裸机程序之开始模板(Linux环境)...

    手中有OK6410开发板,一直想试试通过Linux来做做裸机开发,在网络论坛上也搜过一些资料作参考,整理了一下并做了解释或改动,希望这些东西可以大家分享下. 裸机程序的构成 基本的裸机程序由启动代码和 ...

  3. 飞凌嵌入式干货分享丨如何在iMX8MQ 核心板上实现低功耗音频播放

    飞凌嵌入式FETMX8MQ-C核心板基于NXP i.MX8MQ处理器设计,该处理器拥有4个Cortex-A53处理器(工业级主频最高为1.3GHz.商业级主频最高为1.5GHz)+1个Cortex-M ...

  4. qt工程在linux系统里颜色显示错误_【飞凌嵌入式RK3399开发板试用体验】+QT开发环境搭建测试(二)...

    作者:飞扬的青春 在拿到开发板之后,已经体验了Android操作系统,接下来就是体验Linux下的开发,本次以QT的一个小案例来测试下. 首先是自己先搭建了一个Ubuntu18.04的虚拟机,使用真机 ...

  5. 干货课堂丨分享一种LCD驱动电路方案【飞凌嵌入式】

    在一次项目定制中,客户要求我们将 CPU 主控和 LCD 显示屏电压驱动电路做成一体板, LCD 显示屏所需要的 AVDD,VGH,VGL 等电压需要主控板提供,因为这几路电压所输出的电流都很小(一般 ...

  6. linux 开发板模拟u盘,S5P4418开发板Linux下实现模拟U盘教程飞凌嵌入式

    飞凌嵌入式ARMCortex-A9 S5P4418开发板上能否满足U盘的功能?其实可通过修改内核配置和文件系统相关内容,在OK4418开发板上实现模拟U盘功能,模拟U盘可以帮助我们实现开发板与Wind ...

  7. 飞凌嵌入式丨2020年技术干货合集大放送!

    亲爱的飞凌用户们 你们好哇 魔幻的2020即将过去 今年有些特殊,有些不容易 回看射雕处,千里暮云平 想必大家都有成长有收获 感谢你们一路以来的支持 2021即将到来 回顾2020 你是不是又博学了呢 ...

  8. 飞凌嵌入式丨千兆网之RGMII SGMII解析

    一般来说,底板的千兆网大多选用RGMII和SGMII两种接口,也有可以拓展出更多网口的QSGMII接口. 这篇文章主要是对前两种常用的千兆网接口的介绍,以直观的方式对比这两种接口在引脚方面的不同,比较 ...

  9. 国产平台之T507 开发板Android 安全策略漫谈 -飞凌嵌入式

    硬件平台:飞凌嵌入式 OKT507-C开发板 操作系统:Android10.0 飞凌嵌入式 T507 开发板 Android系统版本为Android10.0,默认开启了SELinux.基于MAC访问控 ...

最新文章

  1. 软件工程概论——课堂测试1
  2. 特殊字符、Date、JS应用
  3. 形式化方法、《大象:Thinking in UML》
  4. 贝叶斯反垃圾邮件技术
  5. transaction type popup window when create service order
  6. MySQL集群搭建——主备模式
  7. LeetCode 51 N 皇后
  8. 【白皮书分享】工业互联网人才白皮书(2020).pdf(附下载链接)
  9. 阳江口碑好的java培训价格
  10. android批量文件上传(android批量图片上传)
  11. 计算机视觉工作项目方案设计,机器视觉(项目方案设计案例)47.pdf
  12. 局部内部类使用局部变量应注意什么?
  13. 图解sql内外连接和左连接left join和右连接right join
  14. linux环境Git客户端下载安装
  15. 渗透测试(445端口)
  16. vue 前端获取用户登录地址 ip 设备型号
  17. 61_ZYNQ7020开发板_SD/QSPI方式启动_ax_peta
  18. tl-wdr7300虚拟服务器怎么设置,TP-Link TL-WDR7300路由器wifi密码怎么设置?(电脑)...
  19. org.dom4j.DocumentException: 1 字节的 UTF-8 序列的字节 1 无效。
  20. vue.runtime.esm.js?2b0e:619 [Vue warn]: Property “XX“ must be accessed with “$data._tos“ because

热门文章

  1. 基于STM32单片机流水灯仿真与程序设计
  2. 【Linux】(一)Linux 入门
  3. 条码管理系统mysql_C# 仓库条码管理系统(含数据库)入门级源码
  4. 实现Java+Vue上传图片到七牛云和从七牛云删除图片
  5. gearhost.com申请免费空间及绑定域名
  6. 数论专题笔记(1)——同余,整除,欧拉定理,中国剩余定理
  7. NLP之相似语句识别
  8. QStringList去重
  9. 概率论-泊松定理证明手写版
  10. 浅析国内汽车制造企业流程与ERP需求