ARMv8 創建3級頁表示例

最近在研究arm?v8頁表創建過程,順帶做了一個如下形式的頁表,

// 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

// F100 0000 - F11F FFFF, 1 entry, point to level 3_1
// F200 0000 - F21F FFFF, 1 entry, point to level 3_2
// F240 0000 - F25F FFFF, 1 entry, point to level 3_3
// F260 0000 - F27F FFFF, 1 entry, point to level 3_4
// F500 0000 - F500 7FFF, 1 entries, GIC 32kB, point to level 3_5

// F220 0000 - F23D FFFF, 1 entries, 2MB block, device, RNE_CFG1
// F400 0000 - F403 FFFF, 1 entries, 2MB block, normal memory, RNE_MEM, 1.5M acture, SRAM
?

下面是頁表創建過程與詳細注釋,供后來者學習參考。

//----------------------------------------------------------------
// setup translation table
//
//----------------------------------------------------------------
#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// F100 0000 - F11F FFFF, 1 entry, point to level 3_1
// F200 0000 - F21F FFFF, 1 entry, point to level 3_2
// F240 0000 - F25F FFFF, 1 entry, point to level 3_3
// F260 0000 - F27F FFFF, 1 entry, point to level 3_4
// F500 0000 - F500 7FFF, 1 entries, GIC 32kB, point to level 3_5// F220 0000 - F23D FFFF, 1 entries, 2MB block, device, RNE_CFG1
// F400 0000 - F403 FFFF, 1 entries, 2MB block, normal memory, RNE_MEM, 1.5M acture, SRAM//----------------------------------------------------------------.type setup_ttb, "function".cfi_startproc
setup_ttb://// x21 = address of L1 tables// x22 = address of L2 tables// x23 = address of L3_1 tables// x24 = address of L3_2 tables// x25 = address of L3_3 tables// x26 = address of L3_4 tables// x27 = address of L3_5 tablesldr 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// 清零第4個 L3 頁表 (__ttb0_l3_ram_4)ldr x26, =__ttb0_l3_ram_4 // x26 = L3 頁表4基地址mov x1, #(512 << 3)    // 4096字節mov x0, x26add x0, x0, x1         // 指向末尾
loop_zero_5:subs x1, x1, #16stp  x2, x3, [x0, #-16]!b.ne loop_zero_5// 清零第5個 L3 頁表 (__ttb0_l3_ram_5)ldr x27, =__ttb0_l3_ram_5 // x26 = L3 頁表4基地址mov x1, #(512 << 3)    // 4096字節mov x0, x27add x0, x0, x1         // 指向末尾
loop_zero_6:subs x1, x1, #16stp  x2, x3, [x0, #-16]!b.ne loop_zero_6// 設置 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 個條目/*0x00000000 ~ 0xc0000000                          ----l10xc0000000 ~ 0xe0000000                          ----l20xe0000000 ~ 0xe8000000                          ----l2  DDR MEM0xe8000000 ~ 0xf0000000                          ----l2  DEVICE MEM0xf2200000 ~ 0xf23fffff rne_cfg                    ----l20xf4000000 ~ 0xf403ffff rne_mem 256kB             ----l20xf5000000 ~ 0xf5007fff GIC 32kB                   ----l20xf0000000 ~ 0xf0ffffff  rsv0xf1000000 ~ 0xf11fffff  peri                   -----2MB : l2 -> l3 3_10xf2000000 ~ 0xf21fffff  usb                    -----2MB : l2 -> l3 3_20xf2400000 ~ 0xf25fffff peri                     -----2MB : l2 -> l3 3_30xf2600000 ~ 0xf27fffff ddr gic noc acodec      -----0xf2600000 ~ 0xf26fffff 1MB : l2 -> l3 3_4// x21 = address of L1 tables// x22 = address of L2 tables// x23 = address of L3_1 tables// x24 = address of L3_2 tables// x25 = address of L3_3 tables// x26 = address of L3_4 tables地址轉換:L2 索引:ubfx 提取位[29:21] (#21, #9)L3 索引:ubfx 提取位[20:12] (#12, #9)頁表項位置:基址 + 索引 × 8 (lsl #3)*//*虛擬地址 (x2):31       21        12        0┌────────┬────────┬────────┐│  L2索引 │ L3索引 │  頁內偏移 │└────────┴────────┴────────┘9位     9位     12位頁表結構 (L2):x22 → ┌───────────┐ 基址│ 條目0      │├───────────┤│ 條目1      │├───────────┤│    ...    │├───────────┤│ 條目480    │ ← x22 + 480×8├───────────┤│    ...    │└───────────┘*/// 0xf4000000 ~ 0xf403ffff 區域:2MB 塊映射 (普通內存)// F400 0000 - F403 FFFF, 1 entries, 2MB block, normal memory, RNE_MEM, 256KB acture, SRAM// 物理地址 + 屬性ldr x1, =(0xF4000000	   | \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, =0xF4000000  // 目標虛擬地址ubfx x3, x2, #21, #9            // 提取 L2 索引 (位[29:21]) ?str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表 (x22) ?// 0xf2200000 ~ 0xf23fffff 區域:2MB 塊映射 (設備內存)// F220 0000 - F23F FFFF, 1 entries, 2MB block, device, RNE_CFG1// 物理地址 + 屬性ldr x1, =(0xF2200000	   | \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, =0xF2200000            // 目標虛擬地址ubfx x3, x2, #21, #9         // 提取 L2 索引str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表// 設置 L2 頁表項:0xf1000000 ~ 0xf11fffff 指向 L3 頁表 (x23)// level 2 table: 0xf1000000 ~ 0xf11fffff, 1 entry, point to level 3_1orr x1, x23, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF1000000             // 虛擬地址范圍起始/*從 x2 的位 [21] 開始連續提取 9 位(位 [21] 到 [29])	將提取的 9 位值存入 x3,高位補零擴展在頁表上下文中的意義:在 ARM64 頁表系統中:	虛擬地址位 [29:21] 對應 L2 頁表索引, 9 位索引可尋址 512 個條目 (2? = 512)	, 該指令提取虛擬地址中的 L2 頁表索引號*/ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]       // 寫入 L2 頁表// 設置 L2 頁表項:0xf2000000 ~ 0xf21fffff 指向 L3 頁表 (x24)// level 2 table: 0xf2000000 ~ 0xf21fffff, 1 entry, point to level 3_2orr x1, x24, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF2000000            // 虛擬地址范圍起始ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]       // 寫入 L2 頁表 //目標地址 = x22 + (x3 << 3)// 設置 L2 頁表項:0xf2400000 ~ 0xf25fffff 指向 L3 頁表 (x25)// level 2 table: 0xf2400000 ~ 0xf25fffff, 1 entry, point to level 3_3orr x1, x25, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF2400000            // 虛擬地址范圍起始ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表// 設置 L2 頁表項:0xf2600000 ~ 0xf27fffff 指向 L3 頁表 (x26)// level 2 table: 0xf2600000 ~ 0xf27fffff, 1 entry, point to level 3_4orr x1, x26, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF2600000            // 虛擬地址范圍起始ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表// 設置 L2 頁表項:F500 0000 - F500 7FFF 指向 L3 頁表 (x27)// level 2 table: F500 0000 - F500 7FFF, 1 entry, point to level 3_5orr x1, x27, #TT_S1_ATTR_TABLE  // 組合 L3 基址和表描述符屬性ldr x2, =0xF5000000            // 虛擬地址范圍起始ubfx x3, x2, #21, #9           // 提取 L2 索引str x1, [x22, x3, lsl #3]      // 寫入 L2 頁表/*0xf1000000 ~ 0xf11fffff  peri                   -----2MB : l2 -> l3 3_10xf2000000 ~ 0xf21fffff  usb                    -----2MB : l2 -> l3 3_20xf2400000 ~ 0xf25fffff peri                     -----2MB : l2 -> l3 3_30xf2600000 ~ 0xf27fffff ddr gic noc acodec      -----0xf2600000 ~ 0xf26fffff 1MB : l2 -> l3 3_4
*/// 填充 L3 頁表 (x23):0xf1000000 ~ 0xf11fffff 區域 (512 個 4KB 頁)// level 3 table: 0xf1000000 ~ 0xf11fffff, 512 entry, x23// valid addr  0xf1000000 ~ 0xf11fffffldr x1, =0x1000                // 頁大小:4KBldr x2, =((0xF11FFFFF + 1 - 0xF1000000) >> 12) // 計算頁數ldr x3, =0xF1000000                        // 物理地址起始// 頁描述符屬性// 設備內存屬性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):0xf2000000 ~ 0xf21fffff 區域 (512 個 4KB 頁)// level 3 table: 0xf2000000 ~ 0xf21fffff,, 512 entry, x24// valid addr  0xf2000000 ~ 0xf21fffffldr x1, =0x1000                 // 頁大小:4KBldr x2, =((0xF21FFFFF + 1 - 0xF2000000) >> 12) // 計算頁數ldr x3, =0xF2000000             // 物理地址起始// 設備內存屬性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):0xf2400000 ~ 0xf25fffff 區域 (512 個 4KB 頁)// level 3 table: 0xf2400000 ~ 0xf25fffff, 512 entry, x25// valid addr  0xf2400000 ~ 0xf25fffffldr x1, =0x1000               // 頁大小:4KBldr x2, =((0xF25FFFFF + 1 - 0xF2400000) >> 12) // 計算頁數ldr x3, =0xF2400000             // 物理地址起始// 設備內存屬性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           		// 循環// 填充 L3 頁表 (x26):0xf2600000 ~ 0xf27fffff 區域 (512 個 4KB 頁)// level 3 table: 0xf2600000 ~ 0xf27fffff, 512 entry, x26// valid addr  0xf2600000 ~ 0xf27fffffldr x1, =0x1000               // 頁大小:4KBldr x2, =((0xF27FFFFF + 1 - 0xF2600000) >> 12) // 計算頁數ldr x3, =0xF2600000             // 物理地址起始// 設備內存屬性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_4:ubfx x5, x3, #12, #9          // 提取頁內索引orr x6, x3, x4               // 組合物理地址和屬性str x6, [x26, x5, lsl #3]      // 存儲到 L3 頁表 (x26)add x3, x3, x1            	// 下一頁subs x2, x2, #1             // 遞減頁計數器bne loop3_4           		// 循環// 填充 L3 頁表 (x27):0xf5000000 ~ 0xf5007fff 區域 (512 個 4KB 頁)// level 3 table: 0xf5000000 ~ 0xf5007fff, 512 entry, x27// valid addr  0xf5000000 ~ 0xf5007fffldr x1, =0x1000               // 頁大小:4KBldr x2, =((0xF5007FFF + 1 - 0xF5000000) >> 12) // 計算頁數ldr x3, =0xF5000000             // 物理地址起始// 設備內存屬性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_5:ubfx x5, x3, #12, #9          // 提取頁內索引orr x6, x3, x4               // 組合物理地址和屬性str x6, [x27, x5, lsl #3]      // 存儲到 L3 頁表 (x27)add x3, x3, x1            	// 下一頁subs x2, x2, #1             // 遞減頁計數器bne loop3_5           		// 循環ret.cfi_endproc

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

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

