ARMv8 創建1、2、3級頁表代碼與注釋

對下面的地址空間創建3級頁表

// level 1 table, 4 entries:
// 0000 0000 - 3FFF FFFF, 1GB block, DDR
// 4000 0000 - 7FFF FFFF, 1GB block, DDR
// 8000 0000 - BFFF FFFF, 1GB block, DDR
// C000 0000 - FFFF FFFF, point to level2 tabel
//
// level 2 table, 512 entries:
// C000 0000 - DFFF FFFF, 256 entries, 512MB DDR, 2MB block
// E000 0000 - EFFF FFFF, 128 ?entries, 256MB OSPI0 flash, 2MB block
// F000 0000 - F01F FFFF, 1 entries, resever , 2MB block, device
// F020 0000 - F03F FFFF, 1 entry, point to level 3_1
// F040 0000 - F05F FFFF, 1 entry, point to level 3_2
// F060 0000 - F07F FFFF, 1 entry, point to level 3_3
// F080 0000 - F09F FFFF, 1 entries, 2MB block, normal memory, RNE_MEM, 1.5M acture, SRAM
// F0A0 0000 - F0BF FFFF, 1 entries, 2MB block, device, RNE_CFG1

下面是創建過程與添加的注釋。

#include "v8_mmu.h".text.cfi_sections .debug_frame  // put stack frame info into .debug_frame instead of .eh_frame.global setup_ttb.global ZeroBlock.global __ttb0_l1.global __ttb0_l2_ram.global __ttb0_l3_ram_1.global __ttb0_l3_ram_2.global __ttb0_l3_ram_3//----------------------------------------------------------------
// setup translation table
// level 1 table, 4 entries:
// 0000 0000 - 3FFF FFFF, 1GB block, DDR
// 4000 0000 - 7FFF FFFF, 1GB block, DDR
// 8000 0000 - BFFF FFFF, 1GB block, DDR
// C000 0000 - FFFF FFFF, point to level2 tabel
//
// level 2 table, 512 entries:
// C000 0000 - DFFF FFFF, 256 entries, 512MB DDR, 2MB block
// E000 0000 - EFFF FFFF, 128  entries, 256MB OSPI0 flash, 2MB block
// F000 0000 - F01F FFFF, 1 entries, resever , 2MB block, device
// F020 0000 - F03F FFFF, 1 entry, point to level 3_1
// F040 0000 - F05F FFFF, 1 entry, point to level 3_2
// F060 0000 - F07F FFFF, 1 entry, point to level 3_3
// F080 0000 - F09F FFFF, 1 entries, 2MB block, normal memory, RNE_MEM, 1.5M acture, SRAM
// F0A0 0000 - F0BF FFFF, 1 entries, 2MB block, device, RNE_CFG1
//----------------------------------------------------------------.type setup_ttb, "function".cfi_startproc
setup_ttb://// x21 = address of L1 tables// x22 = address of L2 tables// x23 = address of L3 tables F02// x24 = address of L3 tables F04// x25 = address of L3 tables F06//ldr x2, =0  // x2 = 0 (用于清零內存)ldr x3, =0 // x3 = 0 (同上)// 清零 L1 頁表 (__ttb0_l1) (L1 頁表(32 字節,4 個條目))ldr x21, =__ttb0_l1  // x21 = L1 頁表基地址mov x0, x21            // x0 = 當前操作地址mov x1, #(4 << 3)      // x1 = 4個條目 * 8字節 = 32字節 (L1頁表大小)add x0, x0, x1         // x0 指向區域末尾 (預遞減清零準備)// can not call func ZeroBlock,  not support nesting
loop_zero_0:subs x1, x1, #16       // 每次處理16字節 (2個條目),更新計數器stp  x2, x3, [x0, #-16]! // 存儲雙零并遞減地址: [x0-16] = (0,0), x0-=16b.ne loop_zero_0        // 循環直到x1=0// 清零 L2 頁表 (__ttb0_l2_ram) (L2 頁表(4096 字節,512 條目))ldr x22, =__ttb0_l2_ram // x22 = L2 頁表基地址mov x1, #(512 << 3)    // x1 = 512條目 * 8字節 = 4096字節 (標準2MB塊大小)mov x0, x22            // x0 = 當前操作地址add x0, x0, x1         // x0 指向區域末尾//循環使用 subs + b.ne 實現精確計數(當 x1 減至 0 時退出)
loop_zero_1:subs x1, x1, #16       // 每次16字節stp  x2, x3, [x0, #-16]! // 存儲雙零并前移指針b.ne loop_zero_1       // 循環// 清零第一個 L3 頁表 (__ttb0_l3_ram_1) (三個 L3 頁表(各 4096 字節))ldr x23, =__ttb0_l3_ram_1 // x23 = L3 頁表1基地址mov x1, #(512 << 3)    // 4096字節 (標準4KB頁表大小)mov x0, x23add x0, x0, x1        // 指向末尾
loop_zero_2:subs x1, x1, #16stp  x2, x3, [x0, #-16]!b.ne loop_zero_2// 清零第二個 L3 頁表 (__ttb0_l3_ram_2)ldr x24, =__ttb0_l3_ram_2 // x24 = L3 頁表2基地址mov x1, #(512 << 3)    // 4096字節mov x0, x24add x0, x0, x1        // 指向末尾
loop_zero_3:subs x1, x1, #16stp  x2, x3, [x0, #-16]!b.ne loop_zero_3// 清零第三個 L3 頁表 (__ttb0_l3_ram_3)ldr x25, =__ttb0_l3_ram_3 // x25 = L3 頁表3基地址mov x1, #(512 << 3)    // 4096字節mov x0, x25add x0, x0, x1         // 指向末尾
loop_zero_4:subs x1, x1, #16stp  x2, x3, [x0, #-16]!b.ne loop_zero_4// 設置 L1 頁表項配置// 0000 0000 - 3FFF FFFF, 1GB block, DDR// 4000 0000 - 7FFF FFFF, 1GB block, DDR// 8000 0000 - BFFF FFFF, 1GB block, DDR// 3 1G block, write to l1 table//ldr x1, =3                // x1 = 3 (需要配置的頁表項數量)ldr x2, =0x40000000      // x2 = 1GB 地址增量 (每個 L1 條目映射 1GB 空間)// 構建 L1 塊描述符屬性值:// - 物理地址基址: 0x00000000// - 塊描述符類型 (TT_S1_ATTR_BLOCK)  TT_S1_ATTR_BLOCK:使用塊描述符 (1GB/2MB 大頁)// - 內存屬性索引 1 (MATTR=1) 普通內存,適用于ddr// - 非安全狀態 (NS)// - 特權讀寫權限 (AP_RW_PL1)// - 內部可共享 (SH_INNER)// - 訪問標志 (AF)// - 非全局映射 (nG)ldr x3, =(0x00000000	   | \TT_S1_ATTR_BLOCK | \(1 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)mov x4, x21                // x4 = L1 頁表基址指針 (x21 來自前段代碼)#if 1	// enable after ddr ready
loop1:str x3, [x4], #8         // 存儲每次的x3描述符到 L1 頁表并后移指針add x3, x3, x2           // 物理地址增加 1GB (0x40000000)subs x1, x1, #1           // 遞減計數器bne loop1                 // 循環直到 3 個條目配置完成
#else
loop1:add x4, x4, #8           // 僅移動指針 (不存儲)add x3, x3, x2          // 物理地址增加 1GBsubs x1, x1, #1bne loop1
#endif// 配置 L1 頁表中 C0000000-FFFFFFFF 區域的條目// C000 0000 - FFFF FFFF, point to level2 tabel, write to l1 tableorr x1, x22, #TT_S1_ATTR_PAGE  // 將 L2 表基址(x22)與頁表描述符屬性組合。TT_S1_ATTR_PAGE:頁表描述符 (指向下級頁表)str x1, [x4]              // 存儲到 L1 頁表 (指向 L2 頁表)// 配置 L2 頁表:DDR 區域 (C0000000-DFFFFFFF, 512MB)// level 2 table: C000 0000 - DFFF FFFF, 256 entries, 512MB DDR, 2MB blockldr x1, =256              // 256 個條目 (256 * 2MB = 512MB)ldr x2, =0x200000         // x2 = 2MB 地址增量 (塊大小)// 構建 DDR 區域的 L2 塊描述符:// - 物理地址基址: 0xC0000000// - 塊描述符類型// - 內存屬性索引 1 (普通內存)ldr x3, =(0xC0000000	   | \TT_S1_ATTR_BLOCK | \(1 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)mov x4, x22              // x4 = L2 頁表基址指針 (x22)
loop2_ddr:str x3, [x4], #8          // 存儲每次的x3到描述符到 L2 頁表并后移指針add x3, x3, x2           // 物理地址增加 2MBsubs x1, x1, #1          // 遞減計數器bne loop2_ddr            // 循環配置 256 個條目// 配置 L2 頁表:OSPI0 Flash 區域 (E0000000-EFFFFFFF, 256MB)// level 2 table: E000 0000 - EFFF FFFF, 64 entries, 128MB OSPI0 flash, 2MB blockldr x1, =128              // 128 個條目 (128 * 2MB = 256MB)ldr x2, =0x200000         // 2MB 塊大小// 構建 OSPI Flash 的 L2 塊描述符:// - 物理地址基址: 0xE0000000// - 內存屬性索引TT_S1_ATTR_MATTR_LSB 2 (通常用于設備內存)//AP_RW_PL1:特權讀寫權限//SH_INNER:內部可共享//AF:訪問標志 (Access Flag)//nG:非全局映射ldr x3, =(0xE0000000	   | \TT_S1_ATTR_BLOCK | \(2 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)
loop2_ospi0:str x3, [x4], #8         // 繼續在 L2 頁表存儲 (緊接 DDR 區域之后)add x3, x3, x2         	 // 物理地址增加 2MBsubs x1, x1, #1           // 遞減計數器bne loop2_ospi0           // 循環配置 128 個條目// F0800000-F09FFFFF 區域:2MB 塊映射 (普通內存)// F000 0000 - F01F FFFF, resever, no need to set this block// F080 0000 - F09F FFFF, 1 entries, 2MB block, normal memory, RNE_MEM, 1.5M acture, SRAM// 物理地址 + 屬性ldr x1, =(0xF0800000	   | \TT_S1_ATTR_BLOCK | \(1 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)ldr x2, =0xF0800000  // 目標虛擬地址ubfx x3, x2, #21, #9            // 提取 L2 索引 (位[29:21]) ?str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表 (x22) ?// F0A00000-F0BFFFFF 區域:2MB 塊映射 (設備內存)// F0A0 0000 - F0BF FFFF, 1 entries, 2MB block, device, RNE_CFG1// 物理地址 + 屬性ldr x1, =(0xF0A00000	   | \TT_S1_ATTR_BLOCK | \(2 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)ldr x2, =0xF0A00000            // 目標虛擬地址ubfx x3, x2, #21, #9         // 提取 L2 索引str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表/*0x00000000 ~ 0xc0000000                          ----l10xc0000000 ~ 0xe0000000                          ----l20xe0000000 ~ 0xf0000000                          ----l20xf0800000 ~ 0xf0870000 rne_mem                    ----l20xf0a00000 ~ 0xf0bfffff rne_cfg                    ----l20xf0000000 ~ 0xf02fffff  rsv0xf0314000 ~ 0xf03effff  peri                   -----0xf0200000 ~ 0xf03fffff : l2 -> l3 3_10xf0400000 ~ 0xf04fffff usb                     -----0xf0500000 ~ 0xf0517fff peri                    -----0xf0400000 ~ 0xf05fffff : l2 -> l3 3_20xf0600000 ~ 0xf062ffff ddr gic noc acodec      -----0xf0600000 ~ 0xf07fffff : l2 -> l3 3_3地址轉換:L2 索引:ubfx 提取位[29:21] (#21, #9)L3 索引:ubfx 提取位[20:12] (#12, #9)頁表項位置:基址 + 索引 × 8 (lsl #3)*/// 設置 L2 頁表項:F0200000-F03FFFFF 指向 L3 頁表 (x23)// level 2 table: F020 0000 - F03F FFFF, 1 entry, point to level 3_1orr x1, x23, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF0200000             // 虛擬地址范圍起始ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]       // 寫入 L2 頁表// 設置 L2 頁表項:F0400000-F05FFFFF 指向 L3 頁表 (x24)// level 2 table: F040 0000 - F05F FFFF, 1 entry, point to level 3_2orr x1, x24, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF0400000            // 虛擬地址范圍起始ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]       // 寫入 L2 頁表// 設置 L2 頁表項:F0600000-F12A5FFF 指向 L3 頁表 (x25)// level 2 table: F060 0000 - F12A 5FFF, 1 entry, point to level 3_3orr x1, x25, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF0600000            // 虛擬地址范圍起始ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表// 填充 L3 頁表 (x23):F0200000-F03FFFFF 區域 (512 個 4KB 頁)// level 3 table: F02 0000 - F03F FFFF, 512 entry, x24// valid addr  F020 0000 - F03F FFFFldr x1, =0x1000                // 頁大小:4KBldr x2, =((0xF03FFFFF + 1 - 0xF0200000) >> 12) // 計算頁數ldr x3, =0xF0200000                        // 物理地址起始// 頁描述符屬性// 設備內存屬性ldr x4, = (TT_S1_ATTR_PAGE | \(2 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)
loop3_1:ubfx x5, x3, #12, #9            // 提取頁內索引 (位[20:12])orr x6, x3, x4                // 組合物理地址和屬性str x6, [x23, x5, lsl #3]       // 存儲到 L3 頁表 (x23)add x3, x3, x1                 // 移動到下一頁subs x2, x2, #1               // 遞減頁計數器bne loop3_1                    // 循環直到所有頁映射完成// 填充 L3 頁表 (x24):F0400000-F05FFFFF 區域 (512 個 4KB 頁)// level 3 table: F040 0000 - F05F FFFF,, 512 entry, x25// valid addr  F040 0000 - F05F FFFFldr x1, =0x1000                 // 頁大小:4KBldr x2, =((0xF05FFFFF + 1 - 0xF0400000) >> 12) // 計算頁數ldr x3, =0xF0400000             // 物理地址起始// 設備內存屬性ldr x4, = (TT_S1_ATTR_PAGE | \(2 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)
loop3_2:ubfx x5, x3, #12, #9        // 提取頁內索引orr x6, x3, x4              // 組合物理地址和屬性str x6, [x24, x5, lsl #3]      // 存儲到 L3 頁表 (x24)add x3, x3, x1               // 下一頁subs x2, x2, #1               // 遞減頁計數器bne loop3_2               // 循環// 填充 L3 頁表 (x25):F0600000-F07FFFFF 區域 (512 個 4KB 頁)// level 3 table: F060 0000 - F07F FFFF, 512 entry, x25// valid addr  F060 0000 - F07F FFFFldr x1, =0x1000               // 頁大小:4KBldr x2, =((0xF07FFFFF + 1 - 0xF0600000) >> 12) // 計算頁數ldr x3, =0xF0600000             // 物理地址起始// 設備內存屬性ldr x4, = (TT_S1_ATTR_PAGE | \(2 << TT_S1_ATTR_MATTR_LSB) | \TT_S1_ATTR_NS | \TT_S1_ATTR_AP_RW_PL1 | \TT_S1_ATTR_SH_INNER | \TT_S1_ATTR_AF | \TT_S1_ATTR_nG)
loop3_3:ubfx x5, x3, #12, #9          // 提取頁內索引orr x6, x3, x4               // 組合物理地址和屬性str x6, [x25, x5, lsl #3]      // 存儲到 L3 頁表 (x25)add x3, x3, x1            	// 下一頁subs x2, x2, #1             // 遞減頁計數器bne loop3_3           		// 循環ret.cfi_endproc

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87829.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek-R1滿血版:硅基流動API或本地部署

