編譯開(kāi)關(guān)
系列篇編譯平臺(tái)為hi3516dv300,整個(gè)工程可前往查看. 預(yù)編譯處理過(guò)程會(huì)自動(dòng)生成編譯開(kāi)關(guān)menuconfig.h,供編譯階段選擇編譯,可前往查看.
//.... #define LOSCFG_ARCH_ARM_VER "armv7-a" #define LOSCFG_ARCH_CPU "cortex-a7" #define LOSCFG_PLATFORM "hi3516dv300" #define LOSCFG_PLATFORM_BSP_GIC_V2 1 #define LOSCFG_PLATFORM_ROOTFS 1 #define LOSCFG_KERNEL_CPPSUPPORT 1 #define LOSCFG_HW_RANDOM_ENABLE 1 #define LOSCFG_ARCH_CORTEX_A7 1 #define LOSCFG_DRIVERS_HDF_PLATFORM_RTC 1 #define LOSCFG_DRIVERS_HDF_PLATFORM_UART 1
中斷初始化
hi3516dv300中斷控制器選擇了LOSCFG_PLATFORM_BSP_GIC_V2,對(duì)應(yīng)代碼為gic_v2.cGIC(Generic Interrupt Controller)是ARM公司提供的一個(gè)通用的中斷控制器. 看這種代碼因?yàn)樯婕坝布糠?需要對(duì)照ARM中斷控制器 gic_v2.pdf文檔看.可前往地址下載查看.
//硬件中斷初始化
VOID HalIrqInit(VOID)
{
UINT32 i;
/* set externel interrupts to be level triggered, active low. */ //將外部中斷設(shè)置為電平觸發(fā),低電平激活
for (i = 32; i < OS_HWI_MAX_NUM; i += 16) {
GIC_REG_32(GICD_ICFGR(i / 16)) = 0;
}
/* set externel interrupts to CPU 0 */ //將外部中斷設(shè)置為CPU 0
for (i = 32; i < OS_HWI_MAX_NUM; i += 4) {
GIC_REG_32(GICD_ITARGETSR(i / 4)) = 0x01010101;
}
/* set priority on all interrupts */ //設(shè)置所有中斷的優(yōu)先級(jí)
for (i = 0; i < OS_HWI_MAX_NUM; i += 4) {
GIC_REG_32(GICD_IPRIORITYR(i / 4)) = GICD_INT_DEF_PRI_X4;
}
/* disable all interrupts. */ //禁用所有中斷。
for (i = 0; i < OS_HWI_MAX_NUM; i += 32) {
GIC_REG_32(GICD_ICENABLER(i / 32)) = ~0;
}
HalIrqInitPercpu();//初始化當(dāng)前CPU中斷信息
/* enable gic distributor control */
GIC_REG_32(GICD_CTLR) = 1; //使能分發(fā)中斷寄存器,該寄存器作用是允許給CPU發(fā)送中斷信號(hào)
#if (LOSCFG_KERNEL_SMP == YES)
/* register inter-processor interrupt *///注冊(cè)核間中斷,啥意思?就是CPU各核直接可以發(fā)送中斷信號(hào)
//處理器間中斷允許一個(gè)CPU向系統(tǒng)其他的CPU發(fā)送中斷信號(hào),處理器間中斷(IPI)不是通過(guò)IRQ線傳輸?shù)模亲鳛樾盘?hào)直接放在連接所有CPU本地APIC的總線上。
LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);//注冊(cè)喚醒CPU的中斷處理函數(shù)
LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);//注冊(cè)調(diào)度CPU的中斷處理函數(shù)
LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);//注冊(cè)停止CPU的中斷處理函數(shù)
#endif
}
//給每個(gè)CPU core初始化硬件中斷
VOID HalIrqInitPercpu(VOID)
{
/* unmask interrupts */ //取消中斷屏蔽
GIC_REG_32(GICC_PMR) = 0xFF;
/* enable gic cpu interface */ //啟用gic cpu接口
GIC_REG_32(GICC_CTLR) = 1;
}
解讀
上來(lái)四個(gè)循環(huán),是對(duì)中斷控制器寄存器組的初始化,也就是驅(qū)動(dòng)程序,驅(qū)動(dòng)程序是配置硬件寄存器的過(guò)程.寄存器分通用和專用寄存器.下圖為 gic_v2 的寄存器功能 ,這里對(duì)照代碼和datasheet重點(diǎn)說(shuō)下中斷配置寄存器(GICD_ICFGRn)