相關文章

遷港戰平 精神可勝國足

遷港戰平可勝國足 江蘇省城市足球聯賽第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[] …

GIT: 一個用于視覺與語言的生成式圖像到文本轉換 Transformer

摘要 在本文中&#xff0c;我們設計并訓練了一個生成式圖像到文本轉換 Transformer——GIT&#xff0c;以統一視覺-語言任務&#xff0c;如圖像/視頻字幕生成和問答。雖然生成式模型在預訓練和微調之間提供了一致的網絡架構&#xff0c;但現有工作通常包含復雜的結構&#xff…

20250706-9-Docker快速入門(下)-Docker在線答疑_筆記

一、Kubernetes核心概念與集群搭建 1. 在線答疑 &#xfeff; 1&#xff09;答疑Docker需要掌握到什么程度 學習目標&#xff1a;達到入門水平即可&#xff0c;重點掌握第一章Docker入門視頻內容學習建議&#xff1a;預習時間約3-4小時&#xff0c;建議吸收視頻內容的80%學…

Node.js-http模塊

HTTP 協議 概念 HTTP&#xff08;hypertext transport protocol&#xff09;協議&#xff1b;中文叫超文本傳輸協議,是一種基于TCP/IP的應用層通信協議這個協議詳細規定了 瀏覽器 和萬維網 服務器 之間互相通信的規則。協議中主要規定了兩個方面的內容 客戶端&#xff1a;用來…

