Linux驱动开发笔记(六)中断子系统及实验

文章目录

  • 前言
  • 一、中断子系统框架
    • 1. 中断硬件简单描述
    • 2. 中断的软件描述
      • 2.1 中断处理的两部分模型
      • 2.2 系统框架
  • 二、GIC v3中断控制器
    • 1. GIC v3基本结构
      • 1.1 Distributor
      • 1.2 Redistributor
      • 1.3 ITS
      • 1.4 CPU interface
    • 2. 中断类型与特点
    • 3. 中断号
  • 三、函数编写
    • 3.1 相关API函数
    • 3.2 驱动初始化函数
    • 3.3 operations函数
      • 3.3.1 open函数
      • 3.3.2 .read
      • 3.3.3 .release
    • 3.4 中断函数
  • 四、设备树的编辑
    • 1. 设备树插件格式
    • 2. 设备树插件的编写


前言

  本章我们将讲解下和中断相关的知识,了解内核中断的框架和中断的概念,对于arm的中断控制器(GIC v3)相关内容,主要是借鉴参考手册简单解释下。


一、中断子系统框架

  Linux中的中断相似于之前STM32的中断,是硬件在需要时向CPU发出的一种信号,导致CPU暂时停止当前正在执行的程序,转而处理这个硬件请求的一种机制。
  中断发生在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而去为该内部或外部事件或预先安排的事件服务,服务完毕后再返回继续执行原来的程序。

1. 中断硬件简单描述

  中断硬件主要有三种器件参与,各个外设、中断控制器和CPU。之间的关系可以简单看下下面图片:
在这里插入图片描述

2. 中断的软件描述

2.1 中断处理的两部分模型

  上半部(Top Half):在接收到中断后立即执行,完成一些必要的工作(如应答、复位等)。这部分工作有严格的时间限制,需要尽快完成。
  底半部(Bottom Half):在合适的时机执行,完成可以被推迟到后面完成的任务。底半部通常用于执行一些耗时的操作,以避免在中断处理过程中阻塞其他中断的响应。

2.2 系统框架

  一个完整的中断子系统框架可以分为四个层次,由上到下分别为用户层、通用层、硬件相关层和硬件层,每个层相关的介绍如下所示:

  • 用户层:用户层是中断的使用者,主要包括各类设备驱动。这些驱动程序通过中断相关的接口进行中断的申请和注册。当外设触发中断时,用户层驱动程序会进行相应的回调处理,执行特定的操作。
  • 通用层:通用层也可称为框架层,它是硬件无关的层次。通用层的代码在所有硬件平台上都是通用的,不依赖于具体的硬件架构或中断控制器。通用层提供了统一的接口和功能,用于管理和处理中断,使得驱动程序能够在不同的硬件平台上复用。
  • 硬件相关层:硬件相关层包含两部分代码。一部分是与特定处理器架构相关的代码,比如ARM64处理器的中断处理相关代码。这些代码负责处理特定架构的中断机制,包括中断向量表、中断处理程序等。另一部分是中断控制器的驱动代码,用于与中断控制器进行通信和配置。这些代码与具体的中断控制器硬件相关。
  • 硬件层:硬件层位于最底层,与具体的硬件连接相关。它包括外设与SoC(系统片上芯片)的物理连接部分。中断信号从外设传递到中断控制器,由中断控制器统一管理和路由到处理器。硬件层的设计和实现决定了中断信号的传递方式和硬件的中断处理能力。

二、GIC v3中断控制器

  ARM多核处理器里最常用的中断控制器是GIC, GIC是Generic Interrupt Controller的缩写,提供了灵活的和可扩展的中断管理方法,支持单核系统到数百个大型多芯片设计的核心。 主要作用就是接受硬件中断信号,通过一定的设置策略,然后分发给对应的CPU进行处理。
  GIC v3中断控制器是ARM公司推出的一款与cortex-A和cortex-R处理器配合使用的中断控制器,广泛应用于基于armv8的SOC设计中。GIC v3为CPU处理所有连接到其上的中断,包括管理所有的中断源、中断行为、中断分组以及中断路由方式等。同时,它还提供相应的寄存器接口用于软件对这些行为的控制。

1. GIC v3基本结构

  GIC v3包含了SPI(Shared Peripheral Interrupt)、PPI(Private Peripheral Interrupt)、SGI(Software Generated Interrupt)和LPI(Locality-Specific Peripheral Interrupt)四种中断类型,以及distributor、redistributor、ITS(Interrupt Translation Service)和CPU interface四大组件。
