当前位置: 首页 > news >正文

便捷的大连网站建设123网址之家

便捷的大连网站建设,123网址之家,网站建设开发服务费会计科目,网站开发工作职责作者简介西安邮电大学2019级陈莉君教授研究生,初学内核的小白,热爱Linux内核。正在努力学习内核,内核伴我成长?从最初学习使用Linux OS,到学习Linux内核,再到自己编写内核模块,顺利实现模块的装载和卸载&a…
作者简介

西安邮电大学2019级陈莉君教授研究生,初学内核的小白,热爱Linux内核。正在努力学习内核,内核伴我成长?

9807e12bb677cd8bc32fea8d9197e1dd.gif

951fd6084abfbfd5f34a834d602e449d.gif        从最初学习使用Linux OS,到学习Linux内核,再到自己编写内核模块,顺利实现模块的装载和卸载,这是一个非常有趣的过程。下面我将内核模块的学习内容和大家分享,将学习Linux内核的快乐简单的传递。       

8e279000bf3f8516feea7d25e05fd94d.gif

构造和运行模块的过程

模块源代码  hds.c文件:

caaf0e0b1ad4b6005a713be590fe264c.png

Makefile文件:

8012b3ae0355e5192b2bc0ea32050245.png

编译模块

 $ make      

为方便在当前终端查看日志打印信息,在装载模块前输入如下命令

 $ tail -f /var/log/kern.log &

装载模块

 $ sudo insmod hds.ko

查看装载的模块

 $ lsmod

卸载模块

 $ sudo rmmod hds

查看模块是否已卸载

 $ lsmod

8e279000bf3f8516feea7d25e05fd94d.gif

模块的组成

基本结构:

头文件+初始化函数+清除函数+引导内核的模块入口+引导内核的模块出口+模块许可证

编写内核代码所用到的头文件包含在内核代码树的include/及其子目录中,例如module.h,kernel.h,init.h,这三个头文件全部包含在/include/linux/中。这三个头文件以预处理指令的形式写在模块源代码的首部:

 # include # include # include 

在编译模块源文件之前,由预处理程序对预处理指令进行预处理。对于#include 来说,就是把module.h中的内容读进来,放在#include 的位置,取代了#include 指令行。然后由这些头文件的内容和其他部分一起组成一个完整的,可以用来编译的最后的源程序,然后由编译程序对该源程序正式进行编译,才得到目标程序。内核模块代码编译后得到目标文件后缀为.o

module.h在内核代码树的位置为linux-2.6.0/include/linux/module.h,头文件module.h包含了对模块的结构定义以及模块的版本控制,可装载模块需要的大量符号和函数定义(初学阶段知道写模块必须包含这个头文件,还有头文件大致的内容,先知道是什么,后面再深入分析源代码)。module.h的源码如下(只是开头部分):

2814d4b527f381ff89a43471a7ba1664.png

init.h在内核代码树的位置为linux-2.6.0/include/linux/init.h,在init.h这个文件中包含了两个非常重要的宏init 和 exit。在init.h的源代码中,对于两种宏的用法和作用给出了说明,源代码说明如下:

77363a2a1b79bb59d485eb1bb3ed7dd7.png

宏__ init用于将一些函数标记为“初始化”函数。内核可以将此作为一个提示,即该函数仅在初始化阶段使用,并在初始化阶段之后释放使用的内存资源。模块被装载之后,模块装载器就会将初始化函数扔掉,这样可将该函数占用的资源释放出来。宏__init的用法如下:

1b67bc36e86671fd430b086e07c47a13.png

宏 exit的用法和 init一样,它的作用是标记该段代码仅用于模块卸载(编译器将把该函数放在特殊的ELF段中)。即被标记为__ exit的函数只能在模块被卸载时调用。

kernel.h包含了内核常用的API,比如printk()在kernel.h源代码的定义如下:

0b44b9530af8df9a463e3bbc53ec66b2.png

模块功能函数也可以称为初始化函数,模块功能函数的定义如下:

96486fd581ee71476250ec0e6a49740c.png

模块功能函数是在模块被装入内核后调用的,也就是在模块的代码被装入内核内存后,才调用模块功能函数。注意:__ init 标记只是一个可选项,并不是写所有模块代码都要加 __ init。但是在测试我们自己写的模块时,最好加上 __ init。因为我们在写一个模块功能函数的时候,可能这个函数里面有定义的变量,当调用这个函数的时候,就要为变量分配内存空间,但注意,此时分配给变量的内存,是在内核空间分配的,也就是说分配的是内核内存。所以说如果只是想要测试一下模块的功能,并不需要让模块常驻内核内存,那就应该在执行完函数后,将当初分配给变量的内存释放。为了达到这个效果,只需要把这个函数标记为 __init属性。

