在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙內(nèi)核源碼分析:物理地址的映射

鴻蒙系統(tǒng)HarmonyOS ? 來源:oschina ? 作者:深入研究鴻蒙 ? 2020-11-03 10:28 ? 次閱讀

MMU的本質(zhì)

虛擬地址(VA):就是線性地址,鴻蒙內(nèi)存部分全是VA的身影,是由編譯器和鏈接器在定位程序時(shí)分配的,每個(gè)應(yīng)用程序都使用相同的虛擬內(nèi)存地址空間,而這些虛擬內(nèi)存地址空間實(shí)際上分別映射到不同的實(shí)際物理內(nèi)存空間上。CPU只知道虛擬地址,向虛擬地址要數(shù)據(jù),但在其保護(hù)模式下很悲催地址信號在路上被MMU攔截了,MMU把虛擬地址換成了物理地址,從而拿到了真正的數(shù)據(jù)。

物理地址(PA):程序的指令和常量數(shù)據(jù),全局變量數(shù)據(jù)以及運(yùn)行時(shí)動(dòng)態(tài)申請內(nèi)存所分配的實(shí)際物理內(nèi)存存放位置。

MMU采用頁表(page table)來實(shí)現(xiàn)虛實(shí)地址轉(zhuǎn)換,頁表項(xiàng)除了描述虛擬頁到物理頁直接的轉(zhuǎn)換外,還提供了頁的訪問權(quán)限(讀,寫,可執(zhí)行)和存儲(chǔ)屬性。MMU的本質(zhì)是拿虛擬地址的高位(20位)做文章,低12位是頁內(nèi)偏移地址不會(huì)變。也就是說虛擬地址和物理地址的低12位是一樣的,本篇詳細(xì)講述MMU是如何變戲法的。

MMU是通過兩級頁表結(jié)構(gòu):L1和L2來實(shí)現(xiàn)映射功能的,鴻蒙內(nèi)核當(dāng)然也實(shí)現(xiàn)了這兩級頁表轉(zhuǎn)換的實(shí)現(xiàn)。本篇是系列篇關(guān)于內(nèi)存部分最滿意的一篇,也是最不好理解的一篇,強(qiáng)烈建議結(jié)合源碼看,鴻蒙內(nèi)核源碼注釋中文版 【 Gitee倉|CSDN倉|Github倉|Coding倉 】內(nèi)存部分的注釋已經(jīng)基本完成 .

一級頁表L1

L1頁表將全部的4G地址空間劃分為4096個(gè)1M的節(jié),頁表中每一項(xiàng)(頁表項(xiàng))32位,其內(nèi)容是L2頁表基地址或某個(gè)1M物理內(nèi)存的基地址。虛擬地址的高12位用于對頁表項(xiàng)定位,也就是4096個(gè)頁面項(xiàng)的索引,L1頁表的基地址,也叫轉(zhuǎn)換表基地址,存放在CP15的C2(TTB)寄存器中,鴻蒙內(nèi)核源碼分析(內(nèi)存匯編篇)中有詳細(xì)的描述,自行翻看。

L1頁表項(xiàng)有三種描述格式,鴻蒙源碼如下。

/* L1 descriptor type */
#define MMU_DESCRIPTOR_L1_TYPE_INVALID                          (0x0 << 0)
#define MMU_DESCRIPTOR_L1_TYPE_PAGE_TABLE                       (0x1 << 0)
#define MMU_DESCRIPTOR_L1_TYPE_SECTION                          (0x2 << 0)
#define MMU_DESCRIPTOR_L1_TYPE_MASK                             (0x3 << 0)

第一種:Fault(INVALID)頁表項(xiàng),表示對應(yīng)虛擬地址未被映射,訪問將產(chǎn)生一個(gè)數(shù)據(jù)中止異常。

第二種:PAGE_TABLE頁表項(xiàng),指向L2頁表的頁表項(xiàng),意思就是把1M分成更多的頁(256*4K)