在这里插入图片描述
   GIC v3中,将cpu interface从GIC中抽离,放入到了cpu中,cpu interface通过AXI Stream,与gic进行通信。 当GIC要发送中断,GIC通过AXI stream接口,给cpu interface发送中断命令,cpu interface收到中断命令后,根据中断线映射配置,决定是通过IRQ还是FIQ管脚,向cpu发送中断。

1.1 Distributor

  Distributor是GIC v3中用于管理共享外设中断(SPI)的关键组件。它负责接收来自外设的SPI中断请求,并根据配置决定中断的优先级以及将中断路由到哪个Redistributor。

  • 关键特性:
    • 中断分发:Distributor根据中断的优先级、亲和性(affinity)等配置,将SPI中断路由到适当的Redistributor。
    • 优先级管理:Distributor为每个SPI中断设置优先级,确保高优先级的中断能够优先得到处理。
    • 中断状态管理:Distributor维护中断的状态信息,如中断是否激活、是否挂起等。
  • 寄存器接口:
    • GICD_系列寄存器(如GICD_ISENABLER、GICD_ICENABLER、GICD_IPRIORITYR等)用于配置Distributor的行为,包括启用/禁用中断、设置中断优先级等。

1.2 Redistributor

  Redistributor与CPU接口连接,负责将来自Distributor的中断路由到正确的CPU。在多核系统中,Redistributor确保中断被正确地分发到目标CPU或CPU组。

  • 关键特性:

    • 中断路由:Redistributor根据配置将中断路由到相应的CPU接口。
    • 亲和性管理:Redistributor支持中断的亲和性配置,允许中断被路由到特定的CPU或CPU组。
  • 寄存器接口:

    • GICR_系列寄存器(如GICR_ISENABLER、GICR_ICENABLER等)用于配置Redistributor的行为,包括启用/禁用中断、设置中断路由等。

1.3 ITS

  ITS是GIC v3中用于处理基于消息的中断(LPI)的组件。它提供LPI中断的转换服务,将来自虚拟中断源的LPI中断转换为物理中断源,并将其路由到适当的Redistributor。

  • 关键特性:
    • 中断转换:ITS将LPI中断转换为物理中断,以便在物理世界中进行处理。
    • 中断路由:ITS负责将LPI中断路由到正确的Redistributor。

1.4 CPU interface

  CPU interface是GIC v3与CPU之间的接口,负责将中断传递到它所连接到的处理器元素(PE,即CPU)。当Redistributor将中断路由到某个CPU接口时,该接口会将中断信号发送到相应的CPU。

  • 关键特性:
    • 中断传递:CPU interface将来自Redistributor的中断信号传递给CPU。
    • 中断状态管理:CPU interface可能还负责维护中断的状态信息,如中断是否已被CPU接收、是否正在处理等。

2. 中断类型与特点

  • SPI:共享外设中断,不与特定的CPU绑定,可以根据affinity配置被路由到任意CPU或一组特定的CPU上。
  • PPI:私有外设中断,每个处理器私有的中断类型,即一个特定的中断只会被路由到特定的处理器上。
  • SGI:软件生成中断,没有实际的物理连线,而是由软件通过写寄存器方式触发,只支持边沿触发。
  • LPI:基于消息的中断,LPI相关的配置保存在内存中而非寄存器。
NTID范围中断类型备注
0 - 15SGI(软件生成中断) 文本居右每个核心分别存储
16 - 31PPI(私有外设中断)每个核心分别存储
32 - 1019SPI(共享外设中断)
1020 - 1023特殊中断号用于表示特殊情况
1024 - 8191保留
8192及更大LPI(特定局部外设中断)上限由实现定义

在这里插入图片描述

  • Inactive(非活动状态):中断源当前未被触发。
  • Pending(等待状态):中断源已被触发,但尚未被处理器核心确认。
  • Active(活动状态):中断源已被触发,并且已被处理器核心确认。
  • Active and Pending(活动且等待状态):已确认一个中断实例,同时另一个中断实例正在等待处理。

每个外设中断可以是以下两种类型之一:

  • 边沿触发(Edge-triggered):
    这是一种在检测到中断信号上升沿时触发的中断,然后无论信号状态如何,都保持触发状态,直到满足本规范定义的条件来清除中断。
  • 电平触发(Level-sensitive):
    这是一种在中断信号电平处于活动状态时触发的中断,并且在电平不处于活动状态时取消触发。

3. 中断号

  在linux 内核中,我们使用IRQ number和HW interrupt ID两个ID来标识一个来自外设的中断:

  • IRQ number:CPU需要为每一个外设中断编号,我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。
  • HW interrupt ID:对于GIC中断控制器而言,它收集了多个外设的interrupt request line并向上传递,因此,GIC中断控制器需要对外设中断进行编码。GIC中断控制器用HW interrupt ID来标识外设的中断。如果只有一个GIC中断控制器,那IRQ number和HW interrupt ID是可以一一对应的,如下图所示:
    在这里插入图片描述
      但如果是在GIC中断控制器级联的情况下,仅仅用HW interrupt ID就不能唯一标识一个外设中断,还需要知道该HW interrupt ID所属的GIC中断控制器(HW interrupt ID在不同的Interrupt controller上是会重复编码的)。

三、函数编写

3.1 相关API函数

函数名描述
irq_of_parse_and_map( )解析得到软中断号
request_irq( )注册中断
devm_request_irq( )注册中断,申请的是内核“managed”的资源
free_irq( )释放中断
*irq_handler_t( )指定一个中断处理函数
enable_irq( )中断的使能
disable_irq( )中断的屏蔽
gpio_to_irq( )将 GPIO 引脚映射到对应中断号的函数
//解析得到软中断号
unsigned int irq_of_parse_and_map(struct device_node *np, int index)
  • 参数:
    • np:节点指针
    • index:设备树节点中interrupts键对应值的下标
  • 返回值:成功返回软中断号,失败返回0
//注册中断
static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler,unsigned long flags, const char *name, void *dev);
  • 参数:
    • irq:软中断号(内核中用到的中断号全部都是软中断号)(设备树获取)
    • handler:中断处理函数指针
    • flags:中断触发方式
      • IRQF_TRIGGER_RISING //上升沿
      • IRQF_TRIGGER_FALLING //下降沿
      • IRQF_TRIGGER_HIGH //高电平
      • IRQF_TRIGGER_LOW //低电平
      • IRQF_SHARED //共享中断
    • name:中断的名字
      cat /proc/interrupts 命令查看(设备号的查看方式 cat /proc/device)
    • dev:给中断处理函数传递的参数
  • 返回值:成功返回0,失败返回错误码

  此函数与request_irq()的区别是devm_开头的API申请的是内核“managed”的资源,一般不需要在出错处理和 remove()接口里再显式的释放。

int devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id);
  • 参数:
    • dev:指向您的设备的 struct device 结构体指针。这个结构体包含了设备的各种信息,并且允许设备管理器跟踪与该设备相关的所有资源。
    • irq:要请求的中断号。
    • handler:当中断触发时要调用的处理函数。
    • irqflags:标志位,用于指定中断处理函数的行为,如 IRQF_SHARED 允许多个处理程序共享同一个中断。
    • devname:与中断关联的名称,通常用于调试和日志记录。
    • dev_id:传递给中断处理函数的参数,允许您在中断处理程序中区分不同的中断源或设备实例。
  • 返回值:
    • 如果成功请求了中断,则返回 0。
    • 如果失败(例如,由于中断号无效、中断已被占用且未标记为可共享等),则返回负的错误码。

注:这里简单介绍一下中断处理函数指针

//typedef irqreturn_t (*irq_handler_t)(int, void *);
irqreturn_t key_irq_handle(int irqno,void *dev)
{//中断的处理---中断处理函数中不能加延时耗时的操作return IRQ_NONE;    //失败return IRQ_HANDLED; //成功
}
//释放中断
const void *free_irq(unsigned int irq, void *dev_id);
  • 参数:
    • irq:软中断号
    • dev_id:给中断处理函数传递的参数
  • 返回值:返回设备的名字
//在中断申请时需要指定一个中断处理函数
irqreturn_t (*irq_handler_t)(int irq, void * dev);
  • 参数:
    • int irq:表示触发中断的中断号(IRQ number)
    • void *dev:一个指向任何类型数据的指针,通常由 request_irq 或 devm_request_irq 函数的调用者提供,并传递给中断处理函数。这个指针通常用于传递与中断相关的设备或驱动程序的上下文信息
  • 返回值:
    • irqreturn_t类型:枚举类型变量
      • IRQ_NONE(0 << 0): 中断没有被处理
      • IRQ_HANDLED (1 << 0):中断被成功处理
      • IRQ_WAKE_THREAD(1 << 1):在中断服务函数是使用“上半部分”和“下半部分”实现
