《Linux Device Drivers》第三章 字符设备驱动程序——note

《Linux Device Drivers》第十八章 TTY驱动程序——note 简介 tty设备的名称是从过去的电传打字机缩写而来,最初是指连接到Unix系统上的物理或虚拟终端Linux tty驱动程序的核心紧挨在标准字符设备驱动层之下,并提供了一系列的功能,作为接口被终端类型设备使用有三种类型的tty驱动程序:控制台、串口和pty/proc/tty/drivers当前注册并存在于内核的tty设备在/sys/class/tty下都有自己的子目录 小型TTY驱动程序 阅读详情
  • 主设备号和次设备号
    • 那些名称被称为特殊文件、设备文件,或者简单称之为文件系统树的节点,它们通常位于/dev目录
    • 通常而言,主设备号标识设备对应的驱动程序
    • 一个主设备号对应一个驱动程序
    • 设备编号的内部表达
      • dev_t(<linux/types.h>)
      • dev_t是一个32位的数,12位表示主设备号,其余20位表示次设备号
      • <linux/kdev_t.h>
        • MAJOR(dev_t dev);
        • MINOR(dev_t dev);
        • MKDEV(int major, int minor);
    • 分配和释放设备编号
      • <linux/fs.h>
        • int register_chrdev_region(dev_t first, unsigned int count, char *name);
        • int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
        • void u nregister_chrdev_resion(dev_t first, unsigned int count);
    • 动态分配主设备号
      • 驱动程序应该始终使用alloc_chrdev_region而不是register_chrdev_region函数
      • 缺点是:由于分配的主设备号不能保证始终一致,所以无法预先创建设备节点
      • /proc/devices
      • 分配主设备号的最佳方式
        • 默认采用动态分配,同时保留在加载甚至是编译时指定主设备号的余地

  • 一些重要的数据结构
    • 三个重要的内核数据结构
      • file_operations
      • file
      • inode
    • 文件操作
      • file_operations结构用来将驱动程序操作连接到设备编号
      • <linux/fs.h>
      • file_operations结构或者指向这类结构的指针称为fops
        • 每个字段必须指向驱动程序中实现特定操作的函数
      • struct module *owner
      • loff_t (*llseek) (struct file *, loff_t, int);
      • ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
      • ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
      • ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
      • ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t *);
      • int (*readdir) (struct file *, ,void *, filldir_t);
      • unsigned int (*poll) (struct file *, struct poll_table_struct *);
      • int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
      • int (*mmap) (struct file *, struct vm_area_struct *);
      • int (*open) (struct inode *, struct file *);
      • int (*flush) (struct file *);
      • int (*release) (struct inode *, struct file *);
      • int (*fsync) (struct file *, struct dentry *, int);
      • int (*aio_fsync) (struct kiocb *, int);
      • int (*fasync) (int, struct file *, int);
      • int (*lock) (struct file *, int, struct file_lock *);
      • ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
      • ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
      • ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *);
      • 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 (*dir_notify) (struct file *, unsigned long);
    • file结构
      • file结构代表一个打开的文件
      • <linux/fs.h>
      • 与用户空间程序中的FILE没有任何关联
      • 指向struct file的指针通常被称为file或filp
      • 字段
        • mode_t f_mode
        • loff_t f_pos
        • unsigned int f_flags
        • struct file_operations *f_op
        • void *private_data
        • struct dentry *f_dentry
    • inode结构
      • 内核用inode结构在内部表示文件
      • 对单个文件,可能会有许多个表示打开的文件描述符的file结构
      • 字段
        • dev_t i_rdev
        • struct cdev *i_cdev
  • 字符设备的注册
    • <linux/cdev.h>
    • 获取一个独立的cdev结构
      • struct cdev *my_cdev = cdev_alloc();
      • my_cdev->ops = &my_fops;
      • owner
    • struct cdev *cdev_alloc(void);
    • void cdev_init(struct cdev *cdev, struct file_operations *fops);
    • int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
    • void cdev_del(struct cdev *dev);
  • open和release
    • open方法
      • 主要工作
        • 检查设备特定的错误
        • 如果设备是首次打开,则对其进行初始化
        • 如有必要,更新f_op指针
        • 分配并填写置于flip->private_data里的数据结构
      • int (*open)(struct inode *inode, struct file *filp);
      • <linux/kernel.h>
        • container_of(pointer, continer_type, container_field);
    • release方法
      • 主要工作
        • 释放由open分配的、保存在filp->private_data中的所有内容
        • 在最后一次关闭操作时关闭设备
  • scull的内存使用
    • <linux/slab.h>
      • void *kmalloc(size_t size, int flags);
      • void kfree(void *ptr);
      • 不应该将非kmalloc返回的指针传递给kfree
      • 将NULL指针传递给kfree是合法的
  • read和write
    • ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp);
    • ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp);
    • 内核代码不能直接引用用户空间的指针
      • 随着驱动程序所运行的架构的不同或者内核配置的不同,在内核模式中运行时,用户空间的指针可能是无效的
      • 即使该指针在内核空间中代表相同的东西,但用户空间的内存是分页的,而在系统调用被调用时,涉及到的内存可能根本不在RAM中
      • 用户空间的指针由用户程序提供,该程序可能存在缺陷或者是个恶意程序
    • 访问用户空间的缓冲区应始终通过内核提供的专用函数完成
      • <asm/uaccess.h>
      • unsigned long copy_to_user(void __user *to, const void * from, unsigned long count)
      • unsigned long copy_from_user(void *to, const void __user *from, unsigned long count);
    • 访问用户空间的任何函数都必须是可重入的,必须能和其他驱动程序函数并发执行,必须处于能够合法休眠的状态
    • read方法
      • 如果返回值等于传递read系统调用的count参数,则说明所请求的字节数传输成功完成了
      • 如果返回值是正的,但比count小,说明部分数据传输成功
      • 如果返回值为,则表示已经到达了文件尾
      • 负值意味着发生了错误,该值指明了发生了什么错误,错误码在<linux/error.h>中定义
      • 现在还没有数据,但以后可能会有
    • write方法
    • readv和writev
      • ssize_t (*readv) (struct file * filp, const struct iovec *iov, unsigned long count, loff_t *ppos);
      • ssize_t (*writev) (struct file *filp, const struct iovec *iov, unsigned long count, loff_t *ppos);
      • iovec结构
        • void __user *iov_base;
        • __kernel_size_t iov_len