大家好! 想在手機上部署 DeepSeek-R1 滿血版&#xff08;671B&#xff09;&#xff1f;我來手把手教你最靠譜的兩種方式&#xff01;滿血版模型參數高達 671 億&#xff0c;手機本地運行幾乎不可能&#xff0c;但通過「云服務 手機 App」的組合&#xff0c;你一樣能在手機上絲…

React 各顏色轉換方法、顏色值換算工具HEX、RGB/RGBA、HSL/HSLA、HSV、CMYK

&#x1f4d6; 簡介 基于 React Tailwind CSS 構建的專業顏色轉換工具&#xff0c;支持多種顏色格式的實時轉換。無論是設計師、開發者&#xff0c;都能在這個工具中找到所需的顏色轉換功能。 ? 核心功能 &#x1f3af; 多格式顏色轉換 HEX 格式: 支持 3 位縮寫 (#000, #…

開關電源抄板學習

一、實物 輸入220V&#xff0c;輸出12V5A 二、拍照并使用PS矯正 用卡尺測量下PCB的尺寸&#xff0c;在PS中作為畫布。 用相機拍下照片&#xff0c;導入到PS中&#xff0c;用拉伸工具對圖片進行矯正處理&#xff0c;并拉伸到和畫布一樣大小。 三、打開嘉立創EDA&#xff0c;導…

