当前位置: 首页 > news >正文

Linux系统之Uboot、Kernel、Busybox思考之三

目录

三 内核的运行

5-中断子系统

6 锁、延迟与原子上下文

7 内存管理子系统

8 驱动的两类框架


三 内核的运行

5-中断子系统

  中断子系统的数据结构及设计思想

  中断子系统需要解决中断管理的问题。

  如果系统中断较少的话,其管理就不用设计这样一个中断子系统这么麻烦了。

  但是现代CPU功能越来越强大,越来越复杂,自然支持的中断数量也不断增加。

  中断由专门的中断控制器在硬件层面管理,另外还存在中断嵌套的问题,这样中断号就可能冲突(重叠或重复)

  为了总揽中断处理,内核设计了多个数据结构,完善对中断的管理。这些数据结构包括:

  irq_desc,中断描述结构,包含中断的数据,中断的处理函数指针列表,以及相关的其他信息,比如父中断、任务相关信息

  一个实际的中断会对应到一个irq_desc,结构,系统创建时候,会初始化一个irq_desc全局列表(数组),每当驱动调用request_irq请求中断时,

  就在irq的全局列表中找到一个对应的节点(如果申请的中断号存在的话,则复用已有的,如果没有的话,就新分配一个给当前中断号)

  当前申请中断的回调函数就会挂载到该描述符的action列表上,当中断产生后,会根据硬件中断号找到软件中断号进而找到该描述符,遍历执行挂接其上的回调函数

  irq_data,中断数据结构体,该数据结构包含了当前软件中断号及其对应的硬件中断号,也包含了irq_chip和irq_domain结构指针。

  这个数据结构会在多个接口的参数中传递,用于把整个中断链条粘起来

  irq_chip结构表示了一个中断控制器,这个结构里预定义了多个函数指针,主要用来进行中断控制器的一些操作,比如屏蔽、取消中断屏蔽等

  irq_domain结构表示了一个中断控制器管理的中断。通过该接口,中断控制器要建立该中断控制器管理的中断的映射关系。

  主要的映射关系有三种,包括线性映射,radix树映射,直接映射。

 

  中断子系统的构建:启动代码

  内核启动时,完成中断系统的构建,也就是描述符表的初始化,中断控制器驱动的加载,完成中断子系统的初始化。

  中断是系统正常运行的基础子系统,许多模块的正常运行依赖该子系统,所以,需要较早初始化。

  即使这样,中断也有其依赖的部分,比如内存分配,所以,内存的初始化要放在其前面,另外CPU本身的初始化也是最初要做的。

  上述工作会在CPU中断关闭的情况下进行。因为这个阶段,即使产生中断,也是没有意义的,没有谁去处理它。

  笼统的来讲,所有中断子系统用到的东西都必须先于其构建,比如像radix树之类的。

  这之后,内核调用early_irq_init();和init_IRQ();构建中断子系统。

  第一个接口完成中断描述符相关内容的构建,第二个接口一般是平台相关的调用。比如,接口中进一步调用machine_desc->init_irq();完成具体平台的中断初始化。

  对于海思平台,在其march-hisi中的core.c中定义了这里用到的machine,进一步的会调用hi3536_gic_init_irq完成平台中断的初始化。

  平台部分会做一些额外或者也可能不做,最终会调用通用中断初始化接口gic_init_bases

  网上介绍的gic_of_init初始化接口,也会调用到上述接口上,殊途同归吧。

  在这个接口里,会完成CPU内置中断0-31号的配置,完成GIC通用中断控制器的创建和映射关系建立,以及用户定义中断的配置

  另外,这里会使用CPU的中断相关寄存器地址。hisi平台machine在调用通用中断初始化接口时,会传递海思平台的寄存器地址,完成海思平台中断子系统的初始化

 

  中断子系统的运行:如何使用上述构建的中断世界(结构)

  现在我们来看,中断系统的运行流程(过程)。

  系统启动时已经完成了基本的中断系统构建。

  驱动申请中断时,主要是根据中断类型、中断号等信息,将当前设备的中断处理程序挂接到中断描述符结构上,全局的中断描述符。

  当中断产生后,会一级一级向上传导到中断控制器,最终到CPU。CPU响应中断后,会获取到当前最终一级的中断号。

  这个中断号是硬件的,通过该中断号,一级一级向下传导。先通过irq_chip这个代表中断控制器的结构,关闭或者屏蔽当前中断控制器的中断,

  进一步的结合中断数据,查找到软件中断号,找到中断描述符

  遍历并调用中断描述符上的处理函数指针列表。

  具体是那个最下一级设备最终产生的中断,这就要交给中断处理函数了。

  在驱动申请中断时,预先定义了中断处理函数。驱动需要判断当中断处理函数被调用时,是否是当前设备产生了中断,这可以通过读取设备的中断寄存器来完成判决。

  其实中断的申请分共享和非共享,对于非共享中断,此时应该就是也必须是设备的中断触发其中断处理函数,否则,说明系统中断部分的映射有问题。