深思洛克EliteIV SDK V3.4.1.0 精锐IV单机锁的开发包安装程序,无密码 下载安装后,开发包中包括精锐IV开发手册、各种工具以及开发过程中需要使用的其他资料等。 立即下载

相关推荐

精锐IV加密锁驱动64位elite4

elite4加密狗win7 64位驱动win1064位

elite4 2.x驱动 64位_32位 精锐系列驱动安装包.zip

elite4 2.x驱动 64位_32位 精锐系列驱动安装包.zip

ELITEIV(深思精锐4狗驱动)

深思精锐4狗驱动,深思精锐4狗驱动,深思精锐4狗驱动。

senseiv2.x驱动 支持Win7 64位

senseiv2.x驱动是一款加密狗驱动程序,使用加密狗的软件时是需要此驱动的,本驱动也支持win764位操作系统,欢迎下载使用。驱动安装和说明本驱动是用友通加密盒必装要安装驱动,适用winxp-win7。如果是WIN7系统上安装,请在安装程序上单击右键,选择以管理员,欢迎下载体验

加密狗检测工具12.rar

8种加密狗侦听工具。新增功能: 1:新增一种加密狗检测方式。 2:增加一系列加密狗型号的检测。 目前可以检测的加密狗有50多种,具体能检测的型号如下: 飞天诚信,坚实诚信系列加密狗: 飞天诚信 -ROCKEY 2 飞天诚信 -ROCKEY 3 飞天诚信 -ROCKEY 4(有驱型) 飞天诚信(ftsafe) 飞天4无驱型 飞天诚信 -ROCKEY 6 坚石诚信 -ET199 坚石诚信 -ET99/ET299 飞天诚信/坚石诚信未知型号加密狗 彩虹/赛耐孚系列加密狗: 彩虹 UMI系列加密狗 彩虹 UDA系列加密狗 赛耐孚(SafeNet) 精灵狗UGA(GeniusDog) 彩虹 宏狗 彩虹 未知系列加密狗 赛耐孚(SafeNet) SafeNet Ultra Pro 赛耐孚(SafeNet) USB Security Security Token 赛耐孚(SafeNet) Sentinel Hardware Key 赛耐孚(SafeNet) Sentinel Hardware Key 赛耐孚(SafeNet) Sentinel Hardware Key RTC 赛耐孚(SafeNet) Sentinel Hardware Key Mega-Memory 赛耐孚(SafeNet) Sentinel Hardware Key Mega-Memory RTC 赛耐孚(SafeNet) Sentinel Dual Hardware Key 赛耐孚(SafeNet) Sentinel Dual Hardware Key RTC SafeNet HASP HL SRM 东莞域天系列加密狗: 东莞域之天 YT88加密狗 域天简单型(带密码) 域天 简单型 域天 专业型/经济易用型 东莞域之天 32位智能加密狗 东莞域之天 32位智能加密狗(有驱动型) 东莞域之天未知型号加密狗 深思洛克系列加密狗: 深思洛克(senseLock) 深思3加密狗 深思洛克(senseLock) SenseIV2.x 深思4智能加密狗 深思洛克(SenseLock) 精锐 E(Elite-E)智能狗 深思洛克(senseLock) 灵锐 加密狗 深思洛克(SenseLock) OME速达 3000 Pro,无驱型 龙脉系列加密狗: 龙脉nox2加密狗 世纪龙脉(Century Longmai) NOX 加密狗 龙脉DAM2+加密狗 世纪龙脉(Century Longmai) DAM2 精简型 龙脉DAM2加密狗 世纪龙脉(Century Longmai) NOX+ 单机狗,无驱型 世纪龙脉(Century Longmai DAM2+网络狗 世纪龙脉(Century Longmai) NOX5 主锁 龙脉NOX5加密狗 龙脉其他型号加密狗 江波龙系列加密狗: 江波龙(NetCom) 安全芯(SChip) 加密狗 波龙(NetCom) 易锁(SimpleKey)加密狗,无驱型 其他加密狗: 和升达 SK-USB180 无驱型 杭州唯赛 易锁(Simple Key) 无驱型 上海十条电子 JSP-C USB Key 有驱型 MegaLock 无驱型 WIBU WIBU RU+加密狗 WIBU WIBU U+加密狗

深思4(sense4) 智能狗,有驱型

深思4(sense4) 智能狗驱动

《Linux Device Drivers》第十六章 块设备驱动程序——note

简介 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备Linux内核视块设备为与字符设备相异的基本设备类型Linux块设备驱动程序接口使得块设备可以发挥其最大的功效,但是其复杂程序又是编程者必须面对的一个问题一个数据块指的是固定大小的数据,而大小的值由内核确定数据块的大小通常是4096个字节,但是可以根据体系结构和所使用的文件系统进行改变与数据块对应的是扇区,它是由底层硬件决定大小

Linux/Android/AI 77万+

senseIV2--x64位加密狗驱动

senseIV2--x64位加密狗驱动深思 4

《Linux Device Drivers》第一章 设备驱动程序简介——note

设备驱动程序的作用驱动程序的编写实际上都可以分成两部分 需要提供什么功能(机制)如何使用这些功能(策略) 不带策略的驱动程序包括一些典型的特征 同时支持同步和异步操作驱动程序能够被多次打开充分利用硬件特性 内核功能划分 功能模块 进程管理 创建进程销毁进程进程间通信 信号管道 内存管理 虚拟地址空间 文件系统 Unix的每个对象都可以当作

Linux/Android/AI 39万+

深思精锐IV(senseIV)加密锁开发工具包

深思精锐IV(sense)开发工具包EliteIV_V3.21

EliteIV v2.40.0.1 drivers

EliteIV v2.40.0.1 drivers

Linux 设备驱动学习笔记 - 字符设备驱动篇 - Note.1[主次设备号]

记录一下自己的驱动学习过程,教材是LINUX DEVICE DRIVERS,3RD EDITION,本文章为字符设备驱动部分[主次设备号]

qq_39209508的博客 1220

二、声明式 Pipeline 语法

选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值,例如:parameters { choice(name: ‘CHOICES’, choices: [‘one’, ‘two’, ‘three’], description: ‘’) },表示定义一个名为 CHOICES 的变量,可选的值为 one、two、three;默认情况下,如果定义了某个 stage 的 agent,在进入该 stage 的 agent 后,该 stage 的 when条件才会被评估,但是可以通过一些选项更改此选项。

Cyan_Jiang的博客 1220
上一篇: FFmpeg 基本知识
下一篇: 《Linux Device Drivers》第四章 调试技术——note
pingfengluo
博客等级 码龄14年 260粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值