03.杂项设备驱动

作者:神秘网友 发布时间:2021-10-13 07:24:02

03.杂项设备驱动

Linux三大设备驱动

字符设备:IO的传输过程是以字符为单位的,没有缓冲。比如I2C,SPI都是字符设备。

块设备:IO的传输过程是以块为单位的。跟存储相关的,都属于块设备,比如TF卡。

网络设备:与前俩个不一样,是以socket套接字来访问的。

杂项设备(misc device)

1、 本小节讲述的杂项设备是属于字符设备的一种。可以自动生成设备节点。

  我们的系统中有许多杂项设备,可以输入cat /proc/misc来查看。

2、杂项设备除了比字符设备代码简单,还有什么区别

  杂项设备的主设备号是相同的,均为10,次设备号是不同的。主设备号相同就可以节省内核的资源。

3、主设备号和次设备号是什么

  设备号包括主设备号和次设备号,主设备号在Linux系统里是唯一的,次设备号不一定唯一。

  设备号是计算机识别设备的一种方式,主设备号相同的就被视作为同一类设备。

  主设备号可以比作成电话号码的区号,比如北京的区号是010.

  次设备号可以比作电话号码。

  主设备号可以通过命令cat /proc/devices来查看。

4、杂项设备的描述

  定义在内核源码路径:include/linux/miscdevice.h

struct miscdevice  {
    int minor;//次设备号
    const char *name;//设备节点名字
    const struct file_operations *fops;//文件操作集
    struct list_head list;
    struct device *parent;
    struct device *this_device;
    const char *nodename;
    mode_t mode;
};

  include/linux/fs.h讲述了文件操作集的结构体定义

struct file_operations {
    struct module *owner;
    loff_t (*llseek) (struct file *, loff_t, int);
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
    ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
    ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
    int (*readdir) (struct file *, void *, filldir_t);
    unsigned int (*poll) (struct file *, struct poll_table_struct *);
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
    int (*mmap) (struct file *, struct vm_area_struct *);
    int (*open) (struct inode *, struct file *);
    int (*flush) (struct file *, fl_owner_t id);
    int (*release) (struct inode *, struct file *);
    int (*fsync) (struct file *, loff_t, loff_t, int datasync);
    int (*aio_fsync) (struct kiocb *, int datasync);
    int (*fasync) (int, struct file *, int);
    int (*lock) (struct file *, int, struct file_lock *);
    ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
    unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
    int (*check_flags)(int);
    int (*flock) (struct file *, int, struct file_lock *);
    ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
    ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
    int (*setlease)(struct file *, long, struct file_lock **);
    long (*fallocate)(struct file *file, int mode, loff_t offset,
              loff_t len);
};

  里面的一个结构体成员都要对应一个调用。

extern int misc_register(struct miscdevice * misc);//注册杂项设备
extern int misc_deregister(struct miscdevice *misc);//注销杂项设备

5、注册杂项设备的流程

  (1)填充miscdevice这个结构体。

  (2)填充file_operations这个结构体。

  (3)注册杂项设备并生成设备节点。

杂项设备注册实践

按照5中讲述的注册杂项设备的流程实现代码misc.c

 1 #include linux/init.h   
 2 #include linux/module.h
 3 #include linux/miscdevice.h
 4 #include linux/fs.h
 5 
 6 stuct file_operations misc_fops = {
 7     .owner = THIS_MODULE
 8 };
 9 
10 struct miscdevice misc_dev = {
11     ./minor = MISC_DYNAMIC_MINOR,//此宏定义表示自动分配次设备号
12     .name = "hello_misc",//设备名
13     .fops = misc_fops//文件操作集
14     
15 };
16 static int misc_init(void)
17 {
18     int ret;
19     ret = misc_register(misc_dev);
20     if(ret  0)
21     {
22         printk("misc register is error\n");
23     }
24     
25     printk("misc register is succeed\n");
26     return 0;
27 }
28 
29 
30 static int misc_exit(void)
31 {
32     misc_deregister(misc_dev);
33     printk("misc bye bye\n"); 
34     return 0;
35 }  
36 
37 module_init(hello_init);//模块入口
38 module_exit(hello_exit);//模块出口
39 
40 MODULE_LICENSE("GPL");