以下是GICD_ICFGRn的介紹
The GICD_ICFGRs provide a 2-bit Int_config field for each interrupt supported by the GIC. This field identifies whether the corresponding interrupt is edge-triggered or level-sensitive
GICD_ICFGRs為GIC支持的每個(gè)中斷提供一個(gè)2位配置字段。此字段標(biāo)識(shí)相應(yīng)的中斷是邊緣觸發(fā)的還是電平觸發(fā)的
0xC00 - 0xCFC GICD_ICFGRn RW IMPLEMENTATION DEFINED Interrupt Configuration Registers #define GICD_ICFGR(n) (GICD_OFFSET + 0xc00 + (n) * 4) /* Interrupt Configuration Registers */ //中斷配置寄存器
如此一個(gè)32位寄存器可以記錄16個(gè)中斷的信息,這也是代碼中出現(xiàn)GIC_REG_32(GICD_ICFGR(i / 16))的原因.
GIC-v2支持三種類型的中斷
PPI:私有外設(shè)中斷(Private Peripheral Interrupt),是每個(gè)CPU私有的中斷。最多支持16個(gè)PPI中斷,硬件中斷號(hào)從ID16~ID31。PPI通常會(huì)送達(dá)到指定的CPU上,應(yīng)用場(chǎng)景有CPU本地時(shí)鐘。
SPI:公用外設(shè)中斷(Shared Peripheral Interrupt),最多可以支持988個(gè)外設(shè)中斷,硬件中斷號(hào)從ID32~ID1019。
SGI:軟件觸發(fā)中斷(Software Generated Interrupt)通常用于多核間通訊,最多支持16個(gè)SGI中斷,硬件中斷號(hào)從ID0~ID15。SGI通常在內(nèi)核中被用作 IPI 中斷(inter-processor interrupts),并會(huì)送達(dá)到系統(tǒng)指定的CPU上,函數(shù)的最后就注冊(cè)了三個(gè)核間中斷的函數(shù).
typedef enum {//核間中斷
LOS_MP_IPI_WAKEUP, //喚醒CPU
LOS_MP_IPI_SCHEDULE,//調(diào)度CPU
LOS_MP_IPI_HALT, //停止CPU
} MP_IPI_TYPE;
中斷相關(guān)的結(jié)構(gòu)體
size_t g_intCount[LOSCFG_KERNEL_CORE_NUM] = {0};//記錄每個(gè)CPUcore的中斷數(shù)量
HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM];//中斷注冊(cè)表 @note_why 用 form 來(lái)表示?有種寫 HTML的感覺(jué) :P
STATIC CHAR *g_hwiFormName[OS_HWI_MAX_NUM] = {0};//記錄每個(gè)硬中斷的名稱
STATIC UINT32 g_hwiFormCnt[OS_HWI_MAX_NUM] = {0};//記錄每個(gè)硬中斷的總數(shù)量
STATIC UINT32 g_curIrqNum = 0; //記錄當(dāng)前中斷號(hào)
typedef VOID (*HWI_PROC_FUNC)(VOID); //中斷函數(shù)指針
typedef struct tagHwiHandleForm {
HWI_PROC_FUNC pfnHook; //中斷處理函數(shù)
HWI_ARG_T uwParam; //中斷處理函數(shù)參數(shù)
struct tagHwiHandleForm *pstNext; //節(jié)點(diǎn),指向下一個(gè)中斷,用于共享中斷的情況
} HwiHandleForm;
typedef struct tagIrqParam { //中斷參數(shù)
int swIrq; // 軟件中斷
VOID *pDevId; // 設(shè)備ID
const CHAR *pName; //名稱
} HwiIrqParam;
注冊(cè)硬中斷
/******************************************************************************
創(chuàng)建一個(gè)硬中斷
中斷創(chuàng)建,注冊(cè)中斷號(hào)、中斷觸發(fā)模式、中斷優(yōu)先級(jí)、中斷處理程序。中斷被觸發(fā)時(shí),
handleIrq會(huì)調(diào)用該中斷處理程序
******************************************************************************/
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum, //硬中斷句柄編號(hào) 默認(rèn)范圍[0-127]
HWI_PRIOR_T hwiPrio, //硬中斷優(yōu)先級(jí)
HWI_MODE_T hwiMode, //硬中斷模式 共享和非共享
HWI_PROC_FUNC hwiHandler,//硬中斷處理函數(shù)
HwiIrqParam *irqParam) //硬中斷處理函數(shù)參數(shù)
{
UINT32 ret;
(VOID)hwiPrio;
if (hwiHandler == NULL) {//中斷處理函數(shù)不能為NULL
return OS_ERRNO_HWI_PROC_FUNC_NULL;
}
if ((hwiNum > OS_USER_HWI_MAX) || ((INT32)hwiNum < OS_USER_HWI_MIN)) {//中斷數(shù)區(qū)間限制 [32,96]
return OS_ERRNO_HWI_NUM_INVALID;
}
#ifdef LOSCFG_NO_SHARED_IRQ //不支持共享中斷
ret = OsHwiCreateNoShared(hwiNum, hwiMode, hwiHandler, irqParam);
#else
ret = OsHwiCreateShared(hwiNum, hwiMode, hwiHandler, irqParam);
#endif
return ret;
}
//創(chuàng)建一個(gè)共享硬件中斷,共享中斷就是一個(gè)中斷能觸發(fā)多個(gè)響應(yīng)函數(shù)
STATIC UINT32 OsHwiCreateShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode,
HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
{
UINT32 intSave;
HwiHandleForm *hwiFormNode = NULL;
HwiHandleForm *hwiForm = NULL;
HwiIrqParam *hwiParam = NULL;
HWI_MODE_T modeResult = hwiMode & IRQF_SHARED;
if (modeResult && ((irqParam == NULL) || (irqParam->pDevId == NULL))) {
return OS_ERRNO_HWI_SHARED_ERROR;
}
HWI_LOCK(intSave);//中斷自旋鎖
hwiForm = &g_hwiForm[hwiNum];//獲取中斷處理項(xiàng)
if ((hwiForm->pstNext != NULL) && ((modeResult == 0) || (!(hwiForm->uwParam & IRQF_SHARED)))) {
HWI_UNLOCK(intSave);
return OS_ERRNO_HWI_SHARED_ERROR;
}
while (hwiForm->pstNext != NULL) {//pstNext指向 共享中斷的各處理函數(shù)節(jié)點(diǎn),此處一直擼到最后一個(gè)
hwiForm = hwiForm->pstNext;//找下一個(gè)中斷
hwiParam = (HwiIrqParam *)(hwiForm->uwParam);//獲取中斷參數(shù),用于檢測(cè)該設(shè)備ID是否已經(jīng)有中斷處理函數(shù)
if (hwiParam->pDevId == irqParam->pDevId) {//設(shè)備ID一致時(shí),說(shuō)明設(shè)備對(duì)應(yīng)的中斷處理函數(shù)已經(jīng)存在了.
HWI_UNLOCK(intSave);
return OS_ERRNO_HWI_ALREADY_CREATED;
}
}
hwiFormNode = (HwiHandleForm *)LOS_MemAlloc(m_aucSysMem0, sizeof(HwiHandleForm));//創(chuàng)建一個(gè)中斷處理節(jié)點(diǎn)
if (hwiFormNode == NULL) {
HWI_UNLOCK(intSave);
return OS_ERRNO_HWI_NO_MEMORY;
}
hwiFormNode->uwParam = OsHwiCpIrqParam(irqParam);//獲取中斷處理函數(shù)的參數(shù)
if (hwiFormNode->uwParam == LOS_NOK) {
HWI_UNLOCK(intSave);
(VOID)LOS_MemFree(m_aucSysMem0, hwiFormNode);
return OS_ERRNO_HWI_NO_MEMORY;
}
hwiFormNode->pfnHook = hwiHandler;//綁定中斷處理函數(shù)
hwiFormNode->pstNext = (struct tagHwiHandleForm *)NULL;//指定下一個(gè)中斷為NULL,用于后續(xù)遍歷找到最后一個(gè)中斷項(xiàng)(見(jiàn)于以上 while (hwiForm->pstNext != NULL)處)
hwiForm->pstNext = hwiFormNode;//共享中斷
if ((irqParam != NULL) && (irqParam->pName != NULL)) {
g_hwiFormName[hwiNum] = (CHAR *)irqParam->pName;
}
g_hwiForm[hwiNum].uwParam = modeResult;
HWI_UNLOCK(intSave);
return LOS_OK;
}
解讀
內(nèi)核將硬中斷進(jìn)行編號(hào),如:
#define NUM_HAL_INTERRUPT_TIMER0 33 #define NUM_HAL_INTERRUPT_TIMER1 33 #define NUM_HAL_INTERRUPT_TIMER2 34 #define NUM_HAL_INTERRUPT_TIMER3 34 #define NUM_HAL_INTERRUPT_TIMER4 35 #define NUM_HAL_INTERRUPT_TIMER5 35 #define NUM_HAL_INTERRUPT_TIMER6 36 #define NUM_HAL_INTERRUPT_TIMER7 36 #define NUM_HAL_INTERRUPT_DMAC 60 #define NUM_HAL_INTERRUPT_UART0 38 #define NUM_HAL_INTERRUPT_UART1 39 #define NUM_HAL_INTERRUPT_UART2 40 #define NUM_HAL_INTERRUPT_UART3 41 #define NUM_HAL_INTERRUPT_UART4 42 #define NUM_HAL_INTERRUPT_TIMER NUM_HAL_INTERRUPT_TIMER4例如:時(shí)鐘節(jié)拍處理函數(shù)OsTickHandler就是在HalClockInit中注冊(cè)的
//硬時(shí)鐘初始化
VOID HalClockInit(VOID)
{
// ...
(void)LOS_HwiCreate(NUM_HAL_INTERRUPT_TIMER, 0xa0, 0, OsTickHandler, 0);//注冊(cè)O(shè)sTickHandler到中斷向量表
}
//節(jié)拍中斷處理函數(shù) ,鴻蒙默認(rèn)10ms觸發(fā)一次
LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
{
UINT32 intSave;
TICK_LOCK(intSave);//tick自旋鎖
g_tickCount[ArchCurrCpuid()]++;// 累加當(dāng)前CPU核tick數(shù)
TICK_UNLOCK(intSave);
OsTimesliceCheck();//時(shí)間片檢查
OsTaskScan(); /* task timeout scan *///掃描超時(shí)任務(wù) 例如:delay(300)
#if (LOSCFG_BASE_CORE_SWTMR == YES)
OsSwtmrScan();//掃描定時(shí)器,查看是否有超時(shí)定時(shí)器,加入隊(duì)列
#endif
}
鴻蒙是支持中斷共享的,在OsHwiCreateShared中,將函數(shù)注冊(cè)到g_hwiForm中.中斷向量完成注冊(cè)后,就是如何觸發(fā)和回調(diào)的問(wèn)題.觸發(fā)在鴻蒙內(nèi)核源碼分析(總目錄)中斷切換篇中已經(jīng)講清楚,觸發(fā)是從底層匯編向上調(diào)用,調(diào)用的C函數(shù)就是HalIrqHandler
中斷怎么觸發(fā)的?
分兩種情況:
通過(guò)硬件觸發(fā),比如按鍵,USB的插拔這些中斷源向中斷控制器發(fā)送電信號(hào)(高低電平觸發(fā)或是上升/下降沿觸發(fā)),中斷控制器經(jīng)過(guò)過(guò)濾后將信號(hào)發(fā)給對(duì)應(yīng)的CPU處理,通過(guò)硬件改變PC和CPSR寄存值,直接跳轉(zhuǎn)到中斷向量(固定地址)執(zhí)行.
b reset_vector @開(kāi)機(jī)代碼 b _osExceptUndefInstrHdl @異常處理之CPU碰到不認(rèn)識(shí)的指令 b _osExceptSwiHdl @異常處理之:軟中斷 b _osExceptPrefetchAbortHdl @異常處理之:取指異常 b _osExceptDataAbortHdl @異常處理之:數(shù)據(jù)異常 b _osExceptAddrAbortHdl @異常處理之:地址異常 b OsIrqHandler @異常處理之:硬中斷 b _osExceptFiqHdl @異常處理之:快中斷
通過(guò)軟件觸發(fā),常見(jiàn)于核間中斷的情況, 核間中斷指的是幾個(gè)CPU之間相互通訊的過(guò)程.以下為某一個(gè)CPU向其他CPU(可以是多個(gè))發(fā)起讓這些CPU重新調(diào)度LOS_MpSchedule的中斷請(qǐng)求信號(hào).最終是寫了中斷控制器的GICD_SGIR寄存器,這是一個(gè)由軟件觸發(fā)中斷的寄存器.中斷控制器會(huì)將請(qǐng)求分發(fā)給對(duì)應(yīng)的CPU處理中斷,即觸發(fā)了OsIrqHandler.
//給參數(shù)CPU發(fā)送調(diào)度信號(hào)
VOID LOS_MpSchedule(UINT32 target)//target每位對(duì)應(yīng)CPU core
{
UINT32 cpuid = ArchCurrCpuid();
target &= ~(1U << cpuid);//獲取除了自身之外的其他CPU
HalIrqSendIpi(target, LOS_MP_IPI_SCHEDULE);//向目標(biāo)CPU發(fā)送調(diào)度信號(hào),核間中斷(Inter-Processor Interrupts),IPI
}
//SGI軟件觸發(fā)中斷(Software Generated Interrupt)通常用于多核間通訊
STATIC VOID GicWriteSgi(UINT32 vector, UINT32 cpuMask, UINT32 filter)
{
UINT32 val = ((filter & 0x3) << 24) | ((cpuMask & 0xFF) << 16) |
(vector & 0xF);
GIC_REG_32(GICD_SGIR) = val;//寫SGI寄存器
}
//向指定核發(fā)送核間中斷
VOID HalIrqSendIpi(UINT32 target, UINT32 ipi)
{
GicWriteSgi(ipi, target, 0);
}
中斷統(tǒng)一處理入口函數(shù) HalIrqHandler
//硬中斷統(tǒng)一處理函數(shù),這里由硬件觸發(fā),調(diào)用見(jiàn)于 ..\arch\arm\arm\src\los_dispatch.S
VOID HalIrqHandler(VOID)
{
UINT32 iar = GIC_REG_32(GICC_IAR);//從中斷確認(rèn)寄存器獲取中斷ID號(hào)
UINT32 vector = iar & 0x3FFU;//計(jì)算中斷向量號(hào)
/*
* invalid irq number, mainly the spurious interrupts 0x3ff,
* gicv2 valid irq ranges from 0~1019, we use OS_HWI_MAX_NUM
* to do the checking.
*/
if (vector >= OS_HWI_MAX_NUM) {
return;
}
g_curIrqNum = vector;//記錄當(dāng)前中斷ID號(hào)
OsInterrupt(vector);//調(diào)用上層中斷處理函數(shù)
/* use orignal iar to do the EOI */
GIC_REG_32(GICC_EOIR) = iar;//更新中斷結(jié)束寄存器
}
VOID OsInterrupt(UINT32 intNum)//中斷實(shí)際處理函數(shù)
{
HwiHandleForm *hwiForm = NULL;
UINT32 *intCnt = NULL;
intCnt = &g_intCount[ArchCurrCpuid()];//當(dāng)前CPU的中斷總數(shù)量 ++
*intCnt = *intCnt + 1;//@note_why 這里沒(méi)看明白為什么要 +1
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //開(kāi)啟查詢系統(tǒng)CPU的占用率的中斷
OsCpupIrqStart();//記錄本次中斷處理開(kāi)始時(shí)間
#endif
#ifdef LOSCFG_KERNEL_TICKLESS
OsTicklessUpdate(intNum);
#endif
hwiForm = (&g_hwiForm[intNum]);//獲取對(duì)應(yīng)中斷的實(shí)體
#ifndef LOSCFG_NO_SHARED_IRQ //如果沒(méi)有定義不共享中斷 ,意思就是如果是共享中斷
while (hwiForm->pstNext != NULL) { //一直擼到最后
hwiForm = hwiForm->pstNext;//下一個(gè)繼續(xù)擼
#endif
if (hwiForm->uwParam) {//有參數(shù)的情況
HWI_PROC_FUNC2 func = (HWI_PROC_FUNC2)hwiForm->pfnHook;//獲取回調(diào)函數(shù)
if (func != NULL) {
UINTPTR *param = (UINTPTR *)(hwiForm->uwParam);
func((INT32)(*param), (VOID *)(*(param + 1)));//運(yùn)行帶參數(shù)的回調(diào)函數(shù)
}
} else {//木有參數(shù)的情況
HWI_PROC_FUNC0 func = (HWI_PROC_FUNC0)hwiForm->pfnHook;//獲取回調(diào)函數(shù)
if (func != NULL) {
func();//運(yùn)行回調(diào)函數(shù)
}
}
#ifndef LOSCFG_NO_SHARED_IRQ
}
#endif
++g_hwiFormCnt[intNum];//中斷號(hào)計(jì)數(shù)器總數(shù)累加
*intCnt = *intCnt - 1; //@note_why 這里沒(méi)看明白為什么要 -1
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //開(kāi)啟查詢系統(tǒng)CPU的占用率的中斷
OsCpupIrqEnd(intNum);//記錄中斷處理時(shí)間完成時(shí)間
#endif
}
解讀統(tǒng)一中斷處理函數(shù)是一個(gè)通過(guò)一個(gè)中斷號(hào)去找到注冊(cè)函數(shù)的過(guò)程,分四步走:
第一步:取號(hào),這號(hào)是由中斷控制器的GICC_IAR寄存器提供的,這是一個(gè)專門保存當(dāng)前中斷號(hào)的寄存器.
第二步:從注冊(cè)表g_hwiForm中查詢注冊(cè)函數(shù),同時(shí)取出參數(shù).
第三步:執(zhí)行函數(shù),也就是回調(diào)注冊(cè)函數(shù),分有參和無(wú)參兩種情況func(...),在中斷共享的情況下,注冊(cè)函數(shù)會(huì)指向下一個(gè)注冊(cè)函數(shù)pstNext,依次執(zhí)行回調(diào)函數(shù),這是中斷共享的實(shí)現(xiàn)細(xì)節(jié).
typedef struct tagHwiHandleForm {
HWI_PROC_FUNC pfnHook; //中斷處理函數(shù)
HWI_ARG_T uwParam; //中斷處理函數(shù)參數(shù)
struct tagHwiHandleForm *pstNext; //節(jié)點(diǎn),指向下一個(gè)中斷,用于共享中斷的情況
} HwiHandleForm;
第四步:銷號(hào),本次中斷完成了就需要消除記錄,中斷控制器也有專門的銷號(hào)寄存器GICC_EOIR
另外的是一些統(tǒng)一數(shù)據(jù),每次中斷號(hào)處理內(nèi)核都會(huì)記錄次數(shù),和耗時(shí),以便定位/跟蹤/診斷問(wèn)題.
編輯:hfy
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129968 -
中斷控制器
+關(guān)注
關(guān)注
0文章
63瀏覽量
9819 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2642瀏覽量
69832
發(fā)布評(píng)論請(qǐng)先 登錄
【HarmonyOS】鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇)
鴻蒙內(nèi)核源碼分析:用通俗易懂的語(yǔ)言告訴你鴻蒙內(nèi)核發(fā)生了什么?
鴻蒙內(nèi)核源碼分析(源碼注釋篇):給HarmonyOS源碼逐行加上中文注釋
鴻蒙內(nèi)核源碼分析:給HarmonyOS源碼逐行加上中文注釋
鴻蒙內(nèi)核源碼分析(內(nèi)存概念篇) :手眼通天的虛擬內(nèi)存
鴻蒙內(nèi)核源碼分析(內(nèi)存概念篇) :手眼通天的虛擬內(nèi)存
鴻蒙內(nèi)核源碼分析(必讀篇):用故事說(shuō)內(nèi)核
鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇):Task是如何被調(diào)度執(zhí)行的
鴻蒙內(nèi)核源碼分析(必讀篇)
鴻蒙內(nèi)核源碼分析(百篇博客分析.挖透鴻蒙內(nèi)核)
鴻蒙內(nèi)核源碼分析:鴻蒙內(nèi)核的每段匯編代碼解析
鴻蒙內(nèi)核源碼分析: 虛擬內(nèi)存和物理內(nèi)存是怎么管理的
鴻蒙內(nèi)核源碼分析 :內(nèi)核最重要結(jié)構(gòu)體
鴻蒙內(nèi)核源碼分析之中斷管理
評(píng)論