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

连云港建设网站/搜索引擎有哪些软件

连云港建设网站,搜索引擎有哪些软件,网站水印怎么做的,wordpress 动态效果文章目录 层层调用层层注册多个中断控制器的金字塔结构与中断批发商PCIe legacy 中断控制器 irq domainirq domain的历史irq domain 实例irq domain 如何注册 层层递进,中断架构本是如此,linux只是做了软件该做的事情最简单的arm架构是如此 cpugicdevice层层调用 中断发生流程…

文章目录

  • 层层调用
  • 层层注册
  • 多个中断控制器的金字塔结构与中断批发商
    • PCIe legacy 中断控制器
  • irq domain
    • irq domain的历史
    • irq domain 实例
    • irq domain 如何注册

层层递进,中断架构本是如此,linux只是做了软件该做的事情最简单的arm架构是如此
cpugicdevice

层层调用

  • 中断发生流程,层层调用,这里简化为三级
//以 arm32架构 + vic 控制器 + usb控制器 为例 ,说明 
vector_irqvic_handle_irqusb_hcd_irq 
[<c03920c4>] (usb_hcd_irq) from [<c0147678>] (__handle_irq_event_percpu+0x40/0x128)
[<c0147678>] (__handle_irq_event_percpu) from [<c0147788>] (handle_irq_event_percpu+0x28/0x7c)
[<c0147788>] (handle_irq_event_percpu) from [<c0147804>] (handle_irq_event+0x28/0x3c)
[<c0147804>] (handle_irq_event) from [<c014b2bc>] (handle_level_irq+0x9c/0x114)  
[<c014b2bc>] (handle_level_irq) from [<c0146f34>] (generic_handle_irq+0x30/0x44) 
[<c0146f34>] (generic_handle_irq) from [<c0146f90>] (__handle_domain_irq+0x48/0xa8)
[<c0146f90>] (__handle_domain_irq) from [<c030cedc>] (vic_handle_irq+0x58/0x9c)  
[<c030cedc>] (vic_handle_irq) from [<c0100b4c>] (__irq_svc+0x6c/0x90)
层层调用中最复杂的是 vic_handle_irq 调用到 usb_hcd_irq
vic_handle_irqfor_each_vic handle_one_vic(&vic_devices[i], regs);for_each_which_int_status_is_1_on_vic handle_domain_irq(vic->domain, irq, regs) // 这里的irq 为 一个 domain 内的 硬件中断号__handle_domain_irq(domain, hwirq, true, regs);irq_enter();irq = irq_find_mapping(domain, hwirq);generic_handle_irq(irq);struct irq_desc *desc = irq_to_desc(irq);generic_handle_irq_desc(desc);desc->handle_irq(desc);irq_exit();// 从整个过程来看, 一个 domain 中的 一个中断的 流程就是 
// 1. 读中断状态寄存器,判断是哪个中断源
// 2. 根据 中断源的硬件中断号 得到 软件中断号
// 3. 根据 软件中断号 得到 对应的 irq_desc 
// 4. 调用 irq_desc->handle_irq // 即 驱动中 调用 request_irq 注册 的handler// 即 中断状态寄存器 -> 中断源的硬件中断号 -> 软件中断号 -> irq_desc  -> (irq_desc->handle_irq)
// 这里面的domain 维护了 "中断源的硬件中断号 -> 软件中断号"
// 软件中断号 -> irq_desc 在整个系统中是一一对应的

层层注册

在arm 的硬件上,不管是arm32,arm64,riscv, 入口都只有简单的1个或两个
但是设备的中断却很多,事实上,他们都得到了正确的调用.
这归功与正确的注册
  • 一级处理函数的注册
vector_irq  这个是写到某个地址 , 这个地址 是个固定值 或者 写到了  一个寄存器 , 等同于 向 硬件注册了这个函数
  • 二级处理函数的注册
set_handle_irq(vic_handle_irq); // kernel/irq/handle.c提供的这个比较简单,不描述了参考 https://blog.csdn.net/u011011827/article/details/116232892
  • 三级处理函数的注册
1. 根据硬件中断号获取软件中断号参考  https://blog.csdn.net/u011011827/article/details/127510337 int linux_irq = of_irq_get(pdev->dev.of_node,0);int linux_irq = irq_of_parse_and_map(pdev->dev.of_node,0);struct resource res; of_irq_to_resource(pdev->dev.of_node, 0, &r);int linux_irq = res.start;----------------------------------------------------------------------int linux_irq = platform_get_irq(pdev,index);int linux_irq = platform_get_irq_by_name(pdev,name);int linux_irq = platform_get_resource(pdev,IORESOURCE_IRQ,index);int linux_irq = platform_get_resource_byname(pdev,IORESOURCE_IRQ,name);struct resource *res = platform_get_resource(pdev,IORESOURCE_IRQ,0);int linux_irq = res->start;----------------------------------------------------------------------以上这些api 都是 1.获取 硬件中断号2.找到 设备树指定的 设备节点的 interrupt-parents3.去 对应的 domain 中 根据 硬件中断号 去获取 软件中断号4.返回 软件中断号2. 利用软件中断号注册中断处理函数usb_add_hcd(hcd,irqnum  -> request_irq(irqnum, &usb_hcd_irq // include/linux/interrupt.h 提供这里面 irqnum 的获取 涉及到 了 domain