大數據在UI前端的應用探索:基于用戶行為分析的產品優化策略

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;用戶行為分析重構產品優化的技術邏輯 在數字化產品體驗競爭日益激烈的今…

優化 WebSocket 實現單例連接用于打印【待測試 】

class PrinterWebSocket { constructor(url) { if (PrinterWebSocket.instance) { return PrinterWebSocket.instance; } this.url url; this.socket null; this.queue []; // 打印任務隊列 this.isConnecting false; this.retry…

Spring Cloud Alibaba/Spring Boot整合華為云存儲實例(REST API方式)

一個小作業&#xff0c;初次嘗試華為云存儲&#xff0c;一點分享 原項目采用Spring Cloud Alibaba微服務技術、Spring Boot框架技術、VueJS前端框架開發技術&#xff0c;nacos注冊中心&#xff0c;數據庫為mysql 下面看一下沒有運用云存儲的原項目&#xff08;可跳過&#xf…

Petalinux工程如何離線編譯

目錄 一.下載離線包 1.1 共享狀態緩存包&#xff1a;sstate-cache 1.1.1 進入官網打開Petalinux工具網頁 1.1.2 找到相應的Petalinux版本 1.1.3 根據平臺下載 1.2 下載downloads源碼包 1.3 open_components源碼包 二.解壓 2.1 sstate-cache 2.2 downloads源碼包 2.3…

w446數字化農家樂管理平臺的設計與實現

&#x1f64a;作者簡介&#xff1a;多年一線開發工作經驗&#xff0c;原創團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看文章末尾??聯系方式獲取&#xff0c;記得注明來意哦~&#x1f339;贈送計算機畢業設計600個選題excel文…

AWS WebRTC:通過shell分析viewer端日志文件

在并發過程中,每個viewer會產生一個對應的日志文件,日志文件名為: viewer_channel_index_20250626_030943_145.logviewer端日志比master端日志文件數量多,比例大概是5:1,有1個master就會有5個viewer,每個viewer對應一個日志文件。 我要統計的是從啟動viewer到出第一幀視…

時間轉換——借助時間模塊time

兩種時間戳類型 例如s11704879917000 1、13位的時間戳&#xff1a;單位&#xff08;毫秒&#xff09; &#xff08;1&#xff09;毫秒變成秒&#xff0c;1s1000ms&#xff0c;s1/1000&#xff08;秒&#xff09; &#xff08;2&#xff09;加載時間 times time.localtime(…

LabVIEW MathScript薄板熱流模擬

熱流模擬是熱設計關鍵環節&#xff0c;傳統工具精準但開發周期長&#xff0c;本 VI 利用 LabVIEW 優勢&#xff0c;面向工程師快速驗證需求&#xff0c;在初步方案迭代、教學演示等場景更具效率&#xff0c;為熱分析提供輕量化替代路徑&#xff0c;后續可結合專業工具&#xff…

為什么大語言模型訓練和推理中越來越多地使用 bfloat16?

隨著大語言模型&#xff08;LLM&#xff09;的參數規模從幾十億&#xff08;B&#xff09;飆升到千億&#xff08;T&#xff09;級別&#xff0c;模型的訓練與推理效率變得尤為關鍵。為了在保證精度的同時節省顯存、加快運算&#xff0c;混合精度訓練&#xff08;Mixed Precisi…

暴力破解漏洞與命令執行漏洞

在當今的互聯網世界中&#xff0c;網絡安全威脅無處不在。對于Java后端開發者而言&#xff0c;了解常見的Web漏洞及其防護措施至關重要。本文將探討兩種常見的安全漏洞&#xff1a;暴力破解漏洞&#xff08;Brute Force&#xff09;和命令執行漏洞&#xff08;Command Injectio…

HDFS Java API 開發指南:從基礎操作到高級應用

HDFS (Hadoop Distributed File System) 作為大數據生態的核心存儲系統&#xff0c;提供了分布式、高容錯、高吞吐量的數據存儲能力。通過 Java API 操作 HDFS 是開發大數據應用的基礎技能。本文將基于你的筆記&#xff0c;詳細解析 HDFS Java API 的使用方法&#xff0c;并提供…

區塊鏈技術核心組件及應用架構的全面解析

區塊鏈技術是一套融合密碼學、分布式系統與經濟激勵的復合型技術體系&#xff0c;以下是其核心組件及應用架構的全面解析&#xff1a;一、區塊鏈核心技術棧 1. 分布式賬本技術&#xff08;DLT&#xff09; 核心原理&#xff1a;多節點共同維護不可篡改的數據鏈數據結構&#xf…

golang 協程 如何中斷和恢復

Go語言通知協程退出(取消)的幾種方式 - 知乎 GoLang之goroutine底層系列二(goroutine的創建、讓出、恢復)_golang goroutine-CSDN博客 在 Go 語言中&#xff0c;協程&#xff08;也稱為 goroutine&#xff09;是通過 go 關鍵字啟動的輕量級線程。由于 goroutine 的調度是由 Go…

ARMv8 創建3級頁表示例

最近在研究arm v8頁表創建過程&#xff0c;順帶做了一個如下形式的頁表&#xff0c; // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF…

遷港戰平 精神可勝國足

遷港戰平可勝國足 江蘇省城市足球聯賽第6輪&#xff0c;宿遷隊主場迎戰連云港隊。比賽中&#xff0c;宿遷隊由張棟和高馳各入一球&#xff0c;連云港隊則憑借穆家鑫與李團杰的進球連扳兩城。最終雙方以2比2握手言和。 第38分鐘&#xff0c;張棟角球進攻中無人盯防推射破門&…

408第三季part2 - 計算機網絡 - ip分布首部格式與分片

理解 好好看一下這個圖 每行是4B&#xff0c;首部也不一定是20B&#xff0c;還有可選字段&#xff0c;可以變的更大 然后我們先看一下概念 然后這個生存時間每路過一個路由器就會扣1滴血 比如一開始是13&#xff0c;經過r1r2r3到B會變成10 但如果是2&#xff0c;經過第二個路…

詳解String類不可變的底層原理

String類 String的基本特性 不可變性: String 對象一旦創建就不能被修改&#xff0c;所有看似修改的操作實際上都是創建新的 String 對象final類: String 類被聲明為 final&#xff0c;不能被繼承基于字符數組: 內部使用final char value[]存儲字符數據(Java9以后改為byte[] …