//中断的屏蔽和使能
void enable_irq(unsigned int irq);
void disable_irq(unsigned int irq);
  • 参数:
    • irq:指定的“内核中断号”
  • 返回值:无
//将 GPIO 引脚映射到对应中断号的函数,它的作用是根据给定的 GPIO 引脚号,获取与之关联的中断号。
#include <linux/gpio.h>
unsigned int gpio_to_irq(unsigned int gpio);
  • 参数:
    • gpio:要映射的 GPIO 引脚号。
  • 返回值:
    • 成功:返回值为该 GPIO 引脚所对应的中断号。
    • 失败:返回值为负数,表示映射失败或无效的 GPIO 引脚号。

3.2 驱动初始化函数

static int __init button_driver_init(void)
{int error = -1;//采用动态分配的方式,获取设备编号,次设备号为0,error = alloc_chrdev_region(&button_devno, 0, DEV_CNT, DEV_NAME);if (error < 0){printk("fail to alloc button_devno\n");goto alloc_err;}//关联字符设备结构体cdev与文件操作结构体file_operationsbutton_chr_dev.owner = THIS_MODULE;cdev_init(&button_chr_dev, &button_chr_dev_fops);//添加设备至cdev_map散列表中error = cdev_add(&button_chr_dev, button_devno, DEV_CNT);if (error < 0) {printk("fail to add cdev\n");goto add_err;}class_button = class_create(THIS_MODULE, DEV_NAME); //创建类//创建设备 DEV_NAME 指定设备名device_button = device_create(class_button, NULL, button_devno, NULL, DEV_NAME);return 0;add_err:// 添加设备失败时,需要注销设备号unregister_chrdev_region(button_devno, DEV_CNT);    printk("\n error! \n");alloc_err:return -1;
}

3.3 operations函数

3.3.1 open函数

static int button_open(struct inode *inode, struct file *filp)
{int res = -1;//获取按键 设备树节点button_device_node = of_find_node_by_path("/button_interrupt");if(NULL == button_device_node){printk("of_find_node_by_path error!");return -1;}//获取按键使用的GPIObutton_GPIO_number = of_get_named_gpio(button_device_node ,"button-gpios", 0);if(0 == button_GPIO_number){printk("of_get_named_gpio error");return -1;}//申请GPIO,记得释放res = gpio_request(button_GPIO_number, "button_gpio");if(error < 0){printk("gpio_request error");gpio_free(button_GPIO_number);return -1;}//设置为输入模式res = gpio_direction_input(button_GPIO_number);//获取中断号interrupt_number = irq_of_parse_and_map(button_device_node, 0);printk("\n interrupt_number =  %d \n",interrupt_number);//申请中断, 记得释放res = request_irq(interrupt_number,button_irq_hander,IRQF_TRIGGER_RISING,"button_interrupt",NULL);if(error != 0){printk("request_irq error");free_irq(interrupt_number, NULL);return -1;}return 0;
}

3.3.2 .read

static int button_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{int error = -1;int button_countervc = 0;//读取按键状态值button_countervc = atomic_read(&button_status);//结果拷贝到用户空间error = copy_to_user(buf, &button_countervc, sizeof(button_countervc));if(error < 0){printk_red("copy_to_user error");return -1;}//清零按键状态值atomic_set(&button_status,0);return 0;
}

3.3.3 .release

static int button_release(struct inode *inode, struct file *filp)
{//释放申请的引脚,和中断gpio_free(button_GPIO_number);free_irq(interrupt_number, device_button);printk("release over!");return 0;
}

3.4 中断函数

//定义整型原子变量,保存按键状态 ,设置初始值为0
atomic_t   button_status = ATOMIC_INIT(0);  static irqreturn_t button_irq_hander(int irq, void *dev_id)
{printk("hander has entered!");//按键状态加一atomic_inc(&button_status);return IRQ_HANDLED;
}

四、设备树的编辑

1. 设备树插件格式

  设备树插件(Device Tree Overlay)是一种用于设备树(Device Tree)的扩展机制,它在Linux内核的嵌入式系统中发挥着重要作用。设备树插件允许在运行时动态修改设备树的内容,以便添加、修改或删除设备节点和属性。它提供了一种灵活的方式来配置和管理硬件设备,而无需重新编译整个设备树。通过使用设备树插件,开发人员可以在不重新启动系统的情况下对硬件进行配置更改。

