卷一 内核源代码分析 第二章 异常 2.2.1 cortex A9多核处理器的中断控制器GIC---2.2.2 Mt6577的中断体系 图书试读版-请勿转载

Zynq7000系列FPGA中的中断 本文介绍Zynq7000系列FPGA中的系统级中断环境和中断控制器的功能 阅读详情


作者 crosskernel@gmail.com


2.2.1cortex A9多核处理器的中断控制器GIC

对于多核处理器来说,中断有着新的使命---处理器间通信,在CA9以前,每种SOC的中断控制器是自己实现的,但是到了CA9 SMP以后,中断控制器成为了ARM规范的一部分,各家的处理器都遵循arm 中断控制器GIC规范:《IHI0048A_gic_architecture_spec》。其中原因在于,对于非SMP的架构,中断控制器就是控制中断的功能,完成中断的记录、ack、屏蔽等功能即可,各家厂商爱怎么玩就怎么玩。但是到了SMP结构下,除了ack、记录、屏蔽之外,中断控制器还面临如下问题:
中断分发给哪颗处理器
处理器间通信如何实现--处理器通信本质上就是一种中断
处理器局部中断


ARM提供的中断控制器GIC,就是解决以上问题,根据GIC规范,中断安排如下。参见《IHI0048A_gic_architecture_spec》的“Figure 2-1 GIC logical partitioning into Distributor and CPU interfaces”


32-1019 SPI   全局中断,可指定分发到不同的处理器
16-31 PPP    处理器局部中断,处理器局部可见
0-15 SGI     软件产生中断,由cpu写ICDSGIR产生,可指定分发到不同的处理器


而GIC本身分成两份
GIC的DIST部分,这部分是所有CPU公用的
每个CPU自己CPU interface部分, 这部分控制寄存器地址,只能被CPU局部可见,ARM推荐各SOC厂商将该地址实现为相同位置。


以上概念在GIC描述结构,struct gic_chip_data得到体现: 


struct gic_chip_data {
unsigned int irq_offset;   //中断号的偏移量
void __percpu __iomem **dist_base; //记录每颗CPU访问GIC Dist的基地址
void __percpu __iomem **cpu_base; //记录每颗CPU访问GIC CPU interface的基地址,每颗处理器看到同样的地方,但是访问的却是不同的寄存器
    …
unsigned int gic_irqs;
};






2.2.2 Mt6577的中断体系


MTK与Android是绝配。在智能机时代, MTK尽管开始走了段弯路,但是很快拨乱反正。MTK的智能机时代策略,与其功能机时代如出一辙,这与其市场定位有关。
MTK手机处理器的技术路线,不追求最快,但一定会在市场需要的准时出现;不追求最强,但一定能流畅运行最新版本的Android系统与应用。
MTK的公板,从器件选型、电路板设计到Android系统实现,MTK亲力亲为几乎做好了所有技术上的工作。MTK的参考设计总是能做到与大陆手机产业链完美匹配,着力支持手机供应链中最常用、供货最有保障器件和外设,而同一种功能器件和外设,进行多家验证,以确保整机商供应链的安全。由此,良性循环,华南的IC、模具、LCD、SMT等产业链以MTK马首是瞻,总是自觉的将自己产品与MTK公板的兼容性作为其重要工作。


  本节分析MT6577的中断体系。Mt6577的Datasheet不是个公开的文档,况且该文档里也并没有清晰的阐述其中断体系的结构。 但是通过U8836d公开的代码却可以完整的分析出mt6577的中断架构。Mt6577的中断体系的最高层依然遵循GIC规范,可参见ARM公司release相关技术文件。Mt6577中的实现可参见u8836d公开的代码中的文件:
//“U8836D\mediatek\platform\mt6577\kernel\core\include\mach\mt6577_irq.c” 


