资讯专栏INFORMATION COLUMN

驱动程序原理

stackfing / 1830人阅读

驱动程序原理 Linux驱动程序的数据结构

驱动程序本质:接口函数(应用程序可以操作设备)

Linux提供了统一的接口,各个设备厂商实现这个接口

Linux如何管理所有的驱动程序呢

块设备和字符设备

内核中使用了2个全局数组存放2类驱动程序

#define MAX_CHRDEV      255
#define MAX_BLKDEV      255

struct device_struct {
     const char * name;
     struct file_operations * fops;
};

static struct device_struct chrdevs[MAX_CHRDEV];

static struct {
     const char *name;
     struct block_device_operations *bdops;
} blkdevs[MAX_BLKDEV];

驱动程序调用
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops) 把厂商的接口函数fops存放到chrdevs这个数组中

还记得我们查看设备管理的时候看到的主设备号吗,就是数组index

设备节点如何产生

Linux下设备也是文件,只是它们的文件属性特殊而已,应用程序通过文件名来访问设备的驱动程序。

这些文件我们专业点,那就是设备节点。/dev目录下

创建一个设备节点,一个name为mtd4的字符设备节点

mknod /dev/ mtd4 c MTD_CHAR_MAJOR 4

我们创建了一个普通的磁盘文件,没有数据,大小为0,只有文件属性,包括设备类型、主设备号、次设备号
设备节点本质上就是没有内容的文件,只有文件属性,不信你可以vim sda看看,所有文件都是空的

应用程序是如何访问设备驱动的?

例子:向nor flash的第四分区的起始位置偏移512字节写入100字节的数据

  fd = open(“/dev/mtd4”, O_RDWR);
  lseek (fd,512, SEEK_SET);
  write (fd , write_buffer, 100);
  close(fd);

应用程序调用Open函数,这是个系统调用函数,程序会进入内核空间调用sys_open函数

在sys_open,首先会根据文件路径“/dev/mtd4”找到这个文件节点,这部分工作是属于VFS(虚拟文件系统)的

/dev/mtd4的文件属性是字符设备,于是sys_open会调用函数chrdev_open()

在这个函数里有一句话:
filp->f_op = get_chrfops(MAJOR(inode->i_rdev), MINOR(inode->i_rdev));

get_chrfops()里面返回 chrdevs[major].fops

Write()最终一定会调用到chrdevs[major].fops->write();

Read()最终一定会调用到chrdevs[major].fops->read();

各种驱动程序比较特殊的功能函数都可以通过ioctl()来得到调用。

而次设备号也会作为参数传递给你。

参考自Linux驱动程序工作原理

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9230.html

相关文章

  • Quartus II 软件和 DE2-115 开发板使用入门

    摘要:二实验任务及要求熟悉开发环境,掌握原理图输入方式,在中用原理图方式实现半加器,并用中的波形仿真。实验步骤任务一在开始菜单中打开软件。仿真成功后,将半加器设置成可调用的元件,供其它程序调用。该实验完成后直接关掉软件。 ...

    imtianx 评论0 收藏0
  • 重学计算机组成原理(二)- 制定学习路线,攀登“性能”之巅

    摘要:计算机组成中的大量原理和设计,都对应着性能这个词。时间的倒数性能计算机的性能,其实和体力劳动很像,好比是我们要搬东西。对于计算机的性能,我们需要有个标准来衡量。花的时间越少,自然性能就越好。 0 学习路线的知识点概括 showImg(https://segmentfault.com/img/remote/1460000020031616?w=3832&h=2540); 学习计算机组成原...

    DrizzleX 评论0 收藏0
  • 驱动程序原理

    驱动程序原理 Linux驱动程序的数据结构 驱动程序本质:接口函数(应用程序可以操作设备) Linux提供了统一的接口,各个设备厂商实现这个接口 Linux如何管理所有的驱动程序呢 块设备和字符设备 内核中使用了2个全局数组存放2类驱动程序 #define MAX_CHRDEV 255 #define MAX_BLKDEV 255 struct device_struct...

    FullStackDeveloper 评论0 收藏0
  • 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(一)词法分析

    摘要:一般的程序,是无法直接执行的,因为只能识别机器指令。所以要想执行一个程序,首先要将高级语言编写的程序翻译为汇编代码,再将汇编代码翻译为机器指令,这样才能识别并执行。 编译器 编译器是一个程序,作用是将一门语言翻译成另一门语言。 一般的程序,CPU 是无法直接执行的,因为 CPU 只能识别机器指令。所以要想执行一个程序,首先要将高级语言编写的程序翻译为汇编代码,再将汇编代码翻译为机器指令...

    wangdai 评论0 收藏0
  • 每天两小时学习计算机组成原理——一个学期的第一天,希望能坚持长久✨

    计算机组成原理入坑 学习书籍讲什么地位课程组织结构开始学习第一章:计算机系统概论1.1 计算机系统简介1.1.1软硬件概念1.1.2 层次结构1.1.3 计算机组成与计算机系统结构 学习书籍 那我们今天由于有计算机组成原理的课,所以我们在学习过我们的课程后,再次重新对其进行了一个学习,那我看的视频是在B站上的计算机组成原理(唐朔飞),当然这也是up主搬MOOC上的,所以大家要想去看正版可以上...

    googollee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<