#用于指定dts的版本/dts-v1/;#表示允许使用未定义的引用并记录它们,设备树插件中可以引用主设备树中的节点
#这些“引用的节点”对于设备树插件来说就是未定义的,所以设备树插件应该加上“/plugin/”
/plugin/;&{/} {/*此处在根节点"/"下,添加要插入的节点或者属性*/
};&XXXXX {/*此处在节点"XXXXX"下,添加要插入的节点或者属性*/
};.......

2. 设备树插件的编写

#触发方式
#define IRQ_TYPE_NONE           0
#define IRQ_TYPE_EDGE_RISING    1
#define IRQ_TYPE_EDGE_FALLING   2
#define IRQ_TYPE_EDGE_BOTH      (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
#define IRQ_TYPE_LEVEL_HIGH     4
#define IRQ_TYPE_LEVEL_LOW      8&{/} {#新增的button_interrupt节点button_interrupt: button_interrupt {status = "okay";compatible = "button_interrupt";#配置按键引脚button-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_LOW>;#插件按键引脚的复用信息pinctrl-names = "default";pinctrl-0 = <&button_interrupt_pin>;#表示父中断控制节点是gpio0interrupt-parent = <&gpio0>;#表示中断引脚,触发方式interrupts = <RK_PB0 IRQ_TYPE_LEVEL_LOW>;};};&{/pinctrl} {pinctrl_button {button_interrupt_pin: button_interrupt_pin {rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;};};
};

免责声明:本文参考了野火的部分资料,仅供学习参考使用,若有侵权或勘误请联系笔者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/342055.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea启动项目 OutOfMemoryError: 内存不足

解决方案&#xff1a;修改共享构建进程堆大小即可 如果小伙伴们有什么疑问&#xff0c;欢迎下面评论。欢迎指正。如还有什么不懂的加我 QQ&#xff1a;517861659 如果没有及时回复&#xff0c;可以点我先问问AI机器人​编辑https://chatgpt.byabstudio.com/login?code2023070…

Fortigate防火墙二层接口的几种实现方式

初始配置 FortiGate出厂配置默认地址为192.168.1.99&#xff08;MGMT接口&#xff09;&#xff0c;可以通过https的方式进行web管理&#xff08;默认用户名admin&#xff0c;密码为空&#xff09;&#xff0c;不同型号设备用于管理的接口略有不同。 console接口的配置 防火墙…

电脑在线怎么改图片格式?3步改图片格式的操作步骤

在日常生活和工作中经常会因为不同的用途&#xff0c;需要使用不同格式的图片&#xff0c;那么如果遇到图片格式问题时&#xff0c;有什么方法能够快速在线转图片格式呢&#xff1f; 想要快速将图片格式转换成自己需要使用的格式&#xff0c;比较简单的一种方法可以使用网上的…

3 - 大的国家(高频 SQL 50 题基础版)

3.大的国家 -- 查询属性&#xff1a;国家名称、人口和面积 select name,population,area fromWorld where area>3000000 OR population>25000000;

Redis实战篇——搭建主从复制

Redis实战篇——搭建主从复制 1.Redis主从1.1.主从集群结构1.2.搭建主从集群1.2.1.启动多个Redis实例1.2.2.建立集群1.2.3.测试 1.Redis主从 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离…

Python Flask 入门开发

Python基础学习&#xff1a; Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习&#xff1a; Python中如何选择Web开发框架&#xff1f;Pyth…

代码随想录 day27|day28|day29

回溯2 切割问题&#xff1a;是在每个节点判断是否是要剪枝收割元素。 startidx 是切割起点&#xff0c;i是本次切割终点 分割回文串 复原ip地址 非递减子序列 都是在树的节点依照题意判断&#xff0c;之后决定是否剪枝。 也就是都有if判断来剪枝 。 下面是非递减子序列。 下…

关于stm32的软件复位

使用软件复位的目的&#xff1a; 软件复位并不会擦除存储器中的数据&#xff0c;它只是将处理器恢复到复位状态&#xff0c;即中断使能位被清除&#xff0c;系统寄存器被重置&#xff0c;但RAM和Flash存储器中的数据保持不变。 STM32软件复位(基于库文件V3.5) &#xff0c;对…

IDC发布《中国WAAP厂商技术能力评估,2024》研究报告

从市场规模来看&#xff0c;未来WAAP将逐步替代WAF&#xff0c;成为Web应用安全市场主流产品&#xff0c;同时也将涵盖API安全等其它市场。 随着云原生和微服务架构的兴起&#xff0c;Web业务的部署和管理方式发生了巨大变化。以APP应用和小程序为代表的移动应用使用量骤增&am…

