1.Linux驱动(驱动程序开发、码分驱动框架代码编译和测试)
2.Mysql - com.mysql.jdbc.Driverä¸com.mysql.cj.jdbc.Driverçåºå«
3.CAD内核:几何建模引擎分类
4.cloud-init介绍及源码解读(上)
5.奉劝你别看!码分是码分会缩放的红色爱心代码
Linux驱动(驱动程序开发、驱动框架代码编译和测试)
驱动就是码分对底层硬件设备的操作进行封装,并向上层提供函数接口。码分
Linux系统将设备分为3类:字符设备、码分nmap 源码块设备、码分网络设备。码分
先看一张图,码分图中描述了流程,码分有助了解驱动。码分
用户态:
内核态:
驱动链表:管理所有设备的码分驱动,添加或查找,码分 添加是码分发生在我们编写完驱动程序,加载到内核。码分查找是在调用驱动程序,由应用层用户空间去查找使用open函数。驱动插入链表的顺序由设备号检索。
字符设备驱动工作原理:
在Linux的世界里一切皆文件,所有的硬件设备操作到应用层都会被抽象成文件的操作。当应用层要访问硬件设备,它必定要调用到硬件对应的驱动程序。Linux内核有那么多驱动程序,应用怎么才能精确的调用到底层的驱动程序呢?
当open函数打开设备文件时,可以根据设备文件对应的hashmap源码篇struct inode结构体描述的信息,可以知道接下来要操作的设备类型(字符设备还是块设备),还会分配一个struct file结构体。
根据struct inode结构体里面记录的设备号,可以找到对应的驱动程序。在Linux操作系统中每个字符设备都有一个struct cdev结构体。此结构体描述了字符设备所有信息,其中最重要的一项就是字符设备的操作函数接口。
找到struct cdev结构体后,linux内核就会将struct cdev结构体所在的内存空间首地址记录在struct inode结构体i_cdev成员中,将struct cdev结构体中的记录的函数操作接口地址记录在struct file结构体的f_ops成员中。
任务完成,VFS层会给应用返回一个文件描述符(fd)。这个fd是和struct file结构体对应的。接下来上层应用程序就可以通过fd找到struct file,然后在struct file找到操作字符设备的函数接口file_operation了。
其中,cdev_init和cdev_add在驱动程序的入口函数中就已经被调用,分别完成字符设备与file_operation函数操作接口的绑定,和将字符驱动注册到内核的工作。
驱动程序开发步骤:
Linux 内核就是由各种驱动组成的,内核源码中有大约 %是各种驱动程序的代码。内核中驱动程序种类齐全,可以在同类驱动的基础上进行修改以符合具体单板。
编写驱动程序的火车指标源码难点并不是硬件的具体操作,而是弄清楚现有驱动程序的框架,在这个框架中加入这个硬件。
一般来说,编写一个 linux 设备驱动程序的大致流程如下:
下面以一个简单的字符设备驱动框架代码来进行驱动程序的开发、编译等。
基于驱动框架的代码开发:
上层调用代码
驱动框架代码
驱动开发的重点难点在于读懂框架代码,在里面进行设备的添加和修改。
驱动框架设计流程:
1. 确定主设备号
2. 定义结构体 类型 file_operations
3. 实现对应的 drv_open/drv_read/drv_write 等函数,填入 file_operations 结构体
4. 实现驱动入口:安装驱动程序时,就会去调用这个入口函数,执行工作:
① 把 file_operations 结构体告诉内核:注册驱动程序register_chrdev.
② 创建类class_create.
③ 创建设备device_create.
5. 实现出口:卸载驱动程序时,就会去调用这个出口函数,执行工作:
① 把 file_operations 结构体从内核注销:unregister_chrdev.
② 销毁类class_create.
③ 销毁设备结点device_destroy.
6. 其他完善:GPL协议、入口加载
驱动模块代码编译和测试:
编译阶段:
驱动模块代码编译(模块的编译需要配置过的内核源码,编译、连接后生成的内核模块后缀为.ko,编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录。)
将该驱动代码拷贝到 linux-rpi-4..y/drivers/char 目录下 文件中(也可选择设备目录下其它文件)
修改该文件夹下Makefile(驱动代码放到哪个目录,就修改该目录下的Makefile),将上面的代码编译生成模块,文件内容如下图所示:(-y表示编译进内核,-m表示生成驱动模块,kubesphere源码解析CONFIG_表示是根据config生成的),所以只需要将obj-m += pin4drive.o添加到Makefile中即可。
回到linux-rpi-4..y/编译驱动文件
使用指令:ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules进行编译生成驱动模块。
加载内核驱动:
加载内核驱动(相当于通过insmod调用了module_init这个宏,然后将整个结构体加载到驱动链表中)。 加载完成后就可以在dev下面看到名字为pin4的设备驱动(这个和驱动代码里面static char *module_name="pin4"; //模块名这行代码有关),设备号也和代码里面相关。
lsmod查看系统的驱动模块,执行上层代码,赋予权限
查看内核打印的信息,如下图所示:表示驱动调用成功
在装完驱动后可以使用指令:sudo rmmod +驱动名(不需要写ko)将驱动卸载。
驱动调用流程:
上层空间的open去查找dev下的驱动(文件名),文件名背后包含了驱动的主设备号和次设备号。此时用户open触发一个系统调用,系统调用经过vfs(虚拟文件系统),vfs根据文件名背后的设备号去调用sys_open去判断,找到内核中驱动链表的驱动位置,再去调用驱动里面自己的dev_open函数。
为什么生成驱动模块需要在虚拟机上生成?树莓派不行吗?
生成驱动模块需要编译环境(linux源码并且编译,需要下载和系统版本相同的Linux内核源代码)。也可以在树莓派上面编译,但在树莓派里编译,效率会很低,要非常久。宏脉源码
Mysql - com.mysql.jdbc.Driverä¸com.mysql.cj.jdbc.Driverçåºå«
spring常ç¨dataSourceé ç½®å¦ä¸:è driver-class-name ç com.mysql.jdbc.Driver ä¸ com.mysql.cj.jdbc.Driver æä»ä¹åºå«å¢?
å½5ä¹åççæ¬éæ© com.mysql.jdbc.Driver çæ¶åï¼ä¼æè¦åæ示ï¼æ¿æ¢ä¸º com.mysql.cj.jdbc.Drive
æ¥çæºç å¯ç¥ï¼èçæ¬ç Driver 继æ¿äºæ°çæ¬ç Driver ï¼éè¿ç»§æ¿çæ¹å¼å ¼å®¹èçæ¬ï¼å¹¶æ·»å äºåè¦æ示ï¼å¦ä¸:
CAD内核:几何建模引擎分类
几何建模引擎是3D建模系统的核心,用于精确表示产品三维形状并管理模型。内核的价值在于为应用程序提供功能,CAD系统通过图形用户界面向用户提供内核功能的访问。世界上有几十个知名的数学内核,包括来自EDS的Parasolid、Spatial Corp的ACIS、Matra Datavision的Open CASCADE,以及Thinkdesign、VX Overdrive、KOMPAS-3D和CrownCAD等。
使用相同的内核,产品的功能和限制相似,主要区别在于用户界面。几何建模引擎分为三种类型:许可、专有和源代码形式提供。
许可内核由公司开发和维护,授权给其他CAD系统的用户。例如,Parasolid和ACIS内核广泛用于CAD,其中Parasolid是Unigraphics的核心,ACIS由Dassault Systemes开发。这两个内核在实体建模、混合建模和广义网格建模方面提供技术。
专有内核由CAD开发人员开发和维护,专门用于其应用程序,提供更深入的集成。例如,Thinkdesign和VX Overdrive内核分别作为Think3和Varimetrix产品的基础。
源代码形式的内核允许用户拥有内核的源代码,便于定制。Open CASCADE和SMLib是著名的开源内核,前者免费,后者需要付费。
使用购买的核心成本包括在产品价格中,购买格式的导入导出模块需要额外费用。自定义内核成本较低,管理更灵活。购买核心并不意味着绝对可靠性,错误可以通过修改内核得到纠正。
CAD开发人员选择内核时需考虑成本、功能和集成深度。许可内核提供了广泛的兼容性和功能,但成本较高。专有内核集成度高,适用于特定需求,成本较低。源代码内核允许定制,但维护成本较高。选择哪种内核取决于CAD系统的特定需求和预算。工业公司购买CAD时,内核能力、打磨程度和成本都应考虑。多数情况下,企业会购买几个高级CAD工作站和数十个较便宜的许可证来满足不同设计需求。在某些情况下,所有工作场所都配备高级CAD可能在俄罗斯不可行。
cloud-init介绍及源码解读(上)
cloud-init介绍及源码解读(上) cloud-init的基本概念 metadata包含服务器信息,如instance id,display name等。userdata包含文件、脚本、yaml文件等,用于系统配置和软件环境配置。datasource是cloud-init配置数据来源,支持AWS、Azure、OpenStack等,定义统一抽象类接口,所有实现都要遵循规范。 模块决定定制化工作,metadata决定结果。cloud-init配置有4个阶段:local、network、config、final。cloud-init支持多种userdata类型,如自定义Python代码、MIME文件等。用户数据类型包括User-Data Script(MIME text/x-shellscript)和Cloud Config Data(MIME text/cloud-config)。 cloud-init支持多种datasource,包括NoCloud、ConfigDrive、OpenNebula等。通过Virtual-Router获取metadata和userdata信息。 cloud-init在云主机上创建目录结构以记录信息。cloud.cfg文件定义各阶段任务。 cloud-init工作原理 cloud-init通过从datasource获取metadata,执行四个阶段任务完成定制化工作。在systemd环境下,这些阶段对应的服务在启动时执行一次。 local阶段从config drive中获取配置信息写入网络接口文件。network阶段完成磁盘格式化、分区、挂载等。config阶段执行配置任务。final阶段系统初始化完成,运行自动化工具如puppet、salt,执行用户定义脚本。 cloud-init使用模块指定任务,metadata决定结果。set_hostname模块根据metadata设置主机名。设置用户初始密码和安装软件是典型应用。 cloud-init源码解读 cloud-init核心代码使用抽象方法实现,遵循接口规范。主要目录包括定义类和函数、网络配置、模块初始化、系统发行版操作、配置文件管理、模块处理、数据源、事件报告等。 模块通过handle函数解析cloud config配置,并执行逻辑。数据源类扩展实现接口。handler处理用户数据。reporting框架记录事件信息。 cloud-init提供文件操作、日志管理、配置解析等辅助类。其他文件包括模板处理、日志格式定义、版本控制等。 cloud-init通过模块、datasource和配置文件实现云主机元数据管理和定制化。源码结构清晰,功能全面,是云环境定制的强大工具。奉劝你别看!是会缩放的红色爱心代码
会缩放的红色爱心代码
手机版打开入口:loveyou.gitee.io/love...
源代码链接:pan.xunlei.com/s/VNvtiT...
...
流星雨爱心代码
手机版打开入口:loveyou.github.io/lov...
源代码链接:pan.xunlei.com/s/VNvthO...
...
"I love you"代码
手机版打开入口:loveyou.github.io/ilo...
源代码链接:pan.xunlei.com/s/VO1t2i...
...
效果5. "祝你生日快乐"代码
手机版打开入口:loveyou.github.io/hap...
源代码链接:pan.xunlei.com/s/VNvuih...
...
生日快乐带声音代码
手机版打开入口:loveyou.github.io/HBD...
源代码链接:pan.xunlei.com/s/VNvuiv...
...
生日快乐粒子特效代码
手机版打开入口:loveyou.github.io/hap...
源代码链接:pan.xunlei.com/s/VNvuit...
...
修改文字参考教程:"种语言说我爱你,简单易学!"
...
种语言说爱你 手机版访问链接复制去微信对话框直接看到种语言我爱你的效果(可以直接发给朋友)
❤❤(访问人数多,大家下面几个都试试)
loveyou.github.io/lov...
loveyou.github.io/lov...
...
种语言说爱你源代码 可以修改成表白对象的名字:
源代码链接:pan.xunlei.com/s/VNvuAD...
源代码链接:drive.uc.cn/s/e3ff4bb...
小伙伴们可以点点关注/在看/点赞哦~
关注公众号 可乐自媒体
下一款爱心代码/生日代码/烟花代码/圣诞树代码 更精彩
往期推荐
种语言我爱你 手机版效果访问入口
种语言我爱你 人人都能打开 2种办法打开教程
修改教程!种语言说我爱你,简单易学!
满屏文字爱心代码(第5种爱心代码)
爱心代码和代码雨的结合,美爆了
动态流星雨爱心代码 手机版入口和源代码
爆款生日代码合集 手机上直接打开
每天可领,支付宝又发大红包!
淘宝领红包合集,每天都可以领哦
京东领红包合集,每天都可以领哦
创作不易 感谢支持