首页 > 系统相关 >UBUNTU下第一次写简单驱动(笔记)

UBUNTU下第一次写简单驱动(笔记)

时间:2023-04-16 14:14:38浏览次数:64  
标签:GPL MODULE UBUNTU modules helloworld 笔记 && rm 驱动

原文:https://www.freesion.com/article/83831518068/

一、环境

Ubuntu14.04 +vmware tools

二、步骤

先写个.c文件,驱动文件一般没有printf,有自己的一套,先写一个helloword.c

  1.   /*
  2.   * helloworld.c
  3.   *
  4.   * 宇文凌风
  5.   *
  6.   */
  7.    
  8.    
  9.   #include "linux/init.h"
  10.   #include "linux/module.h"
  11.    
  12.   static int helloworld_init(void)
  13.   {
  14.   printk(KERN_ALERT "Hello World linux_driver_module,entry helloworld.ko\n");
  15.   return 0;
  16.   }
  17.    
  18.   static void helloworld_exit(void)
  19.   {
  20.   printk(KERN_ALERT "exit the linux_driver_module helloworld.ko\n");
  21.   }
  22.    
  23.   module_init(helloworld_init);
  24.   module_exit(helloworld_exit);
  25.   MODULE_LICENSE("GPL");
  26.   MODULE_AUTHOR("ywlf");
  27.    
  28.    
  29.    
  30.   /*
  31.   //MODULE_LICENSE("GPL"); // "GPL" 是指明了 这是GNU General Public License的任意版本
  32.    
  33.   // “GPL v2” 是指明 这仅声明为GPL的第二版本
  34.    
  35.   // "GPL and addtional"
  36.    
  37.   // "Dual BSD/GPL"
  38.    
  39.   // "Dual MPL/GPL"
  40.    
  41.   // "Proprietary" 私有的
  42.    
  43.   // 除非你的模块显式地声明一个开源版本,否则内核会默认你这是一个私有的模块(Proprietary)。
  44.    
  45.   //MODULE_AUTHOR // 声明作者
  46.    
  47.   //MODULE_DESCRIPTION // 对这个模块作一个简单的描述,这个描述是"human-readable"的
  48.    
  49.   //MODULE_VERSION // 这个模块的版本
  50.    
  51.   //MODULE_ALIAS // 这个模块的别名
  52.    
  53.   //MODULE_DEVICE_TABLE // 告诉用户空间这个模块支持什么样的设备
  54.   */

紧接着Makefile写起来

  1.   KVERS = $(shell uname -r)
  2.   MODENAME = helloworld
  3.   obj-m += $(MODENAME).o #这个地方务必写成+=,不可写成: ,否则会出现cc -c -o helloworld.o #helloworld.c
  4.   #helloworld.c:9:24: fatal error: linux/init.h: 没有那个文件或目录
  5.   # include "linux/init.h"这样的错误
  6.    
  7.    
  8.   build:kernel_modules
  9.    
  10.   kernel_modules:
  11.   make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
  12.   rm *.order && rm *.symvers && rm *.mod.c && rm *.mod.o && rm *.o
  13.   clean:
  14.   make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
  15.   rm *.order && rm *.symvers && rm *.ko && rm *.mod.c && rm *.mod.o && rm *.o

也可以这样写:

  1.   KVERS = $(shell uname -r)
  2.   MODENAME = helloworld
  3.   obj-m += $(MODENAME).o
  4.   #build:kernel_modules
  5.    
  6.   #kernel_modules:
  7.   all:
  8.   make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
  9.   rm *.order && rm *.symvers && rm *.mod.c && rm *.mod.o && rm *.o
  10.   clean:
  11.   make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
  12.   rm *.order && rm *.symvers && rm *.ko && rm *.mod.c && rm *.mod.o && rm *.o

 

三、运行

这里什么原理呢?

初步的想法就是:

make -C dir:在读取makefile 之前改变到指定的目录dir;

“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成KO文件。

四、运行驱动

查看ko模块的信息 modinfo helloworld.ko

加载驱动

insmod helloworld.ko

sudo insmod helloworld.ko
如果先在另一终端中运行: sudo cat /proc/kmsg 就可以看到有 hello world 打印。

 

卸载驱动也是:sudo rmmod helloworld