Java JDBC的初步了解

文章目錄 基本流程注冊驅動的兩種方法DriverManagerDriverManager 的核心作用核心原理自動注冊驅動的機制關鍵方法 示例代碼: 連接Mysql數據庫StatementPreparedStatement JDBC全稱Java DataBase Connectivity。 定義: JDBC 是 Java 語言中用于連接和執行 SQL 操作的標準接口。…

[netty5: ChunkedInput ChunkedWriteHandler]-源碼分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按塊讀取不定長數據流的接口&#xff0c;常配合 ChunkedWriteHandler 實現流式寫入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多種數據源。 實現類簡要說明ChunkedFile用于將常規文件按塊傳輸&#xff08;使用傳統…

QT 第十二講 --- 控件篇 LineEdit,TextEdit與ComboBox

前言&#xff1a;歡迎進入 QT 控件世界的第十二講&#xff01;在上一講《QT 第十一講 --- 控件篇 LCDnumber&#xff0c;ProgressBar與CalenderWidget》中&#xff0c;我們探索了用于信息展示和狀態反饋的控件&#xff1a;精準的數字顯示器 LCD Number、直觀的進度指示器 Progr…

VSCode遇到的一些小毛病(自動保存、運行后光標不再處于編輯區)

1. 右鍵點擊Run Code沒有觸發自動保存 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾選你需要的 2. 運行后光標仍然處于編輯區&#xff08;容易誤輸入&#xff09; 1. 打開 VS Code 設置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.單文件和項目&#xff08;多個 py 文件項目/模塊化&#xff09;# 在編寫代碼時&#xff0c;一般兩種模式&#xff0c;執行單個文件&#xff0c;或者執行一個完成項目&#xff08;包含多個 py 文件或者其它資源文件&#xff09;。 單文件模式&#xff1a;MaixVision 創建或者…

