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

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

时间:2023-10-21 16:57:49浏览次数:32  
标签:GPL MODULE UBUNTU modules helloworld 笔记 && rm 驱动


一、环境

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我直接从网上拷贝,大佬们写的没毛病,只不过编码不一致,编译了好久不过,最后重新自己敲了一遍,又借鉴了已有的另一个大佬的编好的东西才搞定

 

 

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

 

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

相关文章

  • 学习笔记6
    第三章学习总结多任务处理一般指的是同时进行几项独立活动的能力,这种逻辑并行性称为“并发”。进程的概念进程是对映像的执行每个进程用一个独特的数据结构表示,称为进程控制块(PCB)或任务控制块(TCB),本书称为PROC结构体。如下是一个非常简单的PROC结构体:next:指向下一个PROC......
  • 记一次服务器Cuda驱动崩溃修复过程
    基本过程今天实验室师兄在服务器运行深度学习训练时候得到报错CUDAinitialization:UnexpectederrorfromcudaGetDeviceCount()疑似Cuda与NVIDIA显卡驱动沟通中出现了问题,使用nvidia-smi指令时提示FailedtoinitializeNVML:Driver/libraryversionmismatch,经过沟通了解到,重......
  • 《信息安全系统设计与实现》第七周学习笔记
    《信息安全系统设计与实现》第七周学习笔记第三章Unix/Linux进程管理多任务处理多任务处理简单说,就是同一时间给多个程序运行处理数据。即使在系统中通常有许多其他的程序在运行,但进程也可以向每个程序提供一种假象,仿佛它在独占地使用处理器。但事实上进程是轮流使用处理器的......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第六周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第六周学习笔记一、任务要求1.自学教材第3章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X......
  • # 20211301 学习笔记6
    20211301郑润芃学习笔记6第三章教材知识总结3.1多任务处理多任务处理:指同时进行几项独立活动的能力单CPU:一次只能执行一个任务多任务处理:通过不同任务之间多路复用CPU的执行时间上下文切换:不同人物之间的执行切换机制并发:逻辑并行性3.2进程的概念进......
  • 学习笔记6
    第三章.Unix/Linux进程管理多任务处理:指的是同时几项独立活动的能力是所有操作系统的基础,是并行编程的基础进程的概念:进程是对映像的执行在操作系统中,每个进程用一个独立的数据结构表示,叫进程控制块(PCB)和任务控制块(TCB)。本书中称为PROCtypedefstruct......
  • 学习笔记6
    第3章Unix/Linux进程管理一、知识点归纳多任务处理同时进行几项独立活动的能力通过在不同任务之间多路复用CPU的执行时间来实现,即将CPU执行操作从一个任务切换到另一个任务“并发”所有操作系统的基础并行编程的基础进程的概念进程是对映像的执行。PROC结构体U......
  • 《Unix/Linux系统编程》教材学习笔记第三章
    chapter3多任务处理一般来说,多任务处理指的是同时进行几项独立活动的能力。在计算机技术中,多任务处理指的是同时执行几个独立的任务。在单处理器(单CPU)系统中,一次只能执行一个任务。多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务切换到......
  • 开发笔记
    开发笔记环境配置类0.杂项配置M1Mac的python环境:M1miniconda,需要用哪些包先去https://anaconda.org/查询是否只是M1芯片,不支持的貌似安装不了(比如pygame)直接用Pycharm的新建环境,不过不知道下载的是M1版本的还是通过Rosetta转译的。关于jupyternotebook:在base环境......
  • linux内核编译安装(Ubuntu替换内核)
    前言:Ubuntu替换内核一般是不会删除自己Ubuntu里面的东西的(只是内核改变,其它影响,放心搞就是了,而且可以变回原来的内核)实验环境:OS:Ubuntu20.04.2LTSOldKernel:linux5.15.0NewKernel:linux5.15.0(我测试过的只有原版本,升级其它版本试了不能开机)注:查看当前内核版本命令"uname......