使用如下的Makefile,编译成模块

obj-m +=helloworld.o #obj-m表示把驱动编译成模块,生成的中间文件名字为helloworld.o

KDIR:=/home/topeet/topeet/imx6ull/linux-imx-rel_imx_4.1.15_2.1.0_ga #指定内核路径

PWD=$(shell pwd) #获取当前目录变量

all:
    make -C $(KDIR) M=$(PWD) modules #make进入到内核源码路径因为编译需要这个环境,把当前路径代码编译成模块

当然不要忘记指定内核的环境变量和交叉编译配置

export CROSS_COMPILE=XXX
export ARCH=arm

编译成功后,加载模块到板子上

insmod misc.ko

查看现象,/dev/路径下有hello_misc

这样,一个最简单的杂项设备就完成了。


本文章教程介绍完毕,更多请访问跳墙网其他文章教程!

03.杂项设备驱动 相关文章

  1. 03_分层分离驱动

    03_分层分离驱动 03_分层分离驱动 1、概念 2、编写程序点灯 2.1、led_dev.c 2.2、led_drv.c 2.3、led_test.c 3、测试 分离:把硬件相关的东西抽出来;把相对稳定的软件部分抽出来。 分层:input.c 向上提供统一给 APP 操作的统一接口。每一...

  2. 戴文的Linux内核专题03 驱动程序

    驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序。没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件)。 Linux的内核代码在驱动程序文件夹中以源代...

  3. 03.腾讯云物联网设备端学习---MQTT控制包概述

    本系列主要目的在于记录腾讯云物联网设备端的学习笔记,并且对设备端SDK进行补充说明。 控制包格式概述 MQTT控制包格式 MQTT所有控制包由3部分组成:固定头部+可变头部+消息体。其中固定头部又分为 包类型、标志以及剩余长...

  4. C++ 杂项知识记录

    C++ 杂项知识记录 C++ 杂项知识记录 各类C++杂项知识 C++ 杂项知识记录 1.前置处理符号 1.1 #pragma once 2.引用和拷贝构造函数 2.1 引用 2.2 拷贝构造函数 ...

  5. bugku杂项-啊哒

    bugku杂项-啊哒 文件下载下来解压后发现是张图片 打开图片没有发现什么有用的信息 看上去就是一个单纯的图片,看了大佬的博客发现这里其实是要用notepad++查看的,这个其实是一个压缩包 拖到winhex发现果然如此 那么就是改后...

  6. 杂项讨论

    目录 Item 53 不要轻忽编译器警告 Item 54 让自己熟悉包括TR1在内的标准程序库 item 55 让自己熟悉boost Item 53 不要轻忽编译器警告 C++警告信息可能指向的是一个错误,虽然没有报error 比如: class B {public: virtual void f() const;};class D : publ...

  7. CTF杂项知识点

    CTF杂项知识点 CTF-杂项 1.File命令 当文件没有后缀名或者有后缀名而无法正常打开时,根据识别出的文件类型来修改后缀名即可正常打开文件 使用场景:不知道后缀名,无法打开文件 [emailprotected]:~# file ctfctf: PNG image data, 731 x 672//...

  8. 内网 | 横向(杂项)

    横向移动 ptx(没有得到明文) pth(pass the hash) 拿不到明文,我们又想用ntlm hashes搞事情 条件:目标的用户名以及ntlm hash 工具:smbmap,crackmapexec,smbexec,msf,mimikatz.exe 注意:在使用pth的时候我们需要注意kb2871997这个补丁,对于非rid500...

  9. Bugku 杂项 中国菜刀

    Bugku 杂项 中国菜刀 在网站上下载下的是一个caodao.zip压缩包,解压缩得到caodao.pcapng文件。 使用wireshark打开caodao.pcapng,查看TCPstream。 发现信息中包含flag.tar.gz,flag应该就包含在一个压缩包中。 使用binwalk进行分析caodao.pcapng文件。 ...

  10. CTF安全杂项deeeeeeaaaaaadbeeeeeeeeeef-200

    【CTF安全杂项】deeeeeeaaaaaadbeeeeeeeeeef-200 今天遇到一个题目,因吹斯汀! 题目链接:http://www.shiyanbar.com/ctf/1983 这个题目其实不难,但有十分有趣=w= 下载好图片,用winHex打开。 很明显一眼就能看到那个iPhone 5,但想象力匮乏的我...

  11. BugkuCTF_杂项003

    BugkuCTF_杂项003 BugkuCTF_杂项 想蹭网先解开密码 Linux2 细心的大象 爆照(08067CTF) 想蹭网先解开密码 (1)用wireshark打开附件 (2)WiFi连接认证的重点在WPA的四次握手包,即eapol协议的包,过滤一下: (3)根据题目,需要爆破WiFi密码...

  12. color_杂项

    color_杂项 下载并解压后发现是七张图片 提示“你见过彩虹吗?”我以为是提取图片中的16进制再转码,但是实际上并没有什么用。 同时,我发现用爱奇艺万能联播打开图片提示出错,这提示图片有被修改的可能。用StegSolve打开,...

  13. bugku ctf 杂项 多彩

    bugku ctf 杂项 多彩 打开后 真的是多彩!! 下载保存图片 使用 stegsolve 打开 下面是使用方法和下载链接 https://blog.csdn.net/qq_42777804/article/details/90238718 然后 往后切换 发现了 YSL 然后 analyse -- data extract preview一下 直接save bin 存

  14. Java理解笔记------杂项

    Java理解笔记------杂项 jvm内存模型 堆内存 方法区 程序计数器 Java虚拟机栈 本地方法栈 运行时常量池 直接内存 堆内存 这是jvm中最大的一块区域,基本上所有的变量和对象实例都在这一块区域存放,所有线程共享的。但是随着jdk...

  15. CTF-安全杂项(六)

    CTF-安全杂项(六) 声明:以下CTF题均来自网上收集,在这里主要是给新手们涨涨见识,仅供参考而已。需要题目数据包的请私信或在下方留言。 11.PaintScan(来源:实验吧) [var1] [var1] 分析: 解压下载的文件并查看: 坐标都有...

  16. CTF-安全杂项(五)

    CTF-安全杂项(五) 声明:以下CTF题均来自网上收集,在这里主要是给新手们涨涨见识,仅供参考而已。需要题目数据包的请私信或在下方留言。 9.WTF?(来源:实验吧) [var1] [var1] 分析: 查看文件 : 发现是一段段重复的字母,...

  17. CTF-安全杂项(十二)

    CTF-安全杂项(十二) 声明:以下CTF题均来自网上收集,在这里主要是给新手们涨涨见识,仅供参考而已。需要题目数据包的请私信或在下方留言。 23.Only one file(来源:实验吧) 分析: 把文件改成zip后缀解压: 下载附件解压...

  18. CTF-安全杂项(四)

    CTF-安全杂项(四) 声明:以下CTF题均来自网上收集,在这里主要是给新手们涨涨见识,仅供参考而已。需要题目数据包的请私信或在下方留言。 7.解码磁带(来源:实验吧) [var1] [var1] 分析: 首先题目给出的编码只有字符 'o' ...

  19. 这是一张单纯的图片(杂项)

    这是一张单纯的图片(杂项) 打开网址,得到图片并下载 打开图片什么都没有,可能是图片隐写。讲图片拖入十六进制编译器中 观察发现中间出现了像unicode的编码,优先考虑Unicode编码。之后用在线转换器即可得到flag{you are rig...

  20. Bugku-杂项部分题目WP

    Bugku-杂项部分题目WP Bugku-MISC-论剑 把图片放进010发现有一串二进制先转ASCII码获得一个关键词,但不知道是什么东西 然后通过搜索FFC2来修改JPEG图片的高度,把00改为01 这里猜出应该是一个7z压缩包文件头,应该被出题人改了文件...

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2021, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词