征信系統架構思想:打造商業信任基石_東方仙盟—仙盟創夢IDE

一、建設必要性在復雜的商業環境中&#xff0c;企業面臨多元交易對象與業務場景&#xff0c;準確評估合作方信用狀況及潛在價值的難度顯著增加。傳統經驗判斷和簡單背景調查存在局限性&#xff0c;難以滿足現代商業決策需求&#xff0c;因此構建科學的征信體系具有現實必要性。…

網安-XSS-pikachu

介紹 XSS&#xff0c;即跨站腳本攻擊&#xff0c;是指攻擊者利用Web服務器中的代碼漏洞&#xff0c;在頁面中嵌入客戶端腳本&#xff08;通常是一段由JavaScript編寫的惡意代碼&#xff09;&#xff0c;當信任此Web服務器的用戶訪問 Web站點中含有惡意腳本代碼的頁面&#xff…

算法入門——字典樹(C++實現詳解)

字典樹&#xff08;Trie&#xff09;是處理字符串匹配的高效數據結構&#xff0c;廣泛應用于搜索提示、拼寫檢查等場景。本文將帶你從零掌握字典樹的原理與實現&#xff01; 一、什么是字典樹&#xff1f; 字典樹&#xff08;Trie&#xff09;是一種樹形數據結構&#xff0c;…

SpringBoot整合SpringCache緩存

SpringBoot整合SpringCache使用緩存 文章目錄SpringBoot整合SpringCache使用緩存1.介紹2.SpringBoot整合1.導入xml依賴2.配置yml3.使用EnableCaching啟用SpringCache4.Cacheable5.CachePut6.CacheEvict7. Caching8.CacheConfig3.其他屬性配置1.keyGenerator 屬性2. cacheManage…

WPF學習筆記(20)Button與控件模板

Button與控件模板一、 Button默認控件模板詳解二、自定義按鈕模板一、 Button默認控件模板詳解 WPF 中的大多數控件都有默認的控件模板。 這些模板定義了控件的默認外觀和行為&#xff0c;包括控件的布局、背景、前景、邊框、內容等。 官方文檔&#xff1a;https://learn.mic…

藍天居士自傳(1)

藍天居士何許人&#xff1f; 藍天居士是我的筆名&#xff0c;也可以說是號。就好像李白號青蓮居士、歐陽修號六一居士一樣。筆者本名彭昊 —— 一個有不少重名重姓者的名字。 筆者小的時候上語文課&#xff0c;無論是小學、初中抑或是高中&#xff0c;都會有魯迅&#xff08;…

短劇系統開發定制全流程解析:從需求分析到上線的專業指南

一、短劇行業數字化趨勢與系統開發必要性在短視頻內容爆發式增長的時代背景下&#xff0c;短劇作為一種新興的內容形式正在迅速崛起。數據顯示&#xff0c;2023年中國短劇市場規模已突破300億元&#xff0c;用戶規模達到4.5億&#xff0c;年增長率超過200%。這一迅猛發展的市場…

getBoundingClientRect() 詳解:精準獲取元素位置和尺寸

getBoundingClientRect() 是 JavaScript 中一個強大的 DOM API&#xff0c;用于獲取元素在視口中的精確位置和尺寸信息。它返回一個 DOMRect 對象&#xff0c;包含元素的坐標、寬度和高度等關鍵幾何信息。 基本用法 const element document.getElementById(myElement); cons…

EXCEL 基礎技巧

來源&#xff1a;WPS 官網 初步了解WPS表格-WPS學堂https://www.wps.cn/learning/course/detail/id/635.html 1、格式刷 1.1使用格式刷隔行填充顏色。 首先設置部分表格顏色&#xff0c;選中此區域&#xff0c;雙擊點擊格式刷&#xff0c;然后選中其他表格區域。 這樣就可以…