多个中断控制器的金字塔结构与中断批发商

如果一个系统中存在多个中断控制器,那么所有的中断控制器呈金字塔架构
下级中断控制器向 上级中断控制器批发硬件中断号.
并向下面的设备展示为 更多的中断号.最顶层的中断控制器是 core 的中断控制例如 arm32的 irq中断控制器因为只有一根中断线,即irq所以只需要一个使能开关就可以了. // 在用户侧呈现为 cpsr 的一个bit, 可以用指令操作.不需要 mask 和 pending 相关的逻辑例如 riscv 的 plic 的 广义异常参考 https://blog.csdn.net/u011011827/article/details/121490606

PCIe legacy 中断控制器

	多个中断控制器的金字塔结构与中断批发商例如 pcie 的legacy 中断向 gic 中断控制器 批发了1个作为gic中断控制器的下级中断控制器,告诉pcie上连接的所有设备有4个中断批发了一个irq = platform_get_irq_byname(pdev, "legacy");irq_set_chained_handler_and_data(irq, rockchip_pcie_legacy_int_handler, rockchip);告诉所有的设备有4个pcie 的中断控制器呈现给下面的设备的硬件中断号 number 为 1 2 3 4在系统中注册的软件中断号为 N , N+1 , N+2 , N+3N   对应的irq_desc 的链表上 连接了 所有 支持 legacy INTA的 中断处理函数N+1 对应的irq_desc 的链表上 连接了 所有 支持 legacy INTB的 中断处理函数N+2 对应的irq_desc 的链表上 连接了 所有 支持 legacy INTC的 中断处理函数N+3 对应的irq_desc 的链表上 连接了 所有 支持 legacy INTD的 中断处理函数以 rk3399 的pcie 为例,中断函数调用流程为rockchip_pcie_legacy_int_handleru32 reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS);reg = (reg & PCIE_CLIENT_INTR_MASK) >> PCIE_CLIENT_INTR_SHIFT; // mask 某个bit为 0 时关闭 对应的中断while (reg) {hwirq = ffs(reg) - 1; // 获取中断原因:是A(1),还是B(2),还是C(3),还是D(4)reg &= ~BIT(hwirq); virq = irq_find_mapping(rockchip->irq_domain, hwirq); // 找到该irq domain 中 hwirq 对应的 软件中断号generic_handle_irq(virq); // 调用该 软件中断号对应的 链表上的所有的 中断处理函数}设备树描述为下pcie0: pcie@f8000000 {// 其中 legacy 为 向gic 批发的中断interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH 0>,                         <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH 0>,                             <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH 0>;                             interrupt-names = "sys", "legacy", "client";// 下面的是 告诉pcie 设备 pcie 是个中断控制器,有4个硬件中断,号码分别为 1 2 3 4// 当然,这是设备树的内容,代码解析过后就是上面一行的内容interrupt-map-mask = <0 0 0 7>;                                          interrupt-map = <0 0 0 1 &pcie0_intc 0>,                                 <0 0 0 2 &pcie0_intc 1>,                                         <0 0 0 3 &pcie0_intc 2>,                                         <0 0 0 4 &pcie0_intc 3>;pcie0_intc: interrupt-controller {                                       interrupt-controller;                                                #address-cells = <0>;                                                #interrupt-cells = <1>;                                              };};当枚举完设备时,会读设备配置的 Interrupt Pin (RO) , 读出来是 1 2 3 4 ,然后构造 pci_dev ,在其成员 irq 中填充 一个 对应的 软件中断号如果pci设备 A 的 Interrupt Pin 是 1  , B的也是 1 , 那么 两个 pci_dev 的irq 成员的值是一样的.
-----------------------------以下是不建议的写法interrupt-map = <0 0 0 1 &pcie0_intc 0>,                                 <0 0 0 2 &pcie0_intc 0>,                                         <0 0 0 3 &pcie0_intc 0>,                                         <0 0 0 4 &pcie0_intc 0>;注意 pcie0_intc  后面的 0相当于 只有一个软件中断,只要一个pci设备的中断发生了,那么下面的软件流程会调用所有pci设备的中断处理函数而如果是 0 1 2 3 的话,如果一个 pci 的中断发生了,他的Interrupt Pin 为 A, 那么下面的软件流程会调用 A 对应的 软件中断号 链表上的中断处理函数而不会调用 B/C/D 对应的 软件中断号 链表上的中断处理函数pcie 实例说明了一个问题一个linux irq 上可以注册多个中断处理函数所以中断处理函数 第一件事  就是要判定自己的中断 是否触发!!!
为什么pcie 可以作为中断控制器1.他需要外接设备 且 设备有中断需求2.一级中断控制器gic 没有 pin脚3.pcie 有中断相关的寄存器3.1 使能开关3.2 mask3.3 pending寄存器