6 锁、延迟与原子上下文

  软中断上下文中调用msleep进行调度出错

  tasklet 中调用msleep,产生调度出错

  struct work

  全局共享队列不能延迟调度,因为是默认内核专门的线程,该线程应该是不能延迟操作?

  专有共享队列可以延迟调度?

  这里的延迟是延迟固定时间后放到队列中?

  因为队列中的work什么时候执行要看之前的work什么时候执行完成

  定时器执行上下文是软中断,所以也是属于原子上下文

  

  <4> msec to jiffies is 100 <3>BUG: scheduling while atomic: swapper/1/0/0x00000100<4>Modules linked in: testdrv(O) hi_rtc(O) hi_ir(O) hi3536_adec(PO) hi3536_aenc(PO) hi3536_ao(PO) hi3536_ai(PO) hi3536_aio(PO) acodec(PO) gpioi2c(O) hi3536_ive(PO) hi3536_vda(PO) hi3536_jpege(PO) hi3536_h264e(PO) hi3536_chnl(PO) hi3536_venc(PO) hi3536_rc(PO) hi3536_hdmi(O) hifb(PO) hi3536_vou(PO) hi3536_vpss(PO) hi3536_viu(PO) hi3536_vgs(PO) hi3536_region(PO) hi3536_tde(PO) hi3536_jpegd(O) hi3536_vfmw(PO) hi3536_vdec(PO) hi3536_sys(PO) hi3536_base(PO) hiuser(O) hi_media(O) mmz(O) stmmac [last unloaded: testdrv]<4>CPU: 1 PID: 0 Comm: swapper/1 Tainted: P           O 3.10.0_hi3536 #38<4>[<c0019d30>] (unwind_backtrace+0x0/0xf4) from [<c0016de4>] (show_stack+0x10/0x14)<4>[<c0016de4>] (show_stack+0x10/0x14) from [<c0546340>] (__schedule_bug+0x50/0x64)<4>[<c0546340>] (__schedule_bug+0x50/0x64) from [<c054c454>] (__schedule+0x4f0/0x5d8)<4>[<c054c454>] (__schedule+0x4f0/0x5d8) from [<c054a9e0>] (schedule_timeout+0x130/0x1ac)<4>[<c054a9e0>] (schedule_timeout+0x130/0x1ac) from [<c00322d8>] (msleep+0x2c/0x38)<4>[<c00322d8>] (msleep+0x2c/0x38) from [<c0032374>] (call_timer_fn.isra.30+0x24/0x88)<4>[<c0032374>] (call_timer_fn.isra.30+0x24/0x88) from [<c003256c>] (run_timer_softirq+0x194/0x210)<4>[<c003256c>] (run_timer_softirq+0x194/0x210) from [<c002bb54>] (__do_softirq+0x124/0x204)<4>[<c002bb54>] (__do_softirq+0x124/0x204) from [<c002bf6c>] (irq_exit+0x9c/0xd0)<4>[<c002bf6c>] (irq_exit+0x9c/0xd0) from [<c0013ea0>] (handle_IRQ+0x44/0x90)<4>[<c0013ea0>] (handle_IRQ+0x44/0x90) from [<c0008514>] (gic_handle_irq+0x34/0x8c)<4>[<c0008514>] (gic_handle_irq+0x34/0x8c) from [<c0012bc0>] (__irq_svc+0x40/0x50)<4>Exception stack(0xcf867f98 to 0xcf867fe0)<4>7f80:                                                       c09ae930 00000000<4>7fa0: 002a87a4 00000000 c077f3e5 c074dd50 c054fe6c cf866000 c077f3e5 cf866000<4>7fc0: cf866000 c074dcf0 00000000 cf867fe0 c00142a4 c00142a8 60000013 ffffffff<4>[<c0012bc0>] (__irq_svc+0x40/0x50) from [<c00142a8>] (arch_cpu_idle+0x2c/0x30)<4>[<c00142a8>] (arch_cpu_idle+0x2c/0x30) from [<c005b360>] (cpu_startup_entry+0xfc/0x140)<4>[<c005b360>] (cpu_startup_entry+0xfc/0x140) from [<40542804>] (0x40542804)<3>bad: scheduling from the idle thread!<4>CPU: 1 PID: 0 Comm: swapper/1 Tainted: P        W  O 3.10.0_hi3536 #38<4>[<c0019d30>] (unwind_backtrace+0x0/0xf4) from [<c0016de4>] (show_stack+0x10/0x14)<4>[<c0016de4>] (show_stack+0x10/0x14) from [<c0050ab4>] (dequeue_task_idle+0x34/0x40)<4>[<c0050ab4>] (dequeue_task_idle+0x34/0x40) from [<c054c240>] (__schedule+0x2dc/0x5d8)<4>[<c054c240>] (__schedule+0x2dc/0x5d8) from [<c054a9e0>] (schedule_timeout+0x130/0x1ac)<4>[<c054a9e0>] (schedule_timeout+0x130/0x1ac) from [<c00322d8>] (msleep+0x2c/0x38)<4>[<c00322d8>] (msleep+0x2c/0x38) from [<c0032374>] (call_timer_fn.isra.30+0x24/0x88)<4>[<c0032374>] (call_timer_fn.isra.30+0x24/0x88) from [<c003256c>] (run_timer_softirq+0x194/0x210)<4>[<c003256c>] (run_timer_softirq+0x194/0x210) from [<c002bb54>] (__do_softirq+0x124/0x204)<4>[<c002bb54>] (__do_softirq+0x124/0x204) from [<c002bf6c>] (irq_exit+0x9c/0xd0)<4>[<c002bf6c>] (irq_exit+0x9c/0xd0) from [<c0013ea0>] (handle_IRQ+0x44/0x90)<4>[<c0013ea0>] (handle_IRQ+0x44/0x90) from [<c0008514>] (gic_handle_irq+0x34/0x8c)<4>[<c0008514>] (gic_handle_irq+0x34/0x8c) from [<c0012bc0>] (__irq_svc+0x40/0x50)<4>Exception stack(0xcf867f98 to 0xcf867fe0)

  关于锁,需要关注一些跟硬件相关的特性或者手段更为贴切。

  原子操作,汇编层面使用,CPU内部特性保证

  内存屏障,汇编层面使用,CPU内部特性保证

  RCU

  https://zhuanlan.zhihu.com/p/88883239

  https://blog.csdn.net/cfy_phonex/article/details/12090943

  RCU 宽限期的概念,参考英文及知乎文档

  也可参见博主的文章:

  学内核之十三:关于RCU锁的一些思考_rcu 写锁_龙赤子的博客-CSDN博客

  如果CPU层面没有相关手段,软件层面,可能需要特别处理中断,比如关闭中断,保证当前代码执行不被打断。