对驱动的初步映像就是,依赖于内核的模块编译,最后依赖于内核加载,初步学习,借鉴了很多,切记不可直接拷贝,Makefile我直接从网上拷贝,大佬们写的没毛病,只不过编码不一致,编译了好久不过,最后重新自己敲了一遍,又借鉴了已有的另一个大佬的编好的东西才搞定

     

标签:GPL,MODULE,UBUNTU,modules,helloworld,笔记,&&,rm,驱动
From: https://www.cnblogs.com/bruce1992/p/17323196.html

相关文章

  • 驱动
    linux应用编程其实都是通过调用c库,c库给上层应用提供支配内核(进程、网络等)干活的接口 驱动:在内核中,有个驱动链表管理类所有的设备驱动,驱动插入链表的顺序由设备号检索;设备号分为主设备号和次设备号,主设备号被系统用来确定要调用哪个驱动程序(设备类型:如USB设备,硬盘设......
  • 如何建立目标驱动的软件职业生涯
    不要讨厌你的日常工作大多数开发人员都感到无聊。每天的工作都是永无止境的任务、工单和会议。他们很少觉得与他们正在构建的产品有联系。如果这是你,那不是你的错!大多数软件产品都没有吸引力。另一个约会应用程序或送餐网站。FinTech或AdTech产品只会让富有的公司变得更富......
  • 笔记-01
    1.回顾java1.java基础----软件不要安装在中文目录下。(1)JDK环境---版本:1.8---配置环境变量:[javajavac命令只能在当前所在目录使用]可以在全局使用java和javac命令(2)写了HelloWorld(3)变量语法:数据类型变量名=值;[1]数据类型:基本数据类型和引用数据类型。......
  • Ubuntu系统硬盘安装到其他的电脑上,网络连接不上问题解决
    把Ubuntu系统硬盘安装到其他的电脑上,网络连接不了在一台i5电脑上安装好ubuntu18.04后,把该系统磁盘安装到另外一台i5电脑上。系统可以成功启动,但是不能正常上网。解决办法如下:1)用下面这个命令查看本台电脑上可用的网络接口$ifconfig-a#查看可用的网络接口$iplinks......
  • 最小生成树学习笔记
    定义最小生成树是指给定一个带权连通图G,如果里面有一个子图G'中的边权和加起来最小并且使得所有的点都能两两相通。性质从上述的定义可以看出,最小生成树有以下性质:如果图G中有n个点的话,G'中的边数为n-1且G'中不含有环。最小生成树可能是一个,也可能是多个。......
  • Mathematica学习笔记002-数据导入导出
    如果不能把数据导入导出,Mathematica就只能是个大号计算器了。学会了导入导出,一方面可以把数据、图像结果保存,另一方面也可以将别的程序的中间结果导出成(txt或xls格式),然后交给Mathematica处理,让骑完成高精度计算和绘图。基本操作其实很简单Export["D:\\abc.txt",{{1,2},{3,4......
  • 领域驱动设计-软件核心复杂性应对之道:第二章
    第二章语言的交流和使用2.1模式​ 由于语言上存在鸿沟,领域专家们只能模糊地描述他们想要的东西。开发人员虽然努力去理解一个自己不熟悉的领域,但也只能形成模糊的认识。有少数的团队成员会学着同时说这两种语言,但由于这样的人太少了,信息流会遭遇瓶颈问题,而且他们的翻译也不准......
  • 使用 APT-mirror 四步配置 Ubuntu 本地软件仓库
    我们将向你展示如何在你的Ubuntu个人电脑或Ubuntu服务器中,直接通过Ubuntu官方软件仓库来配置本地软件仓库。在你的电脑中创建一个本地软件仓库有着许多的好处。假如你有许多电脑需要安装软件、安全升级和修复补丁,那么配置一个本地软件仓库是一个做这些事情的高效方法。......
  • Flink零基础学习笔记(一):基础概念
    一、ApacheFlink的定义、架构和原理ApacheFlink是一个分布式大数据处理引擎,可以对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据以内存速度进行快速计算。接下来我们介绍一下这些关键词的意义。处理无界和有界数据任何数据都......
  • 红帽认证RedHat-RHCSA shell的基本应用用户和组管理网络配置和防火墙管理笔记汇总
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......