//16个软件中断
#define NR_GIC_SGI              16
//16个处理器局部中断,在mt6577其实只使用了5个,从第27号开始
#define NR_GIC_PPI              16
//128个全局中断
#define MT6577_NR_SPI           (128)
#define NR_MT6577_IRQ_LINE      (NR_GIC_SGI + NR_GIC_PPI + MT6577_NR_SPI) 
//全局中断从第32号开始
#define GIC_PRIVATE_SIGNALS     32 
//处理器局部中断的起始号
#define GIC_PPI_OFFSET          (27)
//如下定义了5个处理器局部中断
#define GIC_PPI_GLOBAL_TIMER    (GIC_PPI_OFFSET + 0)
#define GIC_PPI_LEGACY_FIQ      (GIC_PPI_OFFSET + 1)
#define GIC_PPI_PRIVATE_TIMER   (GIC_PPI_OFFSET + 2)
#define GIC_PPI_WATCHDOG_TIMER  (GIC_PPI_OFFSET + 3)
#define GIC_PPI_LEGACY_IRQ      (GIC_PPI_OFFSET + 4)


然后从32号中断开始定义了104个全局中断
#define MT6577_L2CCINTR_IRQ_ID              (GIC_PRIVATE_SIGNALS + 0)
…
#define MT6577_USB0_IRQ_ID                  (GIC_PRIVATE_SIGNALS + 8)
#define MT6577_USB1_IRQ_ID                  (GIC_PRIVATE_SIGNALS + 9)
…
#define MT6577_EINT_IRQ_ID                  (GIC_PRIVATE_SIGNALS + 96)
…
#define MT6577_EINT_DIRECT7_IRQ_ID          (GIC_PRIVATE_SIGNALS + 104)


以上中断体系的实现是通过GIC的配置来完成,而GIC的配置在初始化过程中完成。GIC初始化包括DIST的初始化,和每颗CPU自己interface的初始化。DIST初始化由CPU0完成,然后CPU0再完成自己备份的interface初始化。在CPU1起来之后再完成CPU1的相关interface初始化。


CPU0的工作:


void __init mt_init_irq(void)
{   …
//DIST的初始化
mt_gic_dist_init();
//CPU0的interface初始化
    mt_gic_cpu_init();
}


static void mt_gic_dist_init(void)
{
    unsigned int i;
u32 cpumask = 1 << smp_processor_id();
    cpumask |= cpumask << 8;
    cpumask |= cpumask << 16;


    writel(0, GIC_DIST_BASE + GIC_DIST_CTRL);


    /*
     从32号开始, 设置SPI中断电平触发,N-N模式。GIC从GIC_DIST_CONFIG --0xC00开始是中断分发寄存器ICDICFR,每个SPI对应2位。
     */
    for (i = 32; i < (MT6577_NR_SPI + 32); i += 16) {
        writel(0, GIC_DIST_BASE + GIC_DIST_CONFIG + i * 4 / 16);
    }


    /*
      所有SPI分发给CPU0。这部代码只有CPU0才能执行到。GIC从GIC_DIST_TARGET --0x800开始是中断分发寄存器,长度根据支持的SPI不同而不同,每个中断对应8位,哪一位置1,该中断发到哪颗处理器。Cpumask每8位的最低位都置1,所以从32号中断开始,SPI都分发CPU0。
     */
    for (i = 32; i < (MT6577_NR_SPI + 32); i += 4) {
        writel(cpumask, GIC_DIST_BASE + GIC_DIST_TARGET + i * 4 / 4);
    }


    /*
GIC从GIC_DIST_PRI --0x400开始是中断优先级寄存器,长度根据支持的SPI不同而不同,每个中断对应8位,这里把所有SPI优先级都设置为相同优先级。
*/
    for (i = 32; i < NR_MT6577_IRQ_LINE; i += 4) {
        writel(0xA0A0A0A0, GIC_DIST_BASE + GIC_DIST_PRI + i * 4 / 4);
    }


    /*
    GIC从GIC_DIST_ENABLE_CLEAR --0x180开始是中断屏蔽寄存器ICDICER,长度根据支持的SPI不同而不同,每个中断对应1位,置1屏蔽该中断。
    */
    for (i = 32; i < NR_MT6577_IRQ_LINE; i += 32) {
        writel(0xFFFFFFFF, GIC_DIST_BASE + GIC_DIST_ENABLE_CLEAR + i * 4 / 32); 
    }
    /*
     把挂到linux中断描述数组里去,每个中断一个“struct irq_desc”,以前是个数组,现在可选成radix树。每个中断一个“struct irq_desc”,记录两个中断处理的关键数据结构“struct irq_chip”和 irq_flow_handler_t。前者用来对付中断控制器,在mt6577上是“struct irq_chip mt_irq_chip”,后者是中断处理程序,分成“void handle_level_irq(unsigned int irq, struct irq_desc *desc)”—用来对付电平触发,和“void
handle_edge_irq(unsigned int irq, struct irq_desc *desc)”—用来对付边沿触发。
     */
    for (i = GIC_PPI_OFFSET; i < NR_MT6577_IRQ_LINE; i++) {
        irq_set_chip_and_handler(i, &mt_irq_chip, handle_level_irq);
        set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
    }
#ifdef CONFIG_FIQ_DEBUGGER
    irq_set_chip_and_handler(FIQ_DBG_SGI, &mt_irq_chip, handle_level_irq);
    set_irq_flags(FIQ_DBG_SGI, IRQF_VALID | IRQF_PROBE);
#endif


    /*
     GIC从GIC_ICDISR --0x80开始是中断屏蔽寄存器ICDISR,长度根据支持的SPI不同而不同,每个中断对应1位,置0表示该中断是安全中断,置1表示该中断是非安全中断,这里全置1
     */
    for (i = 32; i < NR_IRQS; i += 32)
    {
        writel(0xFFFFFFFF, GIC_ICDISR + 4 * (i / 32));
    }


    /*
     ICDDCR位于0x,中断总开关,打开
     */
    writel(3, GIC_DIST_BASE + GIC_DIST_CTRL);
}


