分享
分销 收藏 举报 申诉 / 43

类型Linux字符设备驱动程序培训教材.pptx

  • 上传人:人****来
  • 文档编号:14510222
  • 上传时间:2026-10-03
  • 格式:PPTX
  • 页数:43
  • 大小:1.54MB
  • 下载积分:10 金币
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Linux 字符 设备 驱动程序 培训教材
    资源描述:
    IOTek Information Tchnology,*,Click to edit Master title style,IOTek Information Tchnology,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,IOTek Information Tchnology,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,IOTek Information Tchnology,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,IOTek Information Tchnology,*,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,*,Chapter,*,static void Main(string,args),Console.WriteLine(请输入一个字符串:);/输入提示,/从控制台读入字符串,string,line,=Console.ReadLine();,/循环输出字符串中的字符,foreach(char c in,line,),Console.WriteLine(c);,Console.ReadLine();,static void Main(string,args),Console.WriteLine(请输入一个字符串:);/输入提示,/从控制台读入字符串,string,line,=Console.ReadLine();,/循环输出字符串中的字符,foreach(char c in,line,),Console.WriteLine(c);,Console.ReadLine();,依次循环字符串中的每个字符,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Linux,字符设备驱动程序,Linux,驱动程序的分类,字符设备驱动,:,用于驱动能够像字节流(文件)一样被访问的设备。应用程序通常可以利用,open,、,close,、,read,、,write,等系统调用访问字符设备驱动。,块设备驱动,:,块设备和字符设备只在系统内核内部的管理上有所区别。应用程序对于字符设备的每一个,I/O,操作都会被内核直接传递给对应的驱动程序;而应用程序对于块设备的操作要经过虚拟文件系统(,VFS,)和缓冲区管理系统间接地传递给驱动程序处理。,网络设备驱动,:,应用程序必须利用套接字,(socket),接口访问网络设备。,网络设备驱动程序,字符设备驱动程序基本结构,字符设备开发的基本步骤,确定主设备号和次设备号,实现字符驱动程序,实现,file_operations,结构体,构造字符设备结构体,cdev,在模块加载函数中注册字符设备,在模块卸载函数中注销字符设备,创建设备文件节点,设备文件与设备号,为了体现“一切都是文件”的设计思想,,linux,将每个已安装的设备都表示为一个,设备文件,。,设备文件通常位于,/dev,子目录,。,对于字符设备,应用程序可以利用,open,、,close,、,read,、,write,等系统调用访问其设备文件,这些,I/O,操作都被直接传递给该设备文件所对应的设备。,每个设备文件中都存储了该设备的,“,主设备号,”,和,“,次设备号,”,。,一般由同一个内核模块管理的多个设备占用同一个主设备号,具体设备用次设备号标识。,用,mknod filename c major minor,命令创建设备文件,用,rm filename,命令删除设备文件。注意删除设备文件并不会影响驱动模块。,应用程序如何访问设备,fd1=open(“/dev/ttyS1”,O_RDWR);/,阻塞,fd2=open(“/dev/ttyS1”,O_RDWR|O_NONBLOCK);/,非阻塞,int read(int fd,const void*buf,size_t length);,int write(int fd,const void*buf,size_t length);,int lseek(int fd,offset_t offset,int whence);,int ioctl(int fd,int cmd,void*arg);,int close(int fd);,设备号的内部表达,设备编号的内部表达,dev_t,类型,(32,位):,用来保存设备编号,(,包括主设备号,(12,位,),和次设备号,(20,位,),从,dev_t,获得主设备号和次设备号:,MAJOR(dev_t);,MINOR(dev_t);,将主设备号和次设备号转换成,dev_t,类型:,MKDEV(int major,,,int minor),;,主设备号与次设备号,分配主设备号,手工分配主设备号:找一个内核没有使用的主设备号来使用。,#include,int register_chrdev_region(dev_t first,unsigned int count,char*name),;,要分配的设备编号范围的起始值,次设备号经常为,0,所请求的连续设备编号的个数,和该编号范围关联的设备名称,主设备号与次设备号,动态分配主设备号:,#include,int alloc_chrdev_resion(dev_t*dev,,,unsigned int firstminor,,,unsigned int count,,,char*name),;,输出的设备号,要使用的被请求的第一个次设备号,主设备号与次设备号,释放设备号,void unregister_chrdev_region(dev_t first,unsigned int count);,通常在模块的清除函数中调用。,记录字符设备的结构体,cdev,实现字符驱动程序,cdev,结构体,struct cdev,struct kobject kobj;/*,内嵌的,kobject,对象*,/,struct module*owner;/*,所属模块*,/,struct file_operations*ops;/*,文件操作结构体*,/,struct list_head list;,dev_t dev;/*,设备号*,/,unsigned int count;,;,cdev,的,kobj,、,list,、,count,字段不用我们关系和维护(内核代劳),我们只需将其,ops,字段指向为我们自己的,file operations,结构。,对,cdev,结构体的操作,操作,cdev,的函数,void cdev_init(struct cdev*,struc t file_operations*);,struct cdev*cdev_alloc(void);,int cdev_add(st ruct cdev*,dev_t,unsigned);,void cdev_del(struct cdev*);,用于初始化,cdev,的成员,并建立,cdev,和,file_operations,之间的连接,分别向系统删除一个,cdev,,完成字符设备的注销,通常在模块的卸载函数中调用,分别向系统添加一个,cdev,,完成字符设备的注册,通常在模块加载函数中调用,函数用于动态申请一个,cdev,内存,file_operations,结构体,file_operations,结构体,字符驱动和内核的接口:,在,include/linux/fs.h,定义,字符驱动只要实现一个,file_operations,结构体并注册到内核中,内核就有了操作此设备的能力。,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*);,unsigned,int,(*poll)(,struct,file*,struct,poll_table_struct*);,int,(*ioctl)(,struct,inode*,struct,file*,unsigned,int,unsigned,long,);,int,(*open)(,struct,inode*,struct,file*);,int,(*flush)(,struct,file*,fl_owner_t id);,int,(*release)(,struct,inode*,struct,file*);,/,;,file_operations,结构体,file_operations,的主要成员:,struct module*owner:,指向模块自身,open,:,打开设备,release,:,关闭设备,read,:,从设备上读数据,write,:,向设备上写数据,ioctl,:,I/O,控制函数,llseek,:,定位读写指针,mmap,:,映射设备空间到进程的地址空间,file operations,的初始化,struct,file_operations my_fops=,.owner=THIS_MODULE,.llseek=my_llseek,.read=my_read,.write=my_write,.ioctl=my_ioctl,.open=my_open,.release=my_release,;,file,结构体,file,结构代表一个打开的文件,它由内核在应用程序,open,时创建,并将该文件所对应的,file operations,记录在,file,结构中。,在应用程序调用,close,函数,内核会释放该数据结构。,struct file,struct file_operations*f_op;,unsigned int f_flags;,fmode_tf_mode;,loff_tf_pos;,structdentry*f_dentry,void*private_data;,;,file,结构体,file,结构体,file,结构:,file_operations,结构相关的一个结构体。,描述一个正在打开的设备文件。,成员:,loff_t f_pos:,当前读,/,写位置,unsigned int f_flags,标识文件打开时,是否可读或,可写,O_RDONLY,O_NONBLOCK,O_SYNC,struct file_operations*f_op,文件相关的操作,指向所实现的,struct,file_operations,void*private_data:,私有数据指针。驱动程序可以将这个字段用于任何目的或,者忽略这个字段。,inode,结构体,内核用,inode,结构在内部表示文件,用于存储文件访问权限、属主、组、大小、生产时间等,VFS,关心的信息。,其字段中我们只关心,i_rdev(,设备号,),,和,i_cdev,(和该文件所对应的,cdev,结构),我们在创建设备文件时,内核会自动创建一个对应的,inode,结构体,并将其,i_cdev,字段指向对应的字符设备结构体,cdev(,事先已经在内核中注册过,),。,Inode,与,file,的区别:,file,表示打开的文件描述符,多个,file,结构,可以指向单个,inode,结构。,struct inode,dev_t i_rdev;,struct cdev*i_cdev;,/,;,Inode,结构体,Inode,结构中的两个主要字段:,dev_t i_rdev,;,对表示设备文件的,inode,结构,该字段包含了真正的设备编号。,struct cdev*i_cdev,;,struct cdev,是表示字符设备的内核的内部结构。,当,inode,指向一个字符设备文件时,该字段包含了指向,struct cdev,结构的指针,从一个,inode,中获得主设备号和次设备号:,unsigned int iminor(struct inode*inode),;,unsigned int imajor(struct inode*inode),;,字符设备驱动程序基本结构,注册设备,在模块或驱动初始化时调用,Linux-2.4,及之前,Linux-2.6,int,register_chrdev,(unsigned int major,const char*name,struct file_operations*fops),如何操作字符设备的接口,void,cdev_init,(struct cdev*,struc t file_operations*);,int,cdev_add,(st ruct cdev*,dev_t,unsigned);,字符设备驱动程序基本结构,注销设备,:,在模块卸载时调用,Linux-2.4,及之前,Linux-2.6,int,unregister_chrdev,(unsigned int major,const char*name);,void,cdev_del,(struct cdev*);,字符设备驱动程序基本结构,/,设备驱动模块加载函数,static int _init xxx_init(void),.,cdev_init(/,初始化,cdev,xxx_dev.cdev.owner=THIS_MODULE;,/,获取字符设备号,if(xxx_major),register_chrdev_region(xxx_dev_no,1,DEV_NAME);,else,alloc_chrdev_region(,ret=cdev_add(/,注册设备,.,字符设备驱动程序基本结构,/*,设备驱动模块卸载函数*,/,static void _exit xxx_exit(void),unregister_chrdev_region(xxx_dev_no,1);/,释放占用的设备号,cdev_del(/,注销设备,.,字符设备驱动程序基本结构,打开,模块使用计数加,1,识别次设备号,硬件操作:,检查设备相关错误(诸如设备未就绪或类似的硬件问题);,如果设备是首次打开,则对其初始化;,如果有中断操作,申请中断处理程序;,int open(struct inode*inode,struct file*filp);,字符设备驱动程序基本结构,关闭,模块使用计数减,1,释放由,open,分配的,保存在,filpprivate_data,里的所有内容。,硬件操作,:,如果申请了中断,则释放中断处理程序。,在最后一次关闭操作时关闭设备。,int release(struct inode*inode,struct file*filp);,字符设备驱动程序基本结构,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);,指向用户空间的缓冲区,这个缓冲区或者保存将写入的数据,或者是一个存放新读入数据的空缓冲区。,用户在文件中存取操作的位置,字符设备驱动程序基本结构,用户空间和内核空间之间的数据拷贝过程,,不能简单的用指针操作或者,memcpy,来进行数据拷贝,用户空间的数据是可以被换出的,会产生一个页面失效异常。,用户空间的地址无法在内核空间中使用。,用户空间和内核空间之间进行数据拷贝的函数:,如果要复制的内存是简单类型,如,char,、,int,、,long,等,,put_user(),和,get_user(),unsigned long,copy_from_user,(void*to,const void _user*from,unsigned long count);,unsigned long,copy_to_user,(void _user*to,const void*from,unsigned long count);,字符设备驱动程序基本结构,读设备模板,ssize_t xxx_read(struct file*filp,char _user*buf,size_t count,loff_t*f_pos),.,copy_to_user(buf,.,.);,.,写设备模板,ssize_t xxx_write(struct file*fil p,const char _user*buf,size_t count,loff_t*f_pos),.,copy_from_user(.,buf,.);,.,字符设备驱动程序基本结构,ioctl,函数,为设备驱动程序执行“命令”提供了一个特有的入口点,用来设置或者读取设备的属性信息。,int ioctl(struct inode*inode,struct file*filp,unsigned int cmd,unsigned long arg);,事先定义的,IO,控制命令,代码,arg,为对应于,cmd,命令的参数,int open(struct inode*inode,struct file*filp);,ssize_t read(struct file*filp,char _user*buff,size_t count,loff_t*offp);,当inode指向一个字符设备文件时,该字段包含了指向struct cdev结构的指针,ioctl=my_ioctl,file operations的初始化,1、拷贝test到drivers路径下,11、以我独沈久,愧君相见频。,序列号(number),21:53:5721:53:5721:5310/25/2022 9:53:57 PM,序列号(number),用rm filename命令删除设备文件。,unsigned int f_flags,定义Linux内核的编译规则,选择按“N”,如果选择某项编译为模块按“M”,进入子菜单按“Enter”,返回,struct cdev*i_cdev;,字符设备驱动程序基本结构,cmd,参数的定义,不推荐用,0 x1,,,0 x2,,,0 x3,之类的值,Linux,对,ioctl(),的,cmd,参数有特殊的定义,构造命令编号的宏:,_IO(type,,,nr),用于构造无参数的命令编号;,_IOR(type,,,nr,,,datatype),用于构造从驱动程序中读取数据的命令编号;,_IOW(type,,,nr,,,datatype),用于写入数据的命令;,_IOWR(type,,,nr,,,datatype),用于双向传输。,type,和,number,位字段通过参数传入,而,size,位字段通过对,datatype,参数取,sizeof,获得。,设备类型(,type,),序列号(,number,),方向(,direction,),数据尺寸(,size,),8bit,8bit,2bit,13/14bit,字符设备驱动程序基本结构,Ioctl,函数模板,int xxx_ioctl(struct inode*inode,struct f ile*filp,unsigned int cmd,unsigned long arg),.,switch(cmd),case XXX_CMD1:,.,break;,case XXX_CMD2:,.,break;,default:/*,不能支持的命令*,/,return-ENOTTY;,return 0;,阶段总结,阶段总结,ioctl=my_ioctl,11、成功就是日复一日那一点点小小努力的积累。,make menuconfig,12、越是无能的人,越喜欢挑剔别人的错儿。,分别向系统添加一个cdev,完成字符设备的注册,通常在模块加载函数中调用,int write(int fd,const void*buf,size_t length);,10月-2207:35:2307:35Oct-2226-Oct-22,CROSS_COMPILE?=arm-linux-,在drivers/Makefile中加入:obj-$(CONFIG_TEST)+=test/,CROSS_COMPILE?=arm-linux-,int main(void),/*设备驱动模块卸载函数*/,要使用的被请求的第一个次设备号,loff_t(*llseek)(struct file*,loff_t,int);,ssize_t read(struct file*filp,char _user*buff,size_t count,loff_t*offp);,26 十月 20227:35:23 上午07:35:2310月-22,添加驱动程序到内核,配置内核,编译内核,添加驱动程序到内核中,添加驱动程序到内核,配置内核,配置命令包括,:,make config,make menuconfig,make xconfig,make gconfig,可通过“上”、“下”、“左”、“右”键移动菜单,选择某项按“,Y”,,取消,选择按“,N”,,如果选择某项编译为模块按“,M”,进入子菜单按“,Enter”,返回,上一级菜单按“,Esc”,使用,make config,、,make menuconfig,等命令后,会生成一个,.config,配置文件,(,是,隐身文件,通过,ls a,才能看到,),添加驱动程序到内核,编译内核,可用如下命令编译内核,:,make ARC=arm CROSS_COMPILE=arm-linux-zImage,源代码根目录的,Makefile,中将,ARCH,和,CROSS_COMPILE,直接指定为,arm,和,arm-linux-,,如:,这样就没有必要每次编译的时候都指定体系结构和交叉编译器了,只须使用下面命令就可以了:,make zImage,ARCH?=arm,CROSS_COMPILE?=arm-linux-,添加驱动程序到内核,添加驱动程序到内核,Linux 2.6,内核的配置系统由以下,3,个部分组成。,Makefile,:,分布在,Linux,内核源代码中的,Makefite,定义,Linux,内核的编译规则,配置文件,(Kconfig),:给用户提供配置选择的功能。,配置工具:,包括配置命令解释器,(,对配置脚本中使用的配置命令进行解释,),配置用户界面,(,提供字符界面和图形界面,),。,这些配置工具都是使用脚本语言编写的,如,Tcl/TK,、,Perl,等。,在,Linux,内核中增加程序需要完成以下,3,项工作。,将编写的源代码复制到,Linux,内核源代码的相应目录。,在目录的,Kconfig,文件中增加新源代码对应项目的编译配置选项。,在目录的,Makefile,文件中增加对新源代码的编译条目。,添加驱动程序到内核,实例:,在内核源代码,drivers,目录下为,ARM,体系结构新增,test driver,test driver,的树形目录:,步骤:,1,、拷贝,test,到,drivers,路径下,2,、为新增目录创建,Kconfig,和,Makefile,3,、修改新增目录父目录的,Kconfig,和,Makefile,,以便新增的,Kconfig,和,Makefile,能够被引用,4,、在,arch/arm/Kconfig,里增加,source“drivers/test/Kconfig”,添加驱动程序到内核,步骤:,1,、拷贝,test,到,drivers,路径下,cp fr test linux_kernel_path/drivers,2,、为新增目录创建,Kconfig,和,Makefile,添加驱动程序到内核,修改新增目录的父目录的,Kconfig,和,Makefile,在,drivers/Kconig,中加入:,source drivers/test/Kconfig“,在,drivers/Makefile,中加入:,obj-$(CONFIG_TEST)+=test/,在,arch/arm/Kconfig,里加入:,source“drivers/test/Kconfig”,增加了,Kconfig,和,Makefile,文件之后的新的,test,树型目录如下所示:,用户空间调用设备驱动程序,创建设备节点,$mknod/dev/node_name c major minor,示例代码,int main(void),int dev_fd;,char read_buf10;,dev_fd=open(/dev/node_name,O_RDWR|O_NONBLOCK);,if(dev_fd=-1),printf(Cannt open file/dev/node_name n);,exit(1);,read(dev_fd,read_buf,5);,ioctl(dev_fd,XXX_IOCTL_CMD,0);,close(dev_fd);,return 0;,9,、静夜四无邻,荒居旧业贫。,10月-26,10月-26,Saturday,October 3,2026,10,、雨中黄叶树,灯下白头人。,04:30:38,04:30:38,04:30,10/3/2026 4:30:38 AM,11,、以我独沈久,愧君相见频。,10月-26,04:30:38,04:30,Oct-26,03-Oct-26,12,、故人江海别,几度隔山川。,04:30:38,04:30:38,04:30,Saturday,October 3,2026,13,、乍见翻疑梦,相悲各问年。,10月-26,10月-26,04:30:38,04:30:38,October 3,2026,14,、他乡生白发,旧国见青山。,03 十月 2026,4:30:38 上午,04:30:38,10月-26,15,、比不了得就不比,得不到的就不要。,。,十月 26,4:30 上午,10月-26,04:30,October 3,2026,16,、行动出成果,工作出财富。,2026/10/3 4:30:38,04:30:38,03 October 2026,17,、做前,能够环视四周;做时,你只能或者最好沿着以脚为起点的射线向前。,4:30:38 上午,4:30 上午,04:30:38,10月-26,9,、没有失败,只有暂时停止成功!。,10月-26,10月-26,Saturday,October 3,2026,10,、很多事情努力了未必有结果,但是不努力却什么改变也没有。,04:30:38,04:30:38,04:30,10/3/2026 4:30:38 AM,11,、成功就是日复一日那一点点小小努力的积累。,10月-26,04:30:38,04:30,Oct-26,03-Oct-26,12,、世间成事,不求其绝对圆满,留一份不足,可得无限完美。,04:30:38,04:30:38,04:30,Saturday,October 3,2026,13,、不知香积寺,数里入云峰。,10月-26,10月-26,04:30:38,04:30:38,October 3,2026,14,、意志坚强的人能把世界放在手中像泥块一样任意揉捏。,03 十月 2026,4:30:38 上午,04:30:38,10月-26,15,、楚塞三湘接,荆门九派通。,。,十月 26,4:30 上午,10月-26,04:30,October 3,2026,16,、少年十五二十时,步行夺得胡马骑。,2026/10/3 4:30:38,04:30:38,03 October 2026,17,、空山新雨后,天气晚来秋。,4:30:38 上午,4:30 上午,04:30:38,10月-26,9,、杨柳散和风,青山澹吾虑。,10月-26,10月-26,Saturday,October 3,2026,10,、阅读一切好书如同和过去最杰出的人谈话。,04:30:38,04:30:38,04:30,10/3/2026 4:30:38 AM,11,、越是没有本领的就越加自命不凡。,10月-26,04:30:38,04:30,Oct-26,03-Oct-26,12,、越是无能的人,越喜欢挑剔别人的错儿。,04:30:38,04:30:38,04:30,Saturday,October 3,2026,13,、知人者智,自知者明。胜人者有力,自胜者强。,10月-26,10月-26,04:30:38,04:30:38,October 3,2026,14,、意志坚强的人能把世界放在手中像泥块一样任意揉捏。,03 十月 2026,4:30:38 上午,04:30:38,10月-26,15,、最具挑战性的挑战莫过于提升自我。,十月 26,4:30 上午,10月-26,04:30,October 3,2026,16,、业余生活要有意义,不要越轨。,2026/10/3 4:30:38,04:30:38,03 October 2026,17,、一个人即使已登上顶峰,也仍要自强不息。,4:30:38 上午,4:30 上午,04:30:38,10月-26,MOMODA POWERPOINT,Lorem ipsum dolor sit amet,consectetur adipiscing elit.Fusce id urna blandit,eleifend nulla ac,fringilla purus.Nulla iaculis tempor felis ut cursus.,感谢您的下载观看,专家告诉,
    展开阅读全文

    开通VIP折扣优惠下载文档

    提示  咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。

    咨信网小贴示:
    1、浏览或下载可查看了解,请点击【咨信网告知】。
    2、下载文件中如有侵权或不适当内容,将立即纠正。
    3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
    4、开具发票登录电脑端申请,请点击【索取发票】。

    咨信网客服组:【微信客服】

    自信AI创作助手
    关于本文
    本文标题:Linux字符设备驱动程序培训教材.pptx
    链接地址:https://www.zixin.com.cn/doc/14510222.html

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork