九江建设监督网站,网站建设的目标是什么,用微信小程序怎么做网站,wordpress置顶到首页从上文中可知#xff0c;在Linux用户空间中#xff0c;如若需要操作硬件设备#xff0c;均通过/dev目录下的设备文件节点进行操作#xff0c;基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中#xff0c;其表示字符设备的结构成员也提供了相应的设备号… 从上文中可知在Linux用户空间中如若需要操作硬件设备均通过/dev目录下的设备文件节点进行操作基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中其表示字符设备的结构成员也提供了相应的设备号。 设备号成员为dev_t dev;那么其与设备之间的关系是什么呢它又与用户空间的操作是和关系 一、设备号 那么设备文件节点又是如何与Linux内核驱动程序进行对应的映射关系呢答案是主设备号。 在前文举例过可能会存在多个相同的设备运行在Linux系统中这些设备所使用的是同一个内核驱动程序那么是如何区分各个设备的呢答案是次设备号。 那么设备号在用户空间中是如何体现的呢 在我们现有的Linux系统中进行/dev目录下执行命令。 命令ls -l 如上图所示在其设备节点文件的属性中可以查看到设备节点的主设备号和次设备号。其中逗号‘’前为主设备号后为次设备号。并且如上图所示对于loop设备而言其有很多相同的设备运行在Linux操作系统中那么他们的各个相同的设备都具有唯一的节点名称但他们的主设备号相同均为7次设备号不同按照节点的顺序进行排列。 二、设备号操作 在Linux内核源码中使用结构体dev_t类型来定义设备号。实际上dev_t类型为32位的unsigned int类型在Linux内核源码中可以进行跟踪。其中高12位作为存储主设备号低20位作为存储次设备号。 那么就存在了如下几个问题 1.如果知道主设备号和次设备号那么怎么组合成dev_t类型的数据 在Linux内核中提供了MKDEV方法宏来进行组合主设备号和次设备号。其原型如下 用法为dev_t dev MKDEV(主设备号,次设备号) 2.如何从dev_t类型的数据中解析出主设备号 如上图在Linux内核中采用了MAJOR方法宏来进行解析主设备号。用法如下 主设备号 MAJOR(dev_t dev) 3.如何从dev_t类型的数据中解析出次设备号 如上图在Linux内核中采用了MINOR方法宏来进行解析主设备号。用法如下 次设备号 MINOR(dev_t dev) 三、设备号分配/申请 因为是在Linux内核框架下进行编写设备驱动程序那么每一个设备的设备号可以有Linux内核提供的方法来进行分配。 Linux内核中如何为设备分配一个主设备号 实际上在Linux内核中提供了两种方法可以进行分配主设备号。分别为静态申请设备号和动态分配设备号。 静态申请设备号程序员自己选择一个数字作为某一个设备的主设备号再确定其次设备号实际上如果是单一的设备通常次设备号为0通过组合得到设备号然后通过函数register_chrdev_region向内核申请主设备号使用。其原型如下 静态申请设备号的缺点在于如果所申请的设备号已经在内核中被其他设备驱动使用了则会申请失败。并且另一点是在Linux内核中存在一些设备驱动的设备号为固定的设备号例如串口UART、I2C设备驱动等。 动态分配设备号Linux内核提供方法函数alloc_chrdev_region由内核动态的分配一个可用的主设备号给相应的设备驱动。其原型为 动态分配设备号的优点在于因为Linux内核本身自己知道了哪些设备号已经被使用了所以基本不会导致分配到已用了的设备号从而不会申请设备号失败。 四、设备号注销 实际上无论是使用动态分配得到的设备号还是使用静态申请得到的设备号当Linux系统中不再需要相应的硬件设备时可将其设备驱动进行注销那么重要的一步就是在设备驱动退出时使用方法函数unregister_chrdev_region函数释放相应的设备号。其原型为 设备号释放后设备节点文件将不存在。 嵌入式物联网需要学的东西真的非常多千万不要学错了路线和内容导致工资要不上去 分享大家一个资料包差不多150多G。里面学习内容、面经、项目都比较新也比较全点击找小助理领取