7 内存管理子系统

  内存管理子系统在内核中占据了非常重要的位置

  内存管理子系统也是系统中非常基础的模块,许多其他模块都依赖该模块,所以内存管理子系统在系统中初始化的位置很靠前

  现代操作系统都采用了虚拟内存系统,以此提供进程间的共享、隔离和独立的不依赖物理内存大小的地址空间

  Linux对物理内存进行了分区管理,提供了DMA区域、正常区域和高端区域

  DMA区域针对某些物理设备可访问物理内存地址范围受限的情况,一般是在低地址区

  正常区域为分页划分后供系统使用的内存,这部分内存的映射一般是固定映射,通常为一个固定偏移。内核地址空间3G到4G之间的低地址部分会映射到物理内存的对应低地址区域。

  高端内存为正常区域之外的物理内存,这部分内存需要时,单独映射到内核地址空间,该映射非固定映射,需要时通过系统接口建立映射,用完释放。

  上述区域的划分在不同平台可能有不同的实现,有的平台可能不存在高端内存,也可能不存在DMA区域。

  内核对内存的分配有三层:

  1 是获取和释放页面。这是最底层的接口。通过这类接口可直接获取物理内存页并使用。一般不建议通过该方法获取内存。

  2 是通过kmalloc获取内存buffer。该接口基于1中的接口,但是中间增加了slab管理算法。通过slab算法,可以有效的管理物理内存。

    相比第一种的页为单位的内存,通过该接口获取内存更灵活。当然,slab也是先通过1接口获取空闲页再进行管理后,提供给kmalloc调用者。

  3 是通过vmalloc获取内存buffer。跟2比较,该接口获取的内存在虚拟空间中连续,物理地址不连续。可能是多个零散的物理页面通过映射表产生虚拟空间的连续内存。

    显然,该接口获取内存对性能有一定损耗,所以一般也不用该接口,除非需要获取较大的物理内存。模块加载时通常通过该接口获取内存。

 

  除了操作系统自身的内存管理需要,Linux操作系统还需要提供进程的内存管理。

  进程的内存管理通过挂接到task结构体上的mm结构体进行管理。mm结构体进一步挂接vma结构体链表,具体对应用户进程的地址空间。

  用户进程的/proc/xxx/mmap文件就是vma的对应,其中包括共享库、堆、栈、进程自身动态库、代码段、数据段等区块。一般,栈向下增长,堆向上增长。

  对于内核进程来讲,是不存在上述mm结构体的,内核进程不需要共享库以及其他部分。内核进程之间是全局共享的,此处用内核线程更好理解。内核一个大进程,有很多线程。

  内核堆栈代码段数据段等是在内核加载后逐步建立的,堆栈占用物理内存的固定区域,一般栈在最高地址处。其他内存通过调用分配函数完成。内存的使用没有差异,只是内核的内存映射在内核地址空间。

  可以想象内核是一个大进程,所有内核线程和用户进程都共享内核地址空间。

 

  对内存的使用,还需要考虑缓冲和CACHE。

  虚拟内存通过MMU访问,但是也要看到,建立物理映射需要多次访问内存,对性能影响不小,特别是进程切换等操作,映射很容易失效。

  系统提供TLB用于页表映射的CACHE,对性能提升有很大影响。一般页面的大小在4KB及以上,使用内存过程中根据空间相关性,同一页面的高频访问概率还是很大的,CACHE带来的效率提升会比较高。

  随着现代64位系统的流行和应用的不断复杂化、膨胀化,应用对内存的消耗也在不断地增加。使用4KB的页面,可能导致出现频繁的页分配释放和CACHE miss。为应对这一情况,内核提供了巨页和透明大页的支持。

  使用更大的的页面,可以减少分配次数,可以减少cache line 占用,对性能的提升有不少帮助。但同时也要看到,大页也有其不利的一面,比如利用率(可能造成浪费)、分配成功率等。需要平衡考虑。

