时尚女装网站设计,肇庆seo服务方案,wordpress 表格插件,网站开发中定义路由的作用以下内容源于朱有鹏嵌入式课程的学习与整理#xff0c;如有侵权请告知删除。 一、系统工作原理 1、工作流程 系统的整体工作流程是#xff1a;应用层—API—设备驱动—硬件。 操作系统提供的API包括open、read、write、close等函数#xff0c;它们只是一种操作逻…以下内容源于朱有鹏嵌入式课程的学习与整理如有侵权请告知删除。 一、系统工作原理 1、工作流程 系统的整体工作流程是应用层—API—设备驱动—硬件。 操作系统提供的API包括open、read、write、close等函数它们只是一种操作逻辑并不涉及具体的硬件操作。驱动源码提供真正的open、read、write、close等函数实体。 换个形象的说法API就好比“吃饭”这个操作逻辑没有说明具体怎样吃而驱动程序详细地说明了吃饭的方式比如用什么餐具、吃什么东西、先吃什么后吃什么等等。 2、举例说明 比如通过QQ与他人进行文件传输则需要调用操作系统提供的与套接字有关的API而这些API的逻辑操作最终将映射为网卡驱动中的某些具体操作函数。网卡驱动里面的具体操作函数通过对网卡这个硬件的寄存器的一些设置达到数据传输的目的。 二、注册字符设备
1、如何表示设备与驱动 1设备的表示方法 1与设备有关的两个概念设备文件、设备编号。 在Linux系统中一切皆文件所以设备也表现为文件这种文件叫做设备文件。设备文件的名字就是设备的名字。设备文件一般在/dev目录中。 不同的设备具有不同的设备号以区分不同的设备。设备号由主设备号和次设备号组成其中主设备号表示某一种类的设备次设备号用来区分同一类型的设备。 设备文件名与设备号都是设备的象征就好比某个同学的名字和学号都指向这个同学。 2设备文件的创建 在/dev目录下使用ls -l查看字符设备文件开头字母为c的文件可以得知已有的设备文件的主次设备号。 xjhubuntu:/dev$ ls -l
总用量 0
crw-rw---- 1 root video 10, 175 Jul 16 22:09 agpgart
crw------- 1 root root 10, 235 Jul 16 22:09 autofs
drwxr-xr-x 2 root root 640 Jul 16 22:09 block
drwxr-xr-x 2 root root 100 Jul 17 19:23 bsg
crw------- 1 root root 10, 234 Jul 16 22:09 btrfs-control
drwxr-xr-x 3 root root 60 Jul 16 22:09 bus
lrwxrwxrwx 1 root root 3 Jul 16 22:09 cdrom - sr0
drwxr-xr-x 2 root root 3560 Jul 19 12:56 char
crw------- 1 root root 5, 1 Jul 16 22:09 console
lrwxrwxrwx 1 root root 11 Jul 16 22:09 core - /proc/kcore
drwxr-xr-x 2 root root 60 Jul 16 22:09 cpu 使用cat /proc/devices可以查看内核中已经注册过的字符设备驱动和块设备驱动见下文然后找到一个没被占用的主设备号使用“mknod /dev/xxx c 主设备号 次设备号”来创建设备文件其中xxx表示设备文件名c表示字符设备。 注意xxx不能使用vim来打开但可以用ls /dev/xxx -l查看。 /dev目录下的设备文件与/poc/devices文件中的设备列表它们之间有什么关系proc目录是一个虚拟文件系统可以为linux用户空间和内核空间提供交互它只存在于内存中而不占实际的flash或硬盘空间。/proc/devices/里的设备是加载驱动程序时生成的而/dev/下的设备是通过创建设备节点生成的用户通过此设备节点来访问内核里的驱动。 2驱动的表示方法 可以这么理解file_operation 结构体就象征着驱动。 这个结构体的元素主要是函数指针用来挂接实体函数地址。每个设备驱动都需要一个该结构体类型的变量。设备驱动向内核注册时提供该结构体类型的变量。该结构体的成员函数是字符设备驱动程序设计的主体内容。这些函数在应用程序进行open()、read()等系统调用时被内核调用。 关于此结构体的更多解释见博客file_operations结构体_天糊土的博客-CSDN博客。 2、字符设备的注册register_chrdev()函数 在没有驱动模型前注意不是驱动框架。驱动模型是面向对象的设计区分设备、驱动和总线而驱动框架是指驱动的分层设计包括核心层和具体操作层驱动与设备的注册混为一谈设备号和 file_opertion紧结合一个驱动的信息包含两者。 使用硬件设备之前需要先注册其驱动程序。驱动程序利用内核提供的注册函数向内核注册自己。注册之后内核可以调用此驱动程序去使用硬件。 这里说的注册函数是指register_chrdev()函数。 static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
{return __register_chrdev(major, 0, 256, name, fops);
} 函数所在文件路径/include/linux/fs.h函数作用向内核注册某设备的 file_operations返回值 major如果设置为0则返回自动分配的主设备号 如果设置为指定的主设备号成功则返回值为0失败返回负数。 参数说明 major表示当前设备的主设备号范围是1~254。可以自己指定也可以设置为0让内核自动分配。犹如学号。 name表示当前设备的驱动名称犹如名字。 fops是file_operations结构体指针。 inline修饰符说明 此函数定义在头文件里面如果被两个文件包含就会重复定义。使用inline后就表示函数体而不是函数定义。 三、内核如何管理字符设备驱动 1、管理方法 内核中使用一个数组来存储已注册的字符设备或者说驱动因为这里还没有驱动模型的概念。register_chrdev函数将驱动的信息包括设备号和 file_operations存储在数组中相应的位置。 2、查看已注册的设备驱动 使用cat /proc/devices可以查看内核中已经注册过的字符设备驱动和块设备驱动。 从中我们看到 1有很多同类设备的主设备号是相同的 2有些编号默认分配给了某些设备 3由于使用数组来存储的缘故设备编号只有1~254。 xjhubuntu:/proc$ cat /proc/devices
Character devices:1 mem4 /dev/vc/04 tty4 ttyS5 /dev/tty5 /dev/console
//省略
253 watchdog
254 rtcBlock devices:1 ramdisk2 fd
259 blkext7 loop
//省略
254 mdp