皮皮网

【startkernel源码详解】【草帽船长源码】【全景源码教程】drive源码分析

来源:mt4 ea 源码 时间:2024-12-24 10:27:06

1.Linux驱动(驱动程序开发、码分驱动框架代码编译和测试)
2.Mysql - com.mysql.jdbc.Driver与com.mysql.cj.jdbc.Driver的区别
3.CAD内核:几何建模引擎分类
4.cloud-init介绍及源码解读(上)
5.奉劝你别看!码分是码分会缩放的红色爱心代码

drive源码分析

Linux驱动(驱动程序开发、驱动框架代码编译和测试)

       驱动就是码分对底层硬件设备的操作进行封装,并向上层提供函数接口。码分

       Linux系统将设备分为3类:字符设备、码分startkernel源码详解块设备、码分网络设备。码分

       先看一张图,码分图中描述了流程,码分有助了解驱动。码分

       用户态:

       内核态:

       驱动链表:管理所有设备的码分驱动,添加或查找,码分 添加是码分发生在我们编写完驱动程序,加载到内核。码分查找是在调用驱动程序,由应用层用户空间去查找使用open函数。驱动插入链表的顺序由设备号检索。

       字符设备驱动工作原理:

       在Linux的世界里一切皆文件,所有的硬件设备操作到应用层都会被抽象成文件的操作。当应用层要访问硬件设备,它必定要调用到硬件对应的驱动程序。Linux内核有那么多驱动程序,应用怎么才能精确的调用到底层的驱动程序呢?

       当open函数打开设备文件时,可以根据设备文件对应的草帽船长源码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表示生成驱动模块,python fft源码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内核源代码)。也可以在树莓派上面编译,但在树莓派里编译,效率会很低,要非常久。ntp源码编译

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种爱心代码)

       爱心代码和代码雨的结合,美爆了

       动态流星雨爱心代码 手机版入口和源代码

       爆款生日代码合集 手机上直接打开

       每天可领,支付宝又发大红包!

       淘宝领红包合集,每天都可以领哦

       京东领红包合集,每天都可以领哦

       创作不易 感谢支持