8 驱动的两类框架

  框架一,模板化

  框架二,抽象化、分层化

  open 设备节点到驱动接口

  <4>[<c054d1b4>] (mutex_lock+0xc/0x4c) from [<bf882174>] (cdevdev_open+0x20/0x3c [testdrv])<4>[<bf882174>] (cdevdev_open+0x20/0x3c [testdrv]) from [<c00c2f38>] (chrdev_open+0xc4/0x1ac)<4>[<c00c2f38>] (chrdev_open+0xc4/0x1ac) from [<c00bd2a0>] (do_dentry_open.isra.16+0x164/0x258)<4>[<c00bd2a0>] (do_dentry_open.isra.16+0x164/0x258) from [<c00bd3b4>] (finish_open+0x20/0x38)<4>[<c00bd3b4>] (finish_open+0x20/0x38) from [<c00cb3c0>] (do_last.isra.54+0x3bc/0xc24)<4>[<c00cb3c0>] (do_last.isra.54+0x3bc/0xc24) from [<c00cbcd4>] (path_openat.isra.55+0xac/0x470)<4>[<c00cbcd4>] (path_openat.isra.55+0xac/0x470) from [<c00ccce4>] (do_filp_open+0x2c/0x80)<4>[<c00ccce4>] (do_filp_open+0x2c/0x80) from [<c00be320>] (do_sys_open+0xe8/0x170)<4>[<c00be320>] (do_sys_open+0xe8/0x170) from [<c0012f80>] (ret_fast_syscall+0x0/0x30)