//该函数在每颗CPU被激活时得到执行
static void mt_gic_cpu_init(void)
{
    int i;


    /*
     关闭PPI,打开SGI。PPI需要用到时调用“void mt_enable_ppi(int irq)”打开,在u8836d系统里只有local timer是PPI中断在其初始化时将自己对应使能位打开,SGI必须全打开,SGI用来做处理器间中断的基础。
     */
    writel(0xffff0000, GIC_DIST_BASE + GIC_DIST_ENABLE_CLEAR);
    writel(0x0000ffff, GIC_DIST_BASE + GIC_DIST_ENABLE_SET);


    /* 设置PPI SGI中断优先级为0x80*/
    for (i = 0; i < 32; i += 4)
        writel(0x80808080, GIC_DIST_BASE + GIC_DIST_PRI + i * 4 / 4);


    /*设置PPI SGI中断优先为非secure中断*/
    writel(0xFFFFFFFF, GIC_ICDISR);
   
/*操作自己的CPU INTERFACE的ICCPMR寄存器,只有优先级高于0xF0的中断才会送入本处理器*/
    writel(0xF0, GIC_CPU_BASE + GIC_CPU_PRIMASK);


/*操作自己的CPU INTERFACE的ICCICR寄存器,做如下设置:
允许向本处理器送secure中断
允许向本处理器送非secure中断
把secure中断送到本处理器的FIQ中断线
中断抢占通过secure binary point register判断
一个ICCIAR的secure读,导致非secure最高优先级pending中断的ack
/


    writel(0x1F, GIC_CPU_BASE + GIC_CPU_CTRL);


    dsb();
}




值得注意的是mt6577全局中断的实现,又分为两种。
对于集成在SOC里的外设,直接对应一个全局中断,如“MT6577_USB1_IRQ_ID”,在其驱动初始时直接将其中断处理函数注册到内核的中断处理里数组中:“request_irq(nIrq, musbfsh->isr, IRQF_TRIGGER_LOW, dev_name(dev), musbfsh)”
而对于位于SCO之外的外设,则通过MT6577_EINT_IRQ_ID 进行转发:
Mt6577在内核里准备了一个外设中断处理函数的数组:
typedef struct 
{
    void (*eint_func[EINT_MAX_CHANNEL])(void);
    unsigned int eint_auto_umask[EINT_MAX_CHANNEL];
} eint_func;


这些外设通过“void mt65xx_eint_registration(…)”注册自己的中断函数。
比如触屏控制器gt813,“mediatek\custom\out\huaqin77_cu_ics2\kernel\touchpanel\ Gt813_driver.c”通过该函数注册自己的中断处理函数:  
mt65xx_eint_registration(…, tpd_eint_interrupt_handler, 1); 


当这些SOC外外设中断发生以后,mt6577将在GIC的MT6577_EINT_IRQ_ID上产生中断,从而触发其中断处理函数“static irqreturn_t mt65xx_eint_isr(int irq, void *dev_id)”。在该函数里将检查“eint_func”数组,进一步触发对应的的处理函数。
zynq中interrupts的学习笔记(一) 本学习笔记参考UG585-Zynq-7000-TRM.pdf ch.7:Interrupts。文中有说的不够严谨或者是有错误的地方,欢迎指正! zynq中的interrupts有很多种,大体上分为三类:private、shared、software interrupts。     1.zynq 7000 有两个Cortex-A9 processor,每个cpu 都有一系列的pr... 阅读详情

相关推荐

【GIC400】——PLIC,NVIC 和 GIC 中断对比

是中断向量表,当指定的中断发生以后就会调用对应的中断复位函数,比如复位中断发生以后就会执行第 1 行代码,也就是调用函数 Reset_Handler,函数 Reset_Handler 就是复位中断的中断复位函数,其它的中断同理。就是第一条中断向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数 Reset_Handler 的入口地址,依次类推,最后一个中断服务函数的入口地址,这样 STM32F407 的中断向量表就建好了。跟 NVIC 一样,GIC 也有中断向量表,中断向量表也是在代码的最前面。

tyustli 1058

GIC V2 简介

简单的介绍GIC v2

杀手的博客 1340

vivado运行时报错 license文件更新操作

vivado使用:SYNTHESIS->Run Synthesis 时报错 [Common 17-345] A valid license was not found for feature ‘Synthesis’ and/or device ‘xc7vx485t’. Please run the Vivado License Manager for assistance in determiningwhich features and devices are licensed for your sy

qq_44692266的博客 2万+

【ZYNQ】中断机制介绍(一)

中断机制介绍(一)

阿妹有点甜的博客 3518

硬件压力测试工具使用方法

B, --bind host# 绑定到主机的多个地址中的一个。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口(或默认为客户端连接到服务器端的端口),反向连接至客户端。-c, --client host#如果Iperf运行在服务器模式,并且用-c参数指定一个主机,那么Iperf将只接受指定主机的连接。-C, --compatibility# 与低版本的Iperf使用时,可以使用兼容模式。-b, --bandwidth #[KM] UDP模式使用的带宽,单位bits/sec。

weixin_53303772的博客 8221

ZYNQ平台上基于SGMII接口的IEEE1588/PTP协议高效实现方案

本文深入探讨了在Xilinx ZYNQ平台上,利用SGMII接口实现高精度IEEE1588/PTP协议的方案。通过将硬件时间戳单元集成在PL端的AXI以太网子系统IP核中,该方案绕过了软件协议栈和外部PHY的延迟,实现了亚微秒级的时间同步精度。文章详细解析了硬件设计、Vivado IP配置、Linux驱动移植及PTP协议栈部署等关键步骤,为工业控制、通信等领域的高精度网络同步提供了高效、灵活的解决路径。

q5r6s7的博客 606

ARM GIC 和NVIC的区别

ARM GIC(Generic Interrupt Controller)和NVIC(Nested Vectored Interrupt Controller)是两种不同的中断控制器,它们在ARM架构中扮演着重要的角色,但各自有不同的设计和应用场景。GIC和NVIC的主要区别在于它们的设计目的、应用场景和支持的系统规模。GIC适用于需要处理大量中断和多核处理器的复杂系统,而NVIC则适用于中断源较少、对中断处理要求不是特别高的单核或简单多核微控制器系统。

ygyglg的专栏 1826

从三个角度理解知识图谱

2012年谷歌首次提出“知识图谱”这个词,由此知识图谱在工业界也出现得越来越多,对于知识图谱以及相关概念的理解确实也是比较绕。自己在研究大数据独角兽Palantir之后开始接触知识图谱,也算对其有了一定了解,这里从三个角度总结一下怎么去理解知识图谱。 几个基本概念:本体、实体、知识库、知识图谱 1、本体是概念的集合,是大家都公认的概念框架,一般不会改变如“人”、“事”、“物”、 “地”、“组...

JavaChaoCo的博客 6902

ARM的M型和A型的中断控制器小结

例如,NVIC支持SysTick定时器中断、PendSV中断和SVCall中断等特殊中断类型,而GIC支持虚拟中断、SGI(Software Generated Interrupt)和PPI(Private Peripheral Interrupt)等特殊中断类型。2. 中断处理模式不同:NVIC支持嵌套中断处理模式,即一个中断处理程序可以被另一个中断处理程序打断,而GIC支持抢占式中断处理模式,即一个中断处理程序可以被另一个中断处理程序抢占。

m0_63596766的博客 788

电信天翼云OS(ctyunos)内网离线安装Docker-CE保姆级避坑指南(附完整依赖包清单)

本文提供电信天翼云OS(ctyunos)内网环境下Docker-CE的离线安装全攻略,涵盖依赖分析、离线包制备、冲突解决等关键步骤。针对金融、政务等隔离网络场景,详细解析如何通过本地仓库构建和优化配置,实现高效安全的容器化部署,助力企业快速搭建内网Docker环境。

399

Ubuntu+Dify实战:如何让大模型知识库完美支持图片召回(附避坑指南)

本文详细介绍了在Ubuntu系统上部署Dify平台,并实现大模型知识库图片召回功能的完整实战方案。通过解析Dify处理图片的底层逻辑,重点讲解了配置Nginx代理服务器将本地图片路径转换为可公开访问URL的核心工程步骤,并提供了文档预处理、环境变量配置以及父子分段策略等高级技巧,帮助开发者构建图文并茂的AI应用,有效提升知识库的丰富性和用户体验。

c7d8e的博客 447

ARM NVIC GIC

STM32 1. 中断向量表 2. NVIC(内嵌向量中断控制器) 3. 中断使能 4. 中断服务函数 1、中断向量表 中断向量表是一个表,这个表里面存放的是中断向量。中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的,当某个中断被触发以后就会自动跳转到中断向量表中对应的中断服务程序(函数)入口地址处。中断向量表在整个程序的最前面,比如 STM32F103 的中断向量表如下所示:

Hola_ya的博客 2845

文末含资料链接和视频讲解!YOLOv8+RepVGG+QueryDet小目标检测终极指南:从理论到实战,突破遥感图像检测难题

QueryDet(Query Detection)机制代表了目标检测领域的一个重要范式转变。传统的目标检测方法基于anchor或anchor-free的密集预测,需要为图像中的每个可能位置生成预测。而QueryDet采用了稀疏查询的方式,通过少量的可学习查询向量来直接预测目标。 这种设计灵感来源于Transformer架构中的注意力机制。在自然语言处理中,Transformer通过query-key-value机制实现了高效的序列建模。QueryDet将这一思想引入到目标检测中,将检测问题转化为查询匹配问

FJN110的博客 387

正点原子嵌入式linux驱动开发——Linux中断

正点原子linux驱动开发的学习笔记,这一篇重点讲解了Linux的中断操作

xhj12138的博客 1017

Spring Boot集成ShardingSphere实现数据加密及数据脱敏 | Spring Cloud 48

利用ShardingSphere实现: - 数据加密 - 数据脱敏

gmHappy 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【STM32】中断软件分支处理( NVIC 和 GIC)

本文对比分析了ARM架构中两种中断处理机制:NVIC(用于Cortex-M)和GIC(用于Cortex-A)。NVIC采用硬件向量分支,通过固定中断向量表自动跳转;而GIC通过软件分支处理,由操作系统统一入口分发中断。文章详细介绍了二者的架构特点、工作流程及在嵌入式系统中的应用差异,帮助读者深入理解ARM中断系统的底层机制。

猫猫的小茶馆 983

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ARM中断 - ARM内核(五)

中断指令是在编程内部非常重要的一个内容,其可以实现的

生活需要深度 3568

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ARM:NVIC & VIC & GIC & SCB

ARM体系结构支持以下操作模式: 用户 模式 : 在执行完CPU启动代码文件Startup.s后正常的程序执行状态。 系统 模式 : 运行一些操作系统核。 IRQ (中断) 模式 : 通用的中断处理模式。 FIQ (快速中断) 模式 : 快速中断,处理一些特殊的中断源。 管理 模式 : 进入保护状态的执行;通常在复位或使用SWI指令时进入此模式。 ...

鱼藏剑 4511

GIC

GIC(Generic Interrupt Controller) is a centralized resource that supports and manages interrupts in a system /*通用中断控制器是系统中支持和管理中断的核心资源*/ GIC provides: /*GIC 提供如下功能:*/ 1、Registers for managing interru...

wenfei11471的博客 1627

devicetree arm,cortex-a9-gic

"#interrupt-cells": const: 3 description: | The 1st cell is the interrupt type; 0 for SPI interrupts, 1 for PPI interrupts. The 2nd cell contains the interrupt number for the interrupt type. SPI interrupts are in the range

HongDaYu的搬砖之路 415

linux IRQ Management(四)- IRQ Domain

了解IRQ Domain 1.概述   Linux kernel使用如下两个ID来标识一个来自外设的中断: IRQ number,CPU需要为每一个外设中断编号,即IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。 HW interrupt ID,对于interrupt controller而言,它收集了...

weixin_41028621的博客 6238

zynq中断学习记录

触 发可屏蔽中断的事件源不是每次都是重要的。除了irq# 61到#68和#84到#91之外,所有的中断灵敏度类型都是由请求源固定的,不能更改。2、私有中断(private peripheral interrupt ,PPI)(CPU0、CPU1各有5个),包括全局定时器、专用看门狗定时器(AWDT)、专用(私有)定时器和来自 PL 的 FIQ/IRQ。对于软中断来说:所有的 SGI 都是边缘触发的,且其敏感性类型是固定的,不能修改。对于共享中断来说:对于电平触发的中断而言,接收中断以后需要清除。

weixin_60010850的博客 640

主线剧情01-ARM-IMX6ULL基础学习记录

ARM 寄存器、汇编、i.mx6ull 的启动流程、异常与 GIC、ARM SoC 启动文件示例。加深对处理器运行方式的理解。

空有精品无人问,倒也自然 1226

ARM Cortex-A学习(1):GIC(通用中断控制器)详解

GIC(通用中断控制器,)是一种用于处理中断的硬件组件,它的主要功能是协调和管理系统中的中断请求,确保它们被正确地传递给相应的处理器核心。

主要分享嵌入式软件、人工智能部分知识 4048

【转】ARM GIC中断系列(二):gicv2架构基础

以上就是GICv2的介绍,更多的内容,需要查看gicv2的文档。gicv2比较简单,最多只能支持8个core,超过了8个core,那么就不能使用gicv2了。不过这也不是大问题,对于手机的arm处理器来说,最多也就8个core。但是对于服务器,桌面级的arm处理器,那么就可能会超过8个core,此时gicv2就不适用了,所以ARM后面又加入GICv3,v4架构。GICv2的寄存器,都是通过memory-mapped的方式访问。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1657

中断控制器介绍及初始化源代码分析(二)

1.GIC中断控制器介绍 ARM处理器中最常用的中断控制器是GIC(Global Interrupt Controller)。GIC支持3中中断类型。 (1)SGI(Software Generated Interrupt):软件产生的中断,通常用于多核之间的通信。一个CPU可通过写GIC的寄存器给另外一个CPU产生中断(IPI_WAKEUP、IPI_TIMER等)。SGI中断通常在Linux内核里被称为IPI中断(interprocess interrupts)。 (2)PPI(Private Perip

非专业业余程序员 3118
上一篇: 卷二 Dalvik与Android源码分析 第二章 进程与线程 2.2 Dalvik线程创建机制 图书版试读--请勿转发
下一篇: 卷一 内核源代码分析 第二章 异常 2.2.3 Exynos4的中断体系 图书试读版-请勿转载
crosskernel
博客等级 码龄18年 14粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值