首页 > 系统相关 >《LINUX设备驱动程序》学习笔记 ——02

《LINUX设备驱动程序》学习笔记 ——02

时间:2023-09-16 09:46:05浏览次数:44  
标签:02 驱动程序 模块 编译 内核 版本 LINUX 加载

1. 编译模块

  构造内核模块之前,需要注意以下条件:正确版本的编译器、模块工具和其他必要的工具。太新的或太老的工具都会对使得模块构造后产生许多复杂的问题,因为内核源代码对编译器做了大量假定,因此新的(或旧的)编译器版本可能导致问题出现。

  另外,尽量运行和模块对应的内核版本。

2. 模块的装载和卸载

——装载

  一个良好设计的模块可以在装载时进行配置,这比编译时进行配置给用户提供了更多的灵活性。但有些情况下仍然需要使用编译时的配置,涉及到模块参数,后续介绍。

  介绍一下insmod命令(它依赖于被定义在 kernel/module.c 中的一个系统调用,函数 sys_init_module 为其分配内存)。

  注意:只有系统调用的名字前带有 sys_ 前缀,而其他任何函数都没有这个前缀。这种命名上的区别是我们在 grep 系统调用时非常方便。

    

   modprobe 的优点是如果在欲加载的模块中检索到不存在的符号,会在该路径下查找其他定义了该符号的模块并加载(即检索并加载依赖模块)。同样的情况如果使用 insmod 则会在系统日志文件中记录 “unresolved symbols”(未解析的符号)消息。

——卸载

  使用 rmmod 工具从内核中移除模块,可能会失败,需要考虑以下两种场景:【1】. 内核认为模块仍然在使用状态(如某个程序打开由该模块导出的设备文件)【2】.内核被配置为禁止移除模块。

  配置内核模块使得内核在模块忙的时候仍然能 "强制" 移除模块也是可能的。

3. 版本依赖

  模块和特定内核定义的数据结构和函数原型紧密相关,即两个版本的内核对名称相同的一个接口定义可能完全不同。内核并不能知道这一点,因此构造时需要将模块和当前内核树中的一个文件 (即vermagic.o)链接(该文件包含大量有关内核的信息),在试图装载模块时,这些信息可以检查模块和正在运行的内核兼容性。(查看系统日志 /var/log/messages 将看到导致加载失败的具体原因)

  为了写一个能够兼容多个内核版本一起工作的内核模块(尤其是跨主发行号工作),则必须使用宏和 #ifdef 来构造自己的代码。有三个相关的宏:

UTS_RELEASE

LINUX_VERSION_CODE

KERNEL_VERSION(major, minor, release)

  最好的做法是将所有的相关的 #ifdef 预处理放在一个特定的头文件里。一般来说依赖于特定版本(或平台)的代码应该隐藏在低层宏或者函数后,之后高层宏可以直接调用这些函数而无需关注低层细节,这样的代码阅读性和健壮性更强。

4. 平台依赖

  考虑到不同进的目标平台的性能,内核需要发布源码,然后针对目标平台定制编译后才能达到对某个特定计算机集合的优化。

  如果我们希望编写一个驱动程序用于一般性的发布,则必须考虑不同处理器变种的兼容性。通常有两种方法:【1】用GPL许可证来发布自己的程序,并将其贡献给内核主分支。【2】以源代码 + 一组用于编译的脚本发布自己的驱动程序。

  

  

标签:02,驱动程序,模块,编译,内核,版本,LINUX,加载
From: https://www.cnblogs.com/hw-blog/p/17703128.html

相关文章

  • Linux CentOS7 开启SSH访问配置
    0、检查是否安装SSHrpm-qa|grepssh图为已安装的输出 1、安装文本编辑器 1.1、安装vimyum-yinstallvim安装openssh-serveryuminstall-yopensslopenssh-server 2、安装与配置SSH服务 2.1、安装openssh-serveryuminstall-yopensslopenssh-s......
  • Linux CentOS7 关闭防火墙
    1、查看防火墙状态systemctlstatusfirewalld.serviceactive(running)表示防火墙已打开2、关闭防火墙systemctlstopfirewalld.service3、再次查看防火墙状态,确认已关闭systemctlstatusfirewalld.service4、永久关闭防火墙,不执行禁用将在重启后防火墙自动开启s......
  • 树莓派4b装系统到运行 Blazor Linux 本地程序全记录
    在Linux下运行gui程序,咱也是第一次做,属于是瞎子过河乱摸一通,写得有什么不对和可以优化的地方,希望各位看官斧正斧正.1.下载烧录器https://www.raspberrypi.com/software/我选择的是Raspbian64位系统,并配置好ssh账号密码,wifi,以便启动后可以直接黑屏ssh连接2.启用roo......
  • Linux操作系统详解
    引言Linux是一个开源的Unix-like操作系统。它是由芬兰计算机科学家LinusTorvalds于1991年首次发布。Linux以其稳定性,安全性和灵活性而受到欢迎,并被广泛用于服务器,超级计算机,嵌入式系统和许多其他平台。在某些领域,例如智能手机和平板电脑(主要是Android操作系统),Linux的衍生品也非常......
  • kali linux换源
    换源地址vim/etc/apt/sources.list#Seehttps://www.kali.org/docs/general-use/kali-linux-sources-list-repositories/#debhttp://http.kali.org/kalikali-rollingmaincontribnon-freedebhttps://mirrors.tuna.tsinghua.edu.cn/kalikali-rollingmaincontribnon-f......
  • Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2) A. Divide
    有一个长为\(n\)的数组,可以执行以下整份操作任意次:选择任意两个数\(a_i,a_j\),满足\(2\mida_i\)\(a_i=\frac{a_i}{2}\)\(a_j=2\cdota_j\)请找到经过任意此操作后的最大\(\sum_{i=1}^{n}a_i\)。在唯一分解定理下讨论两个数\(a_i=2^{\alpha_i}\cdotx,a......
  • 2023年9月15日 天气:晴
    今天学会了如何生成图片,然后在图片上生成随机数。importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.image.BufferedImage;importjava.io.FileOutputStream;importjava.util.Random;publicclassMain2{publicstaticvoidmain(String[]args)throw......
  • Notion客户端最新汉化教程(2023年09月)
    2023年09月亲测可用!最新汉化包下载链接:https://github.com/geniyangge/notion_zh/releases/download/Notion%E6%B1%89%E5%8C%96/notion-zh_CN.zip你需要找到下面的目录C:\Users\你的用户名\AppData\Local\Programs\Notion\resources\app\renderer把下载解压后的汉化文......
  • 2023.9.15
    今天在继续研究昨天剩下的一些疑问,就是感觉一些地方很奇怪,看ctfwiki上的堆上的格式化字符串漏洞,和正常的格式化字符串漏洞利用好像没多大区别,只是用了pivoting的思想,没感觉到字符串在堆上有什么影响明天看看能不能把这些问题解决掉......
  • 2023.9.15——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午考试,下午帮助同学。我了解到的知识点:1.实现建民老师的HBase试题的插入部分;明日计划:1.完成我的任务......