相关文章:

Linux系统之Uboot、Kernel、Busybox思考之三

目录 三 内核的运行 5-中断子系统 6 锁、延迟与原子上下文 7 内存管理子系统 8 驱动的两类框架 三 内核的运行 5-中断子系统 中断子系统的数据结构及设计思想。 中断子系统需要解决中断管理的问题。 如果系统中断较少的话&#xff0c;其管理就不用设计这样一个中断子系统这…...

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(一)

在最后一个例程中笔者精挑细选了一个较为综合性的项目实战&#xff0c;其中覆盖了很多知识点&#xff0c;也是从一个转产产品中所提炼出来的&#xff0c;所以非常贴近实战项目。 整个工程实现了用户通过对上位机PC端人机界面的操作&#xff0c;即可达到控制豌豆开发并行DAC输出…...

性能测试学习和性能瓶颈分析路线

很多企业招聘都只写性能测试&#xff0c;会使用LR&#xff0c;jmeter工具。其实会使用jmeter和LR进行性能测试还只是性能测试的第一步&#xff0c;离真正的性能测试工程师还很远&#xff0c;笔者也还在路上 .。 性能测试&#xff0c;都是要求测试系统性能&#xff0c;系统自然…...

达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解

达梦数据库&#xff08;DM8&#xff09;集成使用 Geoserver&#xff08;2.22.2&#xff09; 以及其他对应版本详解系统环境版本Geoserver 驱动对应版本达梦 8 集成 Geoserver 过程试错过程问题总结项目需要国产化&#xff0c;选择使用达梦数据库&#xff0c;在技术测试阶段&…...

全开源无加密的RuleApp文章社区APP客户端源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 开源无加密的文章社区客户端源码分享 RuleApp文章社区&#xff0c;VIP会员&#xff0c;写作投稿积分商城&#xff0c;付费模块集成&#xff0c;多平台兼容这是一款开源免费&#xff0c;界…...

基于springboot校园二手市场平台

一、项目简介 本项目是一套基于springboot校园二手市场平台&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#xff0c;确保…...

维度建模基本流程总结

一、维度建模基本流程图数据RD进行业务调研和数据现状调研&#xff0c;产出符合相关模版规范的业务知识文档和数据现状文档。数据PM也会调研相关业务产出需求设计文档&#xff0c;三方参与需求评审&#xff0c;评审通过后基建数据RD进行需求拆解&#xff0c;产出技术方案&#…...

RocketMQ事务消息

RocketMQ事务消息 RocketMq提供的一种高级消息类型&#xff0c;支持在分布式场景下面保障消息生产和本地事务的一致性 生产者将消息发送到服务端服务端将消息持久化成功后&#xff0c;向生产者返回ACK确认消息发送成功&#xff0c;此时消息状态为待投递,这种状态下的消息称之为…...

大数据处理 - 双层桶划分

分桶法简介其实本质上还是分而治之的思想&#xff0c;重在“分”的技巧上&#xff01;适用范围: 第k大&#xff0c;中位数&#xff0c;不重复或重复的数字基本原理及要点: 因为元素范围很大&#xff0c;不能利用直接寻址表&#xff0c;所以通过多次划分&#xff0c;逐步确定范围…...

NFC标签读写器隐私协议