使用眼精星票证识别系统识别国外护照的操作指南

你知道吗&#xff1f;在这个全球化的大潮中&#xff0c;处理和管理各类国际证件简直是头疼得要命&#xff01; 想象一下&#xff0c;你面前堆满了来自世界各地的护照&#xff0c;每个护照上的信息都要手动录入&#xff0c;这得花多少时间啊&#xff01;不过&#xff0c;别急&am…

vscode 离线下载指定版本插件和安装方法

1、背景 由于不同的vscode版本需要安装对应的插件版本&#xff0c;一般情况下&#xff0c;vscode版本会落后于vscode插件库提供的可以下载的插件版本&#xff0c;网页一般只会提供最新的插件下载版本&#xff0c;因此我们需要下载指定的版本需要采取一些措施。 2、获取需要安…

2.1.4 采用配置类与注解方式使用MyBatis

实战概述&#xff1a;采用配置类与注解方式使用MyBatis 创建MyBatis配置类 在net.huawei.mybatis.config包中创建MyBatisConfig类&#xff0c;用于配置MyBatis核心组件&#xff0c;包括数据源、事务工厂和环境设置。 配置数据源和事务 使用PooledDataSource配置MySQL数据库连接…

生命在于学习——Python人工智能原理(3.2)

三、深度学习 &#xff08;二&#xff09;人工神经网络 人工神经网络是模仿人类大脑神经系统工作原理所创建的数学模型&#xff0c;有并行的分布处理能力、高容错性和自我学习等特征。 1、感知器 感知器由Frank Roseblatt于1957年提出&#xff0c;是一种广泛使用的线性分类…

K8s种的service配置

什么是service 官方的解释是:   k8s中最小的管理单元是pod&#xff1b;而service是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法;   Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种服务发现机制。 你可以在 Pod 集合中运行代码…

安防综合管理系统EasyCVR视频汇聚平台GA/T 1400协议中的关键消息交互示例

在当今的信息化时代&#xff0c;公共安全防范日益成为保障社会和谐稳定的关键。视频监控系统作为现代安全防范的重要手段&#xff0c;正不断在公安、交通、城市管理等领域发挥着越来越重要的作用。而GA/T 1400协议视图库&#xff0c;作为公安视频图像信息应用系统的标准&#x…

计算机网络 期末复习(谢希仁版本)第1章

大众熟知的三大网络&#xff1a;电信网络、有线电视网络、计算机网络。发展最快起到核心的是计算机网络。Internet是全球最大、最重要的计算机网络。互联网&#xff1a;流行最广、事实上的标准译名。互连网&#xff1a;把许多网络通过一些路由器连接在一起。与网络相连的计算机…

Python dateutil库:日期和时间处理的利器

更多Python学习内容&#xff1a;ipengtao.com Python的dateutil库是一个强大且灵活的日期和时间处理工具。它扩展了标准库中的datetime模块&#xff0c;提供了更多的功能和更高的灵活性。dateutil库特别适用于复杂的日期解析、日期计算、时区转换和重复事件处理。本文将详细介绍…

【全开源】在线投票系统(微信公众号+PC端)

&#x1f525;在线投票系统&#xff0c;让决策更民主更高效&#xff01;&#x1f680;​​ &#x1f308; 一、什么是在线投票系统&#xff1f; 在数字化时代&#xff0c;我们越来越多地依赖科技来辅助我们的工作与生活。在线投票系统&#xff0c;就是这样一个神奇的工具。简…

【云原生】Kubernetes----RBAC用户资源权限

目录 引言 一、Kubernetes安全机制概述 二、认证机制 &#xff08;一&#xff09;认证方式 1.HTTPS证书认证 1.1 证书颁发 1.2 config文件 1.3 认证类型 1.4 Service Account 1.4.1 作用 1.4.2 包含内容 1.4.3 与Secret的关系 2.Bearer Tokens 3.基本认证 三、鉴…

Python编程学习第一篇——制作一个小游戏休闲一下

到上期结束&#xff0c;我们已经学习了Python语言的基本数据结构&#xff0c;除了数值型没有介绍&#xff0c;数值型用的非常广&#xff0c;但也是最容易理解的&#xff0c;将在未来的学习中带大家直接接触和学习掌握。后续我们会开始学习这门语言的一些基础语法和编程技巧&…