清除函数的定义如下:

54b4325983eb284554348a6b6bba5e2c.png

__ exit标记该段代码仅用于模块卸载,被标记为 __ exit的函数只能在模块被卸载或者系统关闭时调用。如果一个模块未被定义为清除函数,则内核不允许卸载该模块。

驱动程序初始化出口点源码定义如下:

4da219d838649a5947071269d1ccd50a.png

module _ exit()-驱动程序出口点。当驱动程序被删除时运行的函数。当驱动程序是一个模块时,module _ exit()将使用cleanup _ module()包装驱动程序清理代码。如果驱动程序被静态编译到内核中,则module _ exit()没有作用。每个模块只能有一个。

编写内核模块,需要添加模块许可证。如果没有添加模块许可证,会收到内核被污染的警告

 module license unspecified taints kernel

内核被污染可能会导致驱动程序的一些系统调用无法使用。

8e279000bf3f8516feea7d25e05fd94d.gif

make和Makefile

make是内核的编译器,对Makefile文件进行编译。Makefile可以看成是针对make程序的配置文件,当我们执行make命令时,make就会在当前目录下寻找Makefile文件,然后根据Makefile的配置对源文件进行编译。

8e279000bf3f8516feea7d25e05fd94d.gif

内核模块

Linux内核模块的概念:

  • 内核模块是一段可以动态加载进内核的代码

  • 在Linux内核源码树以外来开发并编译一个模块,称为树外开发

  • 之所以提供模块机制,是因为Linux内核本身是一个单内核,单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维护性较差,模块机制可弥补这一缺陷。

内核模块的两种加载方式

  • 静态加载:在内核启动过程中加载

  • 动态加载:在内核运行的过程中随时加载

8e279000bf3f8516feea7d25e05fd94d.gif

猜你喜欢:

基于LiteOS的智慧农业案例实验分享

【Linux笔记】设备树实例分析

【Linux笔记】通俗易懂的Linux驱动基础

【Linux笔记】pc机_开发板_ubuntu互ping实验【Linux笔记】挂载网络文件系统

学习STM32的一些经验分享

从单片机工程师的角度看嵌入式Linux

cec0d2ead3e9430ee4d281401a948417.png

39f7f90a8e8fab2634e05ae724f1752f.png

点个赞,证明你还爱我

http://www.lbrq.cn/news/2628307.html

相关文章:

  • 最新永久4虎最新人口谷歌优化技巧
  • 17做网站广州起做网店让百度收录自己的网站
  • 沧州网站建设推广凡科网站建站教程
  • 外贸soho怎么建网站二十条优化
  • 手机上怎么制作网站吗windows优化大师会员兑换码
  • 网站怎么做劫持老域名购买
  • 万网注册域名的步骤深圳网站搜索优化工具
  • 怎么在.Net中做团购网站北京做的好的seo公司
  • 北京网站建设手机app电子商务女装标题优化关键词
  • 深圳网页开发快速排名优化
  • 有谁有做卫生纸巾的网站东莞seo关键词排名优化排名
  • 56网站可以做电子相册贴吧推广400一个月
  • 万众城网站建设成都百度推广公司联系电话
  • 网站公安备案 查询百度知道合伙人官网登录入口
  • 怎么给网站做关键词足球进球排行榜
  • 怎么做网站解析什么平台发广告最有效
  • 湖南网站建设seo优化怎么做百度推广平台
  • 做公司网站怎么做手机版西安快速排名优化
  • 欧美做视频网站有哪些百度网站关键词排名助手
  • 设计网站首页多少钱新闻头条最新消息今天
  • 北京网站设计制作上海谷歌seo
  • 商务网站的推广方法有哪些百度新闻官网
  • 免费个人网站建站免费搜索引擎入口
  • wordpress写网站教程优化设计全部答案
  • 美团是最早做团购的网站么网络宣传策划方案
  • 做单页网站怎么选产品seo推广主要做什么的
  • 电脑上怎么运行wordpressseo培训教程
  • 电子商务网站建设属性线下引流推广方法
  • 郑州专业建站报价fifa最新排名出炉
  • 做网站寄生虫网站优化塔山双喜
  • 力扣238:除自身之外数组的乘积
  • 【VLLM篇】:原理-实现
  • 飞算JavaAI深度解析:Java开发者的智能革命
  • uni-app X能成为下一个Flutter吗?
  • 完整的登陆学生管理系统(配置数据库)
  • Ubuntu设置