【标签读写器】&#xff08;以下简称“我们”&#xff09;深知个人信息对您的重要性&#xff0c;并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任&#xff0c;恪守以下原则&#xff0c;保护您的个人信息&#xff1a;权责一致原则、目的明确原则、选择同意原…...

DocEE:一种用于文档级事件抽取的大规模细粒度基准 论文解读

DocEE: A Large-Scale and Fine-grained Benchmark for Document-level Event Extraction 论文&#xff1a;NAACL2022.pdf (tongmeihan1995.github.io) 代码&#xff1a;tongmeihan1995/DocEE: DocEE: A Large-Scale and Fine-grained Benchmark for Document-level Event Ext…...

ImageCombiner设计源码详解

前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址&#xff1a;拿来就用的Java海报生成器ImageCombiner&#xff08;一&#xff09;&#xff0c;在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多&#xff0c;本文就针对源码进行深入…...

python基础 | python基础语法

文章目录&#x1f4da;基础语法&#x1f407;输入和输出&#x1f955;print()输出&#x1f955;input()输入&#x1f407; 变量的命名&#x1f407;条件判断&#x1f955;单向判断&#x1f955;双向判断&#x1f955;多向判断&#x1f955;if嵌套&#x1f955;三元表达式&#…...

YOLOv6-3.0-目标检测论文解读

文章目录摘要算法2.1网络设计2.2Anchor辅助训练2.3自蒸馏实验消融实验结论论文&#xff1a; 《YOLOv6 v3.0: A Full-Scale Reloading 》github&#xff1a; https://github.com/meituan/YOLOv6上版本参考 YOLOv6摘要 YOLOv6 v3.0中YOLOv6-N达到37.5AP&#xff0c;1187FPS&…...

JAVA集合之Map >>HashMap/Hashtable/TreeMap/LinkedHashMap结构

Map 是一种键-值对&#xff08;key-value&#xff09;集合&#xff0c;键不可以重复&#xff0c;值可以重复。常见的实现类有&#xff1a;HashMap、Hashtable、TreeMap、LinkedHashMap等。 HashMap&Hashtable HashMap&#xff1a;数据结构为哈希表&#xff0c;允许使用 n…...

JavaScript从零开始 学习记录(一)

前言 选择视频课程之前&#xff0c;不仅查阅了资料&#xff0c;还询问了网友&#xff0c;最终敲定了学习黑马前端的视频教程&#xff0c;学了5小节&#xff0c;发现挺对自己口味的且从反响来看&#xff0c;还是相当不错的&#xff0c;便打算利用这个寒假学完 笔记范围 从这节…...

C++项目——高并发内存池(3)--central cache整体设计

1.central cache的介绍 1.1框架思想 1.1.1哈希映射 centralcache其实也是哈希桶结构的&#xff0c;并且central cache和thread cacha的哈希映射关系是一致的。目的为了&#xff0c;当thread cache某一个哈希桶下没有内存块时&#xff0c;可以利用之前编写的SizeClass::Index…...

Spring Boot 整合 MyBatis 配置等案例教程

运行环境&#xff1a;JDK 7 或 8、Maven 3.0 技术栈&#xff1a;SpringBoot 1.5、SpringBoot Mybatis Starter 1.2 、MyBatis 3.4 前言 距离第一篇 Spring Boot 系列的博文 3 个月了。《Springboot 整合 Mybatis 的完整 Web 案例》第一篇出来是 XML 配置 SQL 的形式。虽然 XM…...

比特数据结构与算法(第三章_下)队列的概念和实现(力扣:225+232+622)

一、队列&#xff08;Queue&#xff09;队列的概念&#xff1a;① 队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。② 入队列&#xff0c;进行插入操作的一端称为 队尾。出队列&#xff0c;进行删除操作的一端称为 队头。③ 队列中的元素…...

c++提高篇——STL容器实现打分系统

一、案例说明 有5名选手:选手ABCDE&#xff0c;10个评委分别对每一名选手打分&#xff0c;去除最高分&#xff0c;去除评委中最低分&#xff0c;取平均分。 二、案例实现 在实现这个系统时&#xff0c;我们规划一下实现的步骤以及细节&#xff1a; 1、创建一个选手类&#x…...