irq domain

irq domain的历史

  • 为什么会被引入
The current design of the Linux kernel uses a single large number
space where each separate IRQ source is assigned a different number.
This is simple when there is only one interrupt controller, but in
systems with multiple interrupt controllers the kernel must ensure
that each one gets assigned non-overlapping allocations of Linux
IRQ numbers.The number of interrupt controllers registered as unique irqchips
show a rising tendency: for example subdrivers of different kinds
such as GPIO controllers avoid reimplementing identical callback
mechanisms as the IRQ core system by modelling their interrupt
handlers as irqchips, i.e. in effect cascading interrupt controllers.Here the interrupt number loose all kind of correspondence to
hardware interrupt numbers: whereas in the past, IRQ numbers could
be chosen so they matched the hardware IRQ line into the root
interrupt controller (i.e. the component actually fireing the
interrupt line to the CPU) nowadays this number is just a number.For this reason we need a mechanism to separate controller-local
interrupt numbers, called hardware irq's, from Linux IRQ numbers.
以上说的 层层中断控制器 中的 每一个中断控制器都是一个irq domain

irq domain 实例

  • /proc/interrupts如何解析
// 这是 ok6410a  linux-5.11 上的 中断
# cat /proc/interrupts CPU0       58:          0       VIC  26 Edge      s3c2410-wdt			// VIC059:       2367       VIC  27 Edge      samsung_time_irq 	// VIC069:        326       VIC   5 Edge      s3c6400-uart 		// VIC188:       1260       VIC  24 Edge      mmc0 				// VIC1
Err:          0
Int. No.SourcesDescriptionGroup
63(32+31)INT_ADCADC-EOC-interruptVIC1
56(32+24)INT_HSMMC0HSMMC0-interruptVIC1
37(32+5)INT_UART0UART0-interruptVIC1
32(32+0)INT_EINT2External interrupt 12-19VIC1
31INT_LCD[2]LCD interrupt. System I/F doneVIC0
27INT_TIMER3Timer 3 interruptVIC0
26INT_WDTWatchdog timer interruptVIC0
0INT_EINT0External interrupt 0-3VIC0

irq domain 如何注册

搜索 irq_domain_add
看 整个系统中有多少个irq domain , 就看代码中调用了几次简单的系统 ok6410, vic 是一个 irq domain , gpio 是一个 irq domain还有些系统带pcie , pcie控制器 驱动代码 为了 实现  legacy 中断, 也调用了 irq_domain_add在设备树中也可以看到,搜索interrupt-controller, 和 代码是一对一的s3c64xx.dtsi 中 		vic0 和 vic1 	是 interrupt-controllers3c64xx-pinctrl.dtsi 中 gpa gpb ... gpq 也都是 interrupt-controller
http://www.jmfq.cn/news/4893139.html

相关文章:

  • 免费注册网站哪个好/路由优化大师
  • 装修网网站建设/北京seo加盟
  • 南京网页网站制作/常见的搜索引擎
  • 福州cms建站/网络营销方案的制定
  • 网络存储上做网站/如何申请网站域名流程
  • 传奇公益服/浙江关键词优化
  • 能免费做微信群推广的网站/十大seo公司
  • 国外饮品网站/四川seo
  • 追设计网站/天津seo排名收费
  • 廊坊建站/大数据营销案例分析
  • 网站开发设计心得/培训网站制作
  • 编程跟做网站/正规的微信推广平台
  • 丰台建站推广/域名大全免费网站
  • 做学校网站会下线吗/seo综合查询站长工具关键词
  • 制作一个网站需要多长时间/东莞网站推广优化公司
  • 龙岗附近网站建设/超级推荐的关键词怎么优化
  • 网站开发项目实训/skr搜索引擎入口
  • 游戏网站建设与策划/wp博客seo插件
  • 网站建设平台合同模板下载/站优云seo优化
  • wordpress安装windows/深圳知名网络优化公司
  • 网站内容告知书/西安关键词排名推广
  • 网站建设公司运营经验/中小企业网站优化
  • 网站开发微信授权登录/百度正版下载并安装
  • 做的最好的epub网站/可以免费发广告的网站有哪些
  • 公司网站设计与制/百度资源搜索平台官网
  • 昆明学院网站建设与维护试题/徐州seo
  • 环保企业的网站怎么做/网络推广的工作好做吗
  • 做时时彩网站被抓/百度快照客服人工电话
  • 江西企业网站建设费用/怎么样在百度上免费推广
  • 长沙微网站制作/搜索引擎广告图片