第三種:SECTION頁表項(xiàng) ,指向1M節(jié)的頁表項(xiàng)

?

頁表項(xiàng)的最低二位[1:0],用于定義頁表項(xiàng)的類型,section頁表項(xiàng)對應(yīng)1M的節(jié),直接使用頁表項(xiàng)的最高12位替代虛擬地址的高12位即可得到物理地址。還是直接看鴻蒙源碼來的清晰,每一行都加了詳細(xì)的注釋。

LOS_ArchMmuQuery通過虛擬地址查詢物理地址和flags

//通過虛擬地址查詢物理地址
STATUS_T LOS_ArchMmuQuery(const LosArchMmu *archMmu, VADDR_T vaddr, PADDR_T *paddr, UINT32 *flags)
{//archMmu->virtTtb:轉(zhuǎn)換表基地址
    PTE_T l1Entry = OsGetPte1(archMmu->virtTtb, vaddr);//獲取PTE vaddr右移20位 得到L1描述子地址
    PTE_T l2Entry;
    PTE_T* l2Base = NULL;

    if (OsIsPte1Invalid(l1Entry)) {//判斷L1描述子地址是否有效
        return LOS_ERRNO_VM_NOT_FOUND;//無效返回虛擬地址未查詢到
    } else if (OsIsPte1Section(l1Entry)) {// section頁表項(xiàng): l1Entry低二位是否為 10
        if (paddr != NULL) {//物理地址 = 節(jié)基地址(section頁表項(xiàng)的高12位) + 虛擬地址低20位
            *paddr = MMU_DESCRIPTOR_L1_SECTION_ADDR(l1Entry) + (vaddr & (MMU_DESCRIPTOR_L1_SMALL_SIZE - 1));
        }

        if (flags != NULL) {
            OsCvtSecAttsToFlags(l1Entry, flags);//獲取虛擬內(nèi)存的flag信息
        }
    } else if (OsIsPte1PageTable(l1Entry)) {//PAGE_TABLE頁表項(xiàng): l1Entry低二位是否為 01
        l2Base = OsGetPte2BasePtr(l1Entry);//獲取L2轉(zhuǎn)換表基地址
        if (l2Base == NULL) {
            return LOS_ERRNO_VM_NOT_FOUND;
        }
        l2Entry = OsGetPte2(l2Base, vaddr);//獲取L2描述子地址
        if (OsIsPte2SmallPage(l2Entry) || OsIsPte2SmallPageXN(l2Entry)) {
            if (paddr != NULL) {//物理地址 = 小頁基地址(L2頁表項(xiàng)的高20位) + 虛擬地址低12位
                *paddr = MMU_DESCRIPTOR_L2_SMALL_PAGE_ADDR(l2Entry) + (vaddr & (MMU_DESCRIPTOR_L2_SMALL_SIZE - 1));
            }

            if (flags != NULL) {
                OsCvtPte2AttsToFlags(l1Entry, l2Entry, flags);//獲取虛擬內(nèi)存的flag信息
            }
        } else if (OsIsPte2LargePage(l2Entry)) {//鴻蒙目前暫不支持64K大頁,未來手機(jī)版應(yīng)該會(huì)支持。
            LOS_Panic("%s %d, large page unimplemented
", __FUNCTION__, __LINE__);
        } else {
            return LOS_ERRNO_VM_NOT_FOUND;
        }
    }

    return LOS_OK;
}

這是鴻蒙內(nèi)核對地址使用最頻繁的功能,通過虛擬地址得到物理地址和flag信息,看下哪些地方會(huì)調(diào)用到它。

二級頁表L2

L1頁表項(xiàng)表示1M的地址范圍,L2把1M分成更多的小頁,鴻蒙內(nèi)核 一頁按4K算,所以被分成 256個(gè)小頁。

L2頁表中包含256個(gè)頁表項(xiàng),每個(gè)32位(4個(gè)字節(jié)),L2頁表需要 256*4 = 1K的空間,必須按1K對齊,每個(gè)L2頁表項(xiàng)將4K的虛擬內(nèi)存地址轉(zhuǎn)換為物理地址,每個(gè)L2頁面項(xiàng)都給出了一個(gè)4K的頁基地址。

L2頁表項(xiàng)有三種格式:

/* L2 descriptor type */
#define MMU_DESCRIPTOR_L2_TYPE_INVALID                          (0x0 << 0)
#define MMU_DESCRIPTOR_L2_TYPE_LARGE_PAGE                       (0x1 << 0)
#define MMU_DESCRIPTOR_L2_TYPE_SMALL_PAGE                       (0x2 << 0)
#define MMU_DESCRIPTOR_L2_TYPE_SMALL_PAGE_XN                    (0x3 << 0)
#define MMU_DESCRIPTOR_L2_TYPE_MASK                             (0x3 << 0)

第一種:Fault(INVALID)頁表項(xiàng),表示對應(yīng)虛擬地址未被映射,訪問將產(chǎn)生一個(gè)數(shù)據(jù)中止異常。

第二種:大頁表項(xiàng),包含一個(gè)指向64K頁的指針,但鴻蒙內(nèi)核并沒有實(shí)現(xiàn)大頁表的支持,給出了未實(shí)現(xiàn)的提示

if (OsIsPte2LargePage(l2Entry)) {
            LOS_Panic("%s %d, large page unimplemented
", __FUNCTION__, __LINE__);
        } 

第三種:小頁表項(xiàng),包含一個(gè)指向4K頁的指針。

映射初始化的過程

先看調(diào)用和被調(diào)用的關(guān)系

//啟動(dòng)映射初始化
VOID OsInitMappingStartUp(VOID)
{
    OsArmInvalidateTlbBarrier();//使TLB失效

    OsSwitchTmpTTB();//切換到臨時(shí)TTB

    OsSetKSectionAttr();//設(shè)置內(nèi)核段(text,rodata,bss)映射

    OsArchMmuInitPerCPU();//初始化CPU與mmu相關(guān)信息
}

干脆利落,調(diào)用了四個(gè)函數(shù),其中三個(gè)在鴻蒙內(nèi)核源碼分析(內(nèi)存匯編篇)有涉及,不展開講,這里說OsSetKSectionAttr

它實(shí)現(xiàn)了內(nèi)核空間各個(gè)區(qū)的映射,內(nèi)核本身也是程序,鴻蒙把內(nèi)核空間在物理內(nèi)存上就獨(dú)立開來了,也就是說在物理內(nèi)存上有一段區(qū)域是只給內(nèi)核空間享用的,從根上就把內(nèi)核和APP 空間隔離了,里面放的是內(nèi)核的重要數(shù)據(jù)(包括代碼,常量和全局變量),具體看代碼,代碼很長,整個(gè)函數(shù)全貼出來了,都加上了注釋。

OsSetKSectionAttr內(nèi)核空間的設(shè)置和映射

typedef struct ArchMmuInitMapping {
    PADDR_T phys;//物理地址
    VADDR_T virt;//虛擬地址
    size_t  size;//大小
    unsigned int flags;//標(biāo)識 讀/寫/.. VM_MAP_REGION_FLAG_PERM_*
    const char *name;//名稱
} LosArchMmuInitMapping;

VADDR_T *OsGFirstTableGet()
{
    return (VADDR_T *)g_firstPageTable;//UINT8 g_firstPageTable[MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS]
}
//設(shè)置內(nèi)核空間段屬性,可看出內(nèi)核空間是固定映射到物理地址
STATIC VOID OsSetKSectionAttr(VOID)
{
    /* every section should be page aligned */
    UINTPTR textStart = (UINTPTR)&__text_start;//代碼段開始位置
    UINTPTR textEnd = (UINTPTR)&__text_end;//代碼段結(jié)束位置
    UINTPTR rodataStart = (UINTPTR)&__rodata_start;//常量只讀段開始位置
    UINTPTR rodataEnd = (UINTPTR)&__rodata_end;//常量只讀段結(jié)束位置
    UINTPTR ramDataStart = (UINTPTR)&__ram_data_start;//全局變量段開始位置
    UINTPTR bssEnd = (UINTPTR)&__bss_end;//bss結(jié)束位置
    UINT32 bssEndBoundary = ROUNDUP(bssEnd, MB);
    LosArchMmuInitMapping mmuKernelMappings[] = {
        {
            .phys = SYS_MEM_BASE + textStart - KERNEL_VMM_BASE,//映射物理內(nèi)存位置
            .virt = textStart,//內(nèi)核代碼區(qū)
            .size = ROUNDUP(textEnd - textStart, MMU_DESCRIPTOR_L2_SMALL_SIZE),//代碼區(qū)大小
            .flags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_EXECUTE,//代碼段可讀,可執(zhí)行
            .name = "kernel_text"
        },
        {
            .phys = SYS_MEM_BASE + rodataStart - KERNEL_VMM_BASE,//映射物理內(nèi)存位置
            .virt = rodataStart,//內(nèi)核常量區(qū)
            .size = ROUNDUP(rodataEnd - rodataStart, MMU_DESCRIPTOR_L2_SMALL_SIZE),//4K對齊
            .flags = VM_MAP_REGION_FLAG_PERM_READ,//常量段只讀
            .name = "kernel_rodata"
        },
        {
            .phys = SYS_MEM_BASE + ramDataStart - KERNEL_VMM_BASE,//映射物理內(nèi)存位置
            .virt = ramDataStart,
            .size = ROUNDUP(bssEndBoundary - ramDataStart, MMU_DESCRIPTOR_L2_SMALL_SIZE),
            .flags = VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE,//全局變量區(qū)可讀可寫
            .name = "kernel_data_bss"
        }
    };
    LosVmSpace *kSpace = LOS_GetKVmSpace();//獲取內(nèi)核空間
    status_t status;
    UINT32 length;
    paddr_t oldTtPhyBase;
    int i;
    LosArchMmuInitMapping *kernelMap = NULL;//內(nèi)核映射
    UINT32 kmallocLength;

    /* use second-level mapping of default READ and WRITE */
    kSpace->archMmu.virtTtb = (PTE_T *)g_firstPageTable;//__attribute__((section(".bss.prebss.translation_table"))) UINT8 g_firstPageTable[MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS];
    kSpace->archMmu.physTtb = LOS_PaddrQuery(kSpace->archMmu.virtTtb);//通過TTB虛擬地址查詢TTB物理地址
    status = LOS_ArchMmuUnmap(&kSpace->archMmu, KERNEL_VMM_BASE,
                               (bssEndBoundary - KERNEL_VMM_BASE) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT);//解綁 bssEndBoundary - KERNEL_VMM_BASE 映射
    if (status != ((bssEndBoundary - KERNEL_VMM_BASE) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) {//解綁失敗
        VM_ERR("unmap failed, status: %d", status);
        return;
    }
	//映射 textStart - KERNEL_VMM_BASE 區(qū)
    status = LOS_ArchMmuMap(&kSpace->archMmu, KERNEL_VMM_BASE, SYS_MEM_BASE,
                             (textStart - KERNEL_VMM_BASE) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT,
                             VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE |
                             VM_MAP_REGION_FLAG_PERM_EXECUTE);
    if (status != ((textStart - KERNEL_VMM_BASE) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) {
        VM_ERR("mmap failed, status: %d", status);
        return;
    }

    length = sizeof(mmuKernelMappings) / sizeof(LosArchMmuInitMapping);
    for (i = 0; i < length; i++) {//對mmuKernelMappings一一映射好
        kernelMap = &mmuKernelMappings[i];
        status = LOS_ArchMmuMap(&kSpace->archMmu, kernelMap->virt, kernelMap->phys,
                                 kernelMap->size >> MMU_DESCRIPTOR_L2_SMALL_SHIFT, kernelMap->flags);
        if (status != (kernelMap->size >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) {
            VM_ERR("mmap failed, status: %d", status);
            return;
        }
        LOS_VmSpaceReserve(kSpace, kernelMap->size, kernelMap->virt);//保留區(qū)
    }
	//將剩余空間映射好
    kmallocLength = KERNEL_VMM_BASE + SYS_MEM_SIZE_DEFAULT - bssEndBoundary;
    status = LOS_ArchMmuMap(&kSpace->archMmu, bssEndBoundary,
                             SYS_MEM_BASE + bssEndBoundary - KERNEL_VMM_BASE,
                             kmallocLength >> MMU_DESCRIPTOR_L2_SMALL_SHIFT,
                             VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE);
    if (status != (kmallocLength >> MMU_DESCRIPTOR_L2_SMALL_SHIFT)) {
        VM_ERR("unmap failed, status: %d", status);
        return;
    }
    LOS_VmSpaceReserve(kSpace, kmallocLength, bssEndBoundary);

    /* we need free tmp ttbase */
    oldTtPhyBase = OsArmReadTtbr0();//讀取TTB值
    oldTtPhyBase = oldTtPhyBase & MMU_DESCRIPTOR_L2_SMALL_FRAME;
    OsArmWriteTtbr0(kSpace->archMmu.physTtb | MMU_TTBRx_FLAGS);//內(nèi)核頁表基地址寫入CP15 c2(TTB寄存器)
    ISB;

    /* we changed page table entry, so we need to clean TLB here */
    OsCleanTLB();//清空TLB緩沖區(qū)

    (VOID)LOS_MemFree(m_aucSysMem0, (VOID *)(UINTPTR)(oldTtPhyBase - SYS_MEM_BASE + KERNEL_VMM_BASE));//釋放內(nèi)存池
}

LOS_ArchMmuMap生成L1,L2頁表項(xiàng),實(shí)現(xiàn)映射的過程

mmu的map 就是生成L1,L2頁表項(xiàng)的過程,以供虛實(shí)地址的轉(zhuǎn)換使用,還是直接看代碼吧,代碼說明一切!

//所謂的 map 就是 生成L1,L2頁表項(xiàng)的過程
status_t LOS_ArchMmuMap(LosArchMmu *archMmu, VADDR_T vaddr, PADDR_T paddr, size_t count, UINT32 flags)
{
    PTE_T l1Entry;
    UINT32 saveCounts = 0;
    INT32 mapped = 0;
    INT32 checkRst;

    checkRst = OsMapParamCheck(flags, vaddr, paddr);//檢查參數(shù)
    if (checkRst < 0) {
        return checkRst;
    }

    /* see what kind of mapping we can use */
    while (count > 0) {
        if (MMU_DESCRIPTOR_IS_L1_SIZE_ALIGNED(vaddr) && //虛擬地址和物理地址對齊 0x100000(1M)時(shí)采用
            MMU_DESCRIPTOR_IS_L1_SIZE_ALIGNED(paddr) && //section頁表項(xiàng)格式
            count >= MMU_DESCRIPTOR_L2_NUMBERS_PER_L1) { //MMU_DESCRIPTOR_L2_NUMBERS_PER_L1 = 0x100 
            /* compute the arch flags for L1 sections cache, r ,w ,x, domain and type */
            saveCounts = OsMapSection(archMmu, flags, &vaddr, &paddr, &count);//生成L1 section類型頁表項(xiàng)并保存
        } else {
            /* have to use a L2 mapping, we only allocate 4KB for L1, support 0 ~ 1GB */
            l1Entry = OsGetPte1(archMmu->virtTtb, vaddr);//獲取L1頁面項(xiàng)
            if (OsIsPte1Invalid(l1Entry)) {//L1 fault頁面項(xiàng)類型
                OsMapL1PTE(archMmu, &l1Entry, vaddr, flags);//生成L1 page table類型頁表項(xiàng)并保存
                saveCounts = OsMapL2PageContinous(l1Entry, flags, &vaddr, &paddr, &count);//生成L2 頁表項(xiàng)目并保存
            } else if (OsIsPte1PageTable(l1Entry)) {//L1 page table頁面項(xiàng)類型
                saveCounts = OsMapL2PageContinous(l1Entry, flags, &vaddr, &paddr, &count);//生成L2 頁表項(xiàng)目并保存
            } else {
                LOS_Panic("%s %d, unimplemented tt_entry %x
", __FUNCTION__, __LINE__, l1Entry);
            }
        }
        mapped += saveCounts;
    }

    return mapped;
}

STATIC UINT32 OsMapL2PageContinous(PTE_T pte1, UINT32 flags, VADDR_T *vaddr, PADDR_T *paddr, UINT32 *count)
{
    PTE_T *pte2BasePtr = NULL;
    UINT32 archFlags;
    UINT32 saveCounts;

    pte2BasePtr = OsGetPte2BasePtr(pte1);
    if (pte2BasePtr == NULL) {
        LOS_Panic("%s %d, pte1 %#x error
", __FUNCTION__, __LINE__, pte1);
    }

    /* compute the arch flags for L2 4K pages */
    archFlags = OsCvtPte2FlagsToAttrs(flags);
    saveCounts = OsSavePte2Continuous(pte2BasePtr, OsGetPte2Index(*vaddr), *paddr | archFlags, *count);
    *paddr += (saveCounts << MMU_DESCRIPTOR_L2_SMALL_SHIFT);
    *vaddr += (saveCounts << MMU_DESCRIPTOR_L2_SMALL_SHIFT);
    *count -= saveCounts;
    return saveCounts;
}

OsMapL2PageContinous沒有加注釋,希望你別太懶,趕緊動(dòng)起來,到這里應(yīng)該都能看懂了!最好能結(jié)合 鴻蒙內(nèi)核源碼分析(內(nèi)存匯編篇)一起看理解會(huì)更深透。

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    18652
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2641

    瀏覽量

    67762
收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    飛凌嵌入式ElfBoard ELF 1板卡-Regmap子系統(tǒng)之Regmap簡介

    物理地址、寄存器位寬、寄存器縮放因子等信息,以及底層設(shè)備的通信接口(如I2C或SPI)。一旦regmap對象被初始化,驅(qū)動(dòng)程序可以使用 Regmap API 中提供的函數(shù)來讀取和寫入寄存器的值,執(zhí)行位操作
    發(fā)表于 04-16 11:03

    請問如何在imx8qm上將PCIe和SMMU用于顯卡?

    您好,目前,我正準(zhǔn)備在 IMX8QM 處理器上支持 PCIe 顯卡設(shè)備。要求是通過 SMMU 方法將映射從虛擬地址更改為物理地址,以實(shí)現(xiàn)自定義設(shè)備空間。但是,我在 Linux 的 imx8qm-mek.dts 設(shè)備樹文件中沒有找
    發(fā)表于 03-28 06:27

    OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開發(fā)板演示

    本文介紹瑞芯微主板/開發(fā)板編譯OpenHarmony源碼后燒錄鏡像的教程,觸覺智能Purple Pi OH鴻蒙開發(fā)板演示。搭載了瑞芯微RK3566四核處理器,樹莓派卡片電腦設(shè)計(jì),支持開源鴻蒙OpenHarmony3.2-5.0系
    的頭像 發(fā)表于 12-30 10:08 ?689次閱讀
    OpenHarmony<b class='flag-5'>源碼</b>編譯后燒錄鏡像教程,RK3566<b class='flag-5'>鴻蒙</b>開發(fā)板演示

    MAC地址的作用范圍,MAC地址怎么申請?

    物理地址(PhysicalAddress),用于在網(wǎng)絡(luò)中唯一標(biāo)示一個(gè)網(wǎng)卡。以下是英利檢測針對其作用范圍及申請方式的詳細(xì)解答:MAC地址的作用范圍局域網(wǎng)內(nèi)的設(shè)備定位
    的頭像 發(fā)表于 12-19 17:44 ?1412次閱讀
    MAC<b class='flag-5'>地址</b>的作用范圍,MAC<b class='flag-5'>地址</b>怎么申請?

    如何使用內(nèi)存加速存儲(chǔ)訪問速度

    本篇文章是首爾大學(xué)發(fā)表在FAST 2023上的文章。隨著閃存容量的增加,邏輯地址物理地址映射表項(xiàng)也相應(yīng)增加。映射表項(xiàng)通常存放在設(shè)備控制器中的SRAM來加速訪問。然而由于成本問題SR
    的頭像 發(fā)表于 12-19 10:54 ?667次閱讀
    如何使用內(nèi)存加速存儲(chǔ)訪問速度

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    用戶提供移植好的板級開發(fā)包。板卡廠商也會(huì)對移植好的內(nèi)核版本進(jìn)行維護(hù),例如一些BUG修復(fù)或者物料替換。接下來講一下獲取這三種源碼的方法:獲取linux官網(wǎng)源碼 地址:https
    發(fā)表于 12-16 13:08

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    用戶提供移植好的板級開發(fā)包。板卡廠商也會(huì)對移植好的內(nèi)核版本進(jìn)行維護(hù),例如一些BUG修復(fù)或者物料替換。接下來講一下獲取這三種源碼的方法:獲取linux官網(wǎng)源碼地址:https
    發(fā)表于 12-13 09:03

    怎么綁定IP地址和MAC地址

    和MAC地址 ·使用快捷鍵Win+R打開運(yùn)行窗口,輸入cmd后回車。 ·在命令提示符窗口中輸入ipconfig /all,然后回車。 ·在輸出信息中找到IPv4地址(即IP地址)和物理地址
    的頭像 發(fā)表于 12-01 22:48 ?1183次閱讀

    IP地址歸屬地離線庫——網(wǎng)絡(luò)安全行業(yè)的基石

    地址歸屬地離線庫是網(wǎng)絡(luò)安全行業(yè)的基石。 網(wǎng)絡(luò)安全行業(yè)可以使用IP地址離線庫來進(jìn)行安全防御: l?根據(jù)IP地址地理信息的篩選 IP地址歸屬地離線庫會(huì)顯示IP
    的頭像 發(fā)表于 11-19 11:21 ?587次閱讀

    【免費(fèi)分享】OpenHarmony鴻蒙物聯(lián)網(wǎng)開發(fā)板資料包一網(wǎng)打盡,附教程/視頻/項(xiàng)目/源碼...

    ?想要深入學(xué)習(xí)鴻蒙設(shè)備開發(fā)及鴻蒙物聯(lián)網(wǎng)開發(fā)嗎?現(xiàn)在機(jī)會(huì)來了!我們?yōu)槌鯇W(xué)者們準(zhǔn)備了一份全面的資料包,包括原理圖、教程、視頻、項(xiàng)目、源碼等,所有資料全部免費(fèi)領(lǐng)取,課程視頻可試看(購買后看完整版),讓你
    的頭像 發(fā)表于 09-14 14:09 ?824次閱讀
    【免費(fèi)分享】OpenHarmony<b class='flag-5'>鴻蒙</b>物聯(lián)網(wǎng)開發(fā)板資料包一網(wǎng)打盡,附教程/視頻/項(xiàng)目/<b class='flag-5'>源碼</b>...

    如何獲取MAC地址?MAC地址的三個(gè)申請條件

    在產(chǎn)品設(shè)備都規(guī)范化管理的當(dāng)今社會(huì),如果您的產(chǎn)品設(shè)備想要投入市場,設(shè)備物理地址碼MAC地址則是唯一能識別設(shè)備的識別碼。那么MAC地址的申請條件有哪些?接下來請看英利檢測的分享。提交必要信息申請人信息
    的頭像 發(fā)表于 09-06 17:14 ?924次閱讀
    如何獲取MAC<b class='flag-5'>地址</b>?MAC<b class='flag-5'>地址</b>的三個(gè)申請條件

    每個(gè)段與寄存器之間有何對應(yīng)的要求

    與寄存器的對應(yīng)關(guān)系 在8086微處理器中,主存的物理地址由20位組成,這20位物理地址由16位的段地址(Segment Address)和16位的偏移地址(Offset Address
    的頭像 發(fā)表于 08-28 10:39 ?793次閱讀

    鴻蒙OpenHarmony南向/北向快速開發(fā)教程-迅為RK3568開發(fā)板

    P13_vendor和device目錄介紹 P14_內(nèi)核編譯腳本構(gòu)建分析 P15_內(nèi)核移植 P16_內(nèi)核移植優(yōu)化 P17_配置電源管理芯片和點(diǎn)亮HDMI屏幕 P18_
    發(fā)表于 07-23 10:44

    華為鴻蒙內(nèi)核獲中國信通院自主成熟度A級認(rèn)證

    在科技創(chuàng)新的浪潮中,華為再次以其卓越的自主研發(fā)能力引領(lǐng)行業(yè)前行。近日,中國信息通信研究院(簡稱“中國信通院”)官方公眾號宣布了一項(xiàng)重要成果:華為技術(shù)有限公司的鴻蒙內(nèi)核成功通過了自主成熟度等級認(rèn)證
    的頭像 發(fā)表于 07-03 14:32 ?974次閱讀

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

    1 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核 ? 6月21日,在華為開發(fā)者大會(huì)上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨(dú)立于安卓和iOS的
    的頭像 發(fā)表于 06-27 11:30 ?1174次閱讀
    主站蜘蛛池模板: tv电影天堂 | 精品卡一卡二 卡四卡视频 精品噜噜噜噜久久久久久久久 | 女人张开腿让男人做爽爽 | 成年午夜一级毛片视频 | 三级视频网站在线观看 | 4438全国最大成人免费高清 | 四虎884tt紧急大通知 | 国产一区二区高清在线 | 好吊妞视频988在线播放 | 国产精品国产午夜免费福利看 | 日韩一区二区视频 | 久久99热狠狠色精品一区 | xxxxbbbb欧美| 一区二区三区四区五区 | 黄在线视频 | 天天摸天天做天天爽水多 | 国产亚洲视频在线 | 加勒比精品久久一区二区三区 | 国产三级精品视频 | 免费看欧美理论片在线 | 欧美私人网站 | 狠狠干b | 国产精品亚洲玖玖玖在线靠爱 | 中文字幕在线观看一区二区三区 | 看逼网址| 女人被两根一起进3p在线观看 | 久久五月天婷婷 | 夜夜爽毛片 | 日本三级黄| 天天拍夜夜操 | 亚洲 成人 欧美 自拍 | 小草影院亚洲私人影院 | 国产精品毛片久久久久久久 | 视频一区亚洲 | 国产黄色精品 | 五月婷婷丁香色 | 亚洲国产欧美在线人成aaa | 亚洲国产成人久久精品影视 | 久久riav二区三区 | 手机视频在线播放 | 亚欧色视频在线观看免费 |