linux设备驱动之构造和运行模块

2023-11-04

                                                                                                                                构造和运行模块

        今天开始学习《linux设备驱动程序》第三版这本书,在看到第二章的构造和运行模块的时候,我在linux平台上做了一个小测试。下面就让我说下。      

  1. 在宿主机上安装开发工具和下载linux源码(要求版本号和目标机上的linux内核版本一致)。开发工具主要有gcc、gdb、make等,这些工具在redhat或fc中默认就安装了,在debian或Ubuntu中可以通过下面这个命令安装:
    apt-get install build-essential
    linux源码可以通过以下几种途径获得:
    • 直接去www.kernel.org下载
    • 通过包管理工具下载源码,在debian和Ubuntu中可以通过下面这个命令下载,
      apt-get install linux-source-(版本号) ,下载后的文件在/usr/src目录中,解压到该目录即可

    将源码解压到/usr/src/目录后,进入linux-source-(版本号)目录中执行下面几个命令:
    make oldconfig
    make prepare
    make scripts

  2. 编写Linux驱动程序,以一个最简单的hello.c为例,hello.c的内容如下:
    
    #include "linux/init.h"
    #include "linux/module.h"
    
    static int hello_init(void)
    {
        printk(KERN_ALERT "Hello World linux_driver_module\n");
        return 0;
    }
    
    static void hello_exit(void)
    {
        printk(KERN_ALERT "Goodbey linux_driver_module\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("lpj");
  3. 写Makefile文件,一个示例如下,里面各项参数根据实际情况更改:
    
    #sample driver module
    obj-m := hello.o
    KDIR = /usr/src/linux-source-2.6.24/
    
    all:
         $(MAKE) -C $(KDIR) M=$(PWD)
    
    .PHONY:clean
    clean:
         rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions
    
  4. 编译,在hello.c和Makefile所在目录下执行 make 即可,编译后在当前目录生成hello.ko文件
  5. 加载并测试:加载使用insmod或modprobe命令来实现,如在当前路径执行如下代码:
    insmod hello.ko 或 modprobe hello
    注意,如果在虚拟终端加载内核的话,将看不到内核打印信息,因为内核打印信息不会输出到虚拟终端,而是输出到/proc/kmsg文件中,所以可以通过以下方式查看内核信息:
    • cat /proc/kmsg 会一直打印,需要Ctrl-C手动终止
    • dmesg 或 dmesg | tail -N ,N为一数字,表示显示最后N行
  6. 卸载:使用rmmod命令卸载驱动模块,如 rmmod hello

    在这期间可能会出现一些问题,如果出现的话就自己上网搜素下,我就是这么做的。

    测试可以之后就可以实现更加完备的设备驱动了,期待着自己能够学好设备驱动程序的设计!!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux设备驱动之构造和运行模块 的相关文章

  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • Perl:测试输入阅读器?

    有没有一种方法可以使用标准 Test 等模块自动测试 Perl 程序是否正在读取输入 例如标准输入正确吗 例如 测试一个从 STDIN 读取两个整数并打印它们之和的程序 这不是 100 清楚你的意思 我会回答假设你想编写一个测试脚本来测试你
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • 具有两个同名目标的 Makefile

    我有一个包含包含语句的 makefile 我无法控制包含的 makefile 的内容 不过 我希望能够在 某些 不是全部 目标之前添加一些预处理步骤 考虑以下示例 install echo install target include ot
  • webpack中动态加载外部模块失败

    我正在尝试建立以下架构 一个核心 React 应用程序 它具有一些基本功能 并且能够在运行时加载其他 React 组件 这些额外的 React 组件可以按需加载 并且它们在构建核心应用程序时不可用 因此它们不能包含在核心应用程序的捆绑包中
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • HBase(分布式、面向列、非结构化数据存储,基础框架,设计和操作)总结

    sqoop 总结 1 HBase 介绍 2 面向列数据库 2 1 HBase 与 传统关系数据库的区别 2 2 Hive 和 Hbase区别 2 3 Hbase 和 传统关系型数据库区别 3 Hbase 数据模型 4 HBase 基础架构
  • LeetCode-1324. Print Words Vertically

    Given a string s Return all the words vertically in the same order in which they appear in s Words are returned as a lis
  • 实时数仓建设

    数据智性就显得尤为重要 快速的获取数据反馈能够帮助公司更快的做出决策 更好的进行产品迭代 实时数仓在这一过程中起到了不可替代的作用 一 实时数仓建设的背景 传统意义上的数据仓库主要处理T 1数据 即 今天产生的数据分析结果明天才能看到 随着
  • AD Release 10 PCB 中的常见问题及解决办法

    作为一名新手小白 刚开始进行PCB设计的时候会遇到各种问题 以下是我遇到过的问题及解决办法 希望对大家有用 不正确的地方也请大家多多指正 谢谢 1 silkscreen over component pads 这个报错是说丝印层的文字和焊盘
  • android 移动网络开关打开_手把手教你>> 打开5G开关,畅享极速好网!

    5G小贴士 现在买5G手机的人越来越多 但是你知道吗 5G手机要使用5G网络 必须要打开这个开关 不然就会导致买了5G手机 却用不上5G网络今天小编教你让你的5G手机发挥真正实力 Follow me 各位小伙伴们注意了 想要使用5G网络 必
  • 用 pytorch 进行分类(二分类,多分类)

    import numpy as np import sklearn import torch import torch nn as nn from torch autograd import Variable import torch nn
  • 【Unity】记录一个Findobjectoftype有关的bug

    场景 在写一个多人联机的FPS游戏时 本地启动时 主角是有后坐力的 但是客户端射击没有后坐力 感觉很奇怪 不能房主不开挂其余人全是挂吧 于是打算找一下问题所在 这里计算后坐力的思路是这样的 在鼠标控制的脚本中进行计算后坐力 触发的方法Fir
  • 【HTTP】http重定向301/302/303/307

    一 概述 重定向常常和请求转发放在一起讨论 前者是两次不相关的请求 后者是一次请求服务器端转发 然而本文并不讨论两者的区别 而是HTTP 1 0规范和HTTP 1 1规范中关于重定向的区别 以及实际使用中的情况 重定向实际使用是一个响应码
  • K8S 微服务内存溢出如何排查

    场景 晚上做稳定性压测 早上回来发现内存溢出 2022 06 08 08 29 10 273 ERROR 7 alina utility 2 org apache catalina core StandardServer Error sen
  • mysql中ceil是什么意思_MySQL ceil()函数

    CEIL X CEILING X 该函数返回的最小整数值 但不能小于X 请看下面的例子 mysql gt SELECT CEILING 3 46 CEILING 3 46 4 1 row in set 0 00 sec mysql gt S
  • 【华为OD机试 2023 B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • LeetCode压缩字符串

    给你一个字符数组 chars 请使用下述算法压缩 从一个空字符串 s 开始 对于 chars 中的每组 连续重复字符 如果这一组长度为 1 则将字符追加到 s 中 否则 需要向 s 追加字符 后跟这一组的长度 压缩后得到的字符串 s 不应该
  • 用Python做一个高山滑雪小游戏

    介绍一款好玩的游戏的开发 该游戏名为高山滑雪 改编自 Computer Programming for Kids and other Beginners 的第25章 游戏效果 游戏的基本界面如下 滑雪者由高山上滑下 玩家通过键盘上的左右方向
  • 有序序列判断-c++

    题目描述 输入一个整数序列 判断是否是有序序列 有序 指序列中的整数从小到大排序或者从大到小排序 输入描述 第一行输入一个整数N 3 N 50 第二行输入N个整数 用空格分隔N个整数 输出描述 输出为一行 如果序列有序输出sorted 否则
  • 基于SSL的虚拟专用网络

    基于SSL的虚拟专用网络 基于安全套接层协议 Security Socket Layer SSL 建立远程安全访问通道的虚拟专用网络技术 像简单虚拟专用网络通过安装软件客户端的方式进行安全远程访问服务器虽然与基于硬件形式的相比更便于使用 但
  • Python OpenCV GrabCut进行前景分割和提取

    Python OpenCV GrabCut进行前景分割和提取 1 效果图 1 1 边界框GrabCut效果图 1 2 Mask GrabCut效果图 2 GrabCut原理 2 1 GrabCut是什么及步骤 2 2 grabCut img
  • 信捷服务器Z相信号,信捷plc标记与中断处理小知识

    信捷plc标记与中断处理小知识 有关信捷plc的编程知识 在信捷plc中标记P I用于分支与中断 标记I一般用于中断功能 包括外部中断 定时中断等场合 分支用的标记 P 用于条件跳转或子程序的跳转目标 一 标记P I 标记P I用于分支与中
  • kotlin框架

  • RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available()

    今天在调试yolov7时遇到由题所示报错 Traceback most recent call last File d 1 yolov7 main train py line 609 in
  • linux设备驱动之构造和运行模块

    构造和运行模块 今天开始学习 linux设备驱动程序 第三版这本书 在看到第二章的构造和运行模块的时候 我在linux平台上做了一个小测试 下面就让我说下 在宿主机上安装开发工具和下载linux源码 要求版本号和目标机上的linux内核版本