【图片上传记录三】element-ui组件详解与封装(自定义上传、限制文件大小、格式以及图片尺寸)

业务上有需求是前端上传 jpg/png/gif 格式, 并且 尺寸为 150px * 150px,300px*300px,428*428px 的图片 同时在上传的同时需要携带用户的个人信息以及其他额外信息 因此在 element-upload 基础之上 实现这个需求需要在上传前检查图片的大小&#xff0c;格式以及尺寸如何上传也成…...

一个golang版本管理工具

GitHub - moqsien/gvc: GVC is a productive tool to manage your dev environment for multi platforms and machines. | GVC 是一个用于快速配置和管理多机器跨平台的开发环境的生产力工具。 目前&#xff0c;gvc拥有以下功能或特点&#xff1a; go编译器自动安装和添加环…...

SpringBoot整合Spring Security过滤器链加载执行流程源码分析

文章目录1.引言2.Spring Security过滤器链加载1.2.注册名为 springSecurityFilterChain的过滤器2、查看 DelegatingFilterProxy类3.查看 FilterChainProxy类3.1 查看 doFilterInternal方法。3.2 查看 getFilters方法。4 查看 SecurityFilterChain接口5 查看 SpringBootWebSecur…...

Jest使用

一、测试到底测什么 提到测试的时候&#xff0c;即使是最简单的一个代码块可能都让初学者不知所措。最常问的问题的是“我怎么知道要测试什么&#xff1f;”。如果你正在写一个 Web 应用&#xff0c;那么你每个页面每个页面的测试用户交互的方式&#xff0c;就是一个很好的开端…...

定位于企业数字化底座,开箱可用(spring cloud+Vue)基础框架,赶紧收藏!

项目介绍&#xff1a;JVS是什么&#xff1f;JVS是企业级应用构建的基础脚手架&#xff0c;提供开箱即用的基础功能集成&#xff0c;其中集成了账户管理、租户管理、用户权限体系、三方登录、环境配置、各种业务日志等功能&#xff0c;还提供了对接低代码、数据中台的能力。JVS能…...

java字符统计

问题描述 给定一个只包含大写字母的字符串 &#xfffd; S, 请你输出其中出现次数最多的字符。 如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。 输入格式 一个只包含大写字母的字符串 &#xfffd; S. 输出格式 若干个大写字母&#xff0c;代表答案。 …...

C#:Krypton控件使用方法详解(第八讲) ——kryptonBreadCrumb

今天介绍的Krypton控件中的kryptonBreadCrumb&#xff0c;下面开始介绍这个控件的属性&#xff1a;首先要介绍的是RootItem属性和外观属性&#xff1a;RootItem属性组中包含属性如下&#xff1a;image属性&#xff1a;代表在文字对象的前方插入一个图片&#xff0c;属性值如下图…...

2023从0开始学性能(1) —— 性能测试基础【持续更新】

背景 不知道各位大佬有没遇到上面的情况&#xff0c;性能这个东西到底是什么&#xff0c;还是以前的358原则吗&#xff1f;明显并不是适用于现在了。多次想踏入性能测试门槛都以失败告终&#xff0c;这次就以系列的方式来督促自己真正踏进性能测试的门槛。 什么是性能测试 通…...

如何通过一台 iPhone 申请一个 icloud 邮箱账号 后缀为 @icloud.com

总目录 iOS开发笔记目录 从一无所知到入门 文章目录需求关键步骤步骤后续需求 在 iPhone 自带的邮箱软件中添加账号&#xff0c;排第一位的是 iCloud 邮箱&#xff1a; 选 iCloud 之后&#xff1a; 提示信息是exampleicloud.com&#xff0c;也就是说是有icloud.com为域的邮箱…...

SQL89 计算总和

描述OrderItems表代表订单信息&#xff0c;包括字段&#xff1a;订单号order_num和item_price商品售出价格、quantity商品数量。order_numitem_pricequantitya110105a211100a21200a421121a5510a2119a775【问题】编写 SQL 语句&#xff0c;根据订单号聚合&#xff0c;返回订单总…...