编号

类型

信创硬件及国产化硬件

信创及国产化软件

领域

算法应用场景

算法名称

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度(时间复杂度、空间复杂度、逻辑复杂度)及时序流程图、通信图、架构图

满足的用户/管理员规模

关联知识和法律法规

1

适配方法

华为鲲鹏920处理器(ARMv8架构)、飞腾FT-2000/4(ARMv8)

银河麒麟V10(内核5.10)、达梦DM8数据库、OpenSSL 1.1.1(国密补丁)

信息安全

信创环境下文件传输过程中的国密SM4-CBC加密与解密,替代国际AES算法

SM4-CBC加密适配算法(基于OpenSSL国密引擎)

函数列表与逐步推理
1. sm4_key_expansion(key):将128bit密钥扩展为32个32bit轮密钥。
- 数学表达式:rk[i] = key ^ FK[i] (i=0..3),然后迭代 rk[i] = rk[i-4] ^ T'(rk[i-3] ^ rk[i-2] ^ rk[i-1] ^ CK[i-4])
- 参数:key[16]字节数组 → 转为4个32bit字,FK固定常量,CK固定常量。
- 代码(C语言片段):
c<br> void sm4_key_expansion(const uint8_t *key, uint32_t rk[32]) {<br> uint32_t k[36];<br> for(int i=0;i<4;i++) k[i]=GET_UINT32_BE(key,i) ^ FK[i];<br> for(int i=4;i<36;i++){<br> uint32_t tmp = k[i-3]^k[i-2]^k[i-1]^CK[i-4];<br> k[i] = k[i-4] ^ sm4_tau(tmp); // T'变换<br> }<br> for(int i=0;i<32;i++) rk[i]=k[i+4];<br> }<br>
- 复杂度:时间O(32),空间O(32 * 4B)。

2. sm4_encrypt_block(input, output, rk):加密一个128bit块。
- 数学表达式:32轮迭代 X_{i+1} = X_i ^ T(X_{i+1} ^ X_{i+2} ^ X_{i+3} ^ rk[i]),最后反序输出。
- 参数:input[16]字节,output[16]rk[32]
- 代码:
c<br> void sm4_encrypt_block(const uint8_t *in, uint8_t *out, const uint32_t rk[32]) {<br> uint32_t x[36];<br> for(int i=0;i<4;i++) x[i]=GET_UINT32_BE(in,i);<br> for(int i=0;i<32;i++){<br> uint32_t tmp = x[i+1]^x[i+2]^x[i+3]^rk[i];<br> x[i+4] = x[i] ^ sm4_l(sm4_tau(tmp)); // L线性变换<br> }<br> for(int i=0;i<4;i++) PUT_UINT32_BE(out,i,x[35-i]);<br> }<br>
- 复杂度:时间O(32),空间O(36 * 4B)。

3. sm4_cbc_encrypt(plaintext, iv, key, ciphertext, len):CBC模式加密。
- 数学表达式:C_0 = IV, C_i = E(P_i XOR C_{i-1})
- 参数:plaintext指针,长度len(16倍数),iv[16],key[16]。
- 调用关系:先key_expansion,再逐块调用encrypt_block。
- 复杂度:时间O(n32),空间O(16+32)。

时序流程图(文字描述):
- 步骤1: 用户发起文件上传 → 应用层调用加密API
- 步骤2: 加载国密引擎(OpenSSL ENGINE)→ 初始化SM4上下文
- 步骤3: 设置IV和Key → 调用sm4_cbc_encrypt
- 步骤4: 对每个明文块:前一块密文与明文异或 → SM4加密 → 写入输出流
- 步骤5: 加密完成后返回密文文件


通信图(文字描述):
- 客户端(银河麒麟) ↔ 加密模块(SM4库) ↔ 存储服务(达梦DB或文件系统)
- 加密模块内部:主控 → 密钥扩展单元 → 轮函数单元(S盒+L变换)


架构图*(文字描述):
- 应用层(文件传输工具)→ 中间件(OpenSSL国密封装)→ 驱动层(Kunpeng加速指令/NEON优化)→ 硬件层(鲲鹏CPU)
- 其中SM4算法利用ARMv8的SM4专用指令(如SM4E)实现加速,无需纯软件实现。

单机支持1000并发用户,管理规模≤50台服务器

《中华人民共和国密码法》、《GM/T 0002-2012 SM4分组密码算法》、《GB/T 39786-2021 信息安全技术 信息系统密码应用基本要求》、信创目录(2023版)

编号

类型

信创硬件及国产化硬件

信创及国产化软件

领域

算法应用场景

算法名称

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度(时间复杂度、空间复杂度、逻辑复杂度)及时序流程图、通信图、架构图

满足的用户/管理员规模

关联知识和法律法规

1

适配方法

华为鲲鹏920(ARMv8,支持FEAT_SM3/FEAT_SM4指令)、飞腾FT-2000+/64

银河麒麟V10、统信UOS、Tongsuo(铜锁)国密库、GmSSL

信息安全/传输层

信创环境下HTTPS/国密SSL通道建立,实现SM2/SM3/SM4套件协商,替代RSA+SHA256+AES组合

国密SSL握手协商算法(基于Tongsuo)

函数列表与调用关系
1. gm_ssl_negotiate(client_hello):发送客户端支持的国密套件列表
- 数学表达式:ClientHello.cipher_suites = {ECC-SM2-SM4-CBC-SM3, ECC-SM2-SM4-GCM-SM3}
- 参数:cipher_suite_list[2],优先级排序
- 代码:
c<br> int gm_ssl_negotiate(SSL *s) {<br> // 构造ClientHello,cipher_suites首选项为国密套件<br> s->cipherlist = "ECC-SM2-SM4-CBC-SM3:ECC-SM2-SM4-GCM-SM3";<br> return SSL_connect(s);<br> }<br>
- 复杂度:时间O(1),空间O(套件列表长度)

2. sm2_server_key_exchange():服务端SM2公钥下发
- 数学表达式:ServerKx = SM2_Encap(sk_S, rand) → (C, tag),其中C为封装的预主密钥
- 参数:sk_S(服务端SM2私钥),rand(32字节随机数)
- 代码:
c<br> int sm2_server_key_exchange(EC_KEY *svr_key, unsigned char *out, size_t *outlen) {<br> // SM2密钥交换协议,生成预主密钥封装<br> return SM2_KEX_encap(svr_key, out, outlen);<br> }<br>
- 复杂度:时间O(1)(固定基点乘法),空间O(64B)

3. sm3_cert_verify(cert, signature):SM3证书链验证
- 数学表达式:verify = SM2_Verify(SM3(cert.tbs), sig, PK) == 1
- 参数:cert(X.509证书DER编码),signature(SM2签名值64字节)
- 复杂度:时间O(log n)(模幂运算),空间O(证书大小)

4. sm4_gcm_encrypt(plaintext, key, iv, aad):应用数据传输加密
- 数学表达式:C = SM4_GCM_Enc(K, IV, P, AAD) → (Ciphertext, Tag[16])
- 参数:key[16],iv[12],aad(附加认证数据)
- 复杂度:时间O(n/16 × 32轮),空间O(n + 16)

时序流程图
<br>Client → Server: ClientHello(国密套件)<br>Server → Client: ServerHello + Certificate(SM2) + ServerKeyExchange(SM2 KEX)<br>Client → Server: ClientKeyExchange(SM2封装预主密钥) + [ChangeCipherSpec] + Finished(SM3 MAC)<br>Server → Client: [ChangeCipherSpec] + Finished(SM3 MAC)<br>双方 → : SM4-GCM加密应用数据<br>

通信图
<br>信创客户端(统信UOS+Tongsuo) ↔ 国密SSL网关(鲲鹏920+海光CSV) ↔ 后端服务(银河麒麟+达梦DB)<br>

单机鲲鹏920支持≥10000并发TLS连接;管理规模≤200台服务器,管理员按"三员分立"(系统管理员/安全保密员/安全审计员)配置3人

《密码法》、《商用密码管理条例》、GB/T 39786-2021《信息系统密码应用基本要求》、GM/T 0024-2014 SSL VPN技术规范、T/GCC 3006—2025《基于Arm架构计算平台的软硬件兼容性认证技术要求》

2

适配方法

龙芯3A5000(LoongArch)、龙芯3C5000L服务器

统信UOS LoongArch版、金仓KingBase V9、BouncyCastle国密Provider

数据迁移/数据库

Oracle→金仓数据库迁移过程中的SQL兼容扫描、结构转换、增量同步与SM2/SM3/SM4国密能力嵌入

Oracle兼容迁移与国密增强算法(金仓方案)

函数列表与调用关系
1. sql_compat_scan(oracle_sql):Oracle SQL语法兼容性扫描
- 数学表达式:compat_score = Σ(w_i × match_i) / Σw_i,其中match_i∈{0,1}
- 参数:oracle_sql(源SQL文本),权重w_i按语法特性分配
- 代码:
java<br> public CompatResult sql_compat_scan(String oracleSql) {<br> CompatScanner scanner = new KingbaseCompatScanner();<br> return scanner.scan(oracleSql); // 返回兼容率与改写建议<br> }<br>
- 复杂度:时间O(n)(n=SQL长度),空间O(n)

2. struct_convert(oracle_ddl):表结构转换
- 数学表达式:Kingbase_DDL = f(Oracle_DDL),f为类型映射函数
- 关键映射:VARCHAR2→VARCHAR,NUMBER(p,s)→NUMERIC(p,s),DATE→TIMESTAMP
- 复杂度:时间O(m)(m=对象数),空间O(m)

3. incremental_sync(src, dst, scn):增量数据同步
- 数学表达式:ΔD = D_src[scn:t] − D_dst[scn],通过LogMiner抽取Redo日志
- 参数:scn(源系统变更号),batch_size=1000行/批
- 代码:
java<br> public long incremental_sync(long lastScn, int batchSize) {<br> List<ChangeRow> changes = logMiner.extract(lastScn, batchSize);<br> return kingbaseWriter.apply(changes);<br> }<br>
- 复杂度:时间O(k log k)(k=变更行数,含排序),空间O(batchSize)

4. sm4_tde_encrypt(tablespace, key):表空间级透明加密
- 数学表达式:Page_cipher = SM4_CBC(Page_plain, K_table, IV_page),IV由页号派生
- 参数:K_table(由HSM托管的表空间密钥),IV=HMAC_SM3(page_no)[0:16]
- 复杂度:时间O(pages × 32轮),空间O(页大小16KB)

5. sm2_mutual_auth(client_cert, server_cert):SM2双向证书认证
- 数学表达式:Auth = SM2_Verify(SM3(client_cert.tbs), client_sig, server_PK) ∧ SM2_Verify(SM3(server_cert.tbs), server_sig, client_PK)
- 复杂度:时间O(log n)(双模幂),空间O(128B)

时序流程图
<br>评估期: SQL兼容扫描 → 性能基线建模 → 密评差距识别<br>迁移期: 结构迁移 → 数据迁移 → 增量同步 → 双轨比对 → 灰度切流<br>验证期: 数据一致性检查 → 事务完整性验证 → 密评项逐项确认<br>运维期: 图形化监控 → 统一告警<br>

架构图
<br>Oracle(Redo日志) → 异构同步中间件 → 金仓KingBase(龙芯3C5000L)<br> ↓<br> SM4-TDE存储层(HSM密钥托管)<br> ↓<br> 应用层(统信UOS, BouncyCastle国密)<br>

浙江省人民医院LIS系统案例:迁移周期缩短至2周;支持中小机构单机部署至大型集团双中心多集群;满足等保三级及以上

《密码法》、GB/T 39786-2021、GB/T 37988-2019《数据安全能力成熟度模型》、Oracle兼容性与国密加密协同规范

3

适配方法

华为麒麟芯片(ARM架构)、部分龙芯LoongArch终端

HarmonyOS(鸿蒙)、统信UOS移动版、科蓝鸿蒙国密SSL通讯组件

移动端/政务App

政务类App的APK加固与国密算法分层调用:SM3代码完整性、SM4本地存储加密、SM2/SM3/SM4通信套件

政务App国密分层适配算法

函数列表与调用关系
1. sm3_integrity_check(apk_bytes):APK完整性校验(防篡改)
- 数学表达式:H = SM3(apk_bytes),校验时比较H == H_stored
- 参数:apk_bytes(APK文件字节数组),H_stored(预埋SM3摘要256bit)
- 代码:
java<br> public boolean sm3_integrity_check(byte[] apkBytes, byte[] storedHash) {<br> SM3Digest sm3 = new SM3Digest();<br> byte[] computed = new byte[32];<br> sm3.update(apkBytes, 0, apkBytes.length);<br> sm3.doFinal(computed, 0);<br> return Arrays.equals(computed, storedHash);<br> }<br>
- 复杂度:时间O(n/64 × 68轮迭代)(n=文件字节),空间O(64B+32B)

2. sm4_local_encrypt(sensitive_data, key, iv):本地敏感数据加密
- 数学表达式:C = SM4_CBC(P, K, IV),P为配置文件/缓存明文
- 参数:key[16](由设备指纹派生),iv[16](随机生成并存储于TrustZone)
- 复杂度:时间O(m/16 × 32轮)(m=数据长度),空间O(m+16)

3. sm2_sm3_sm4_handshake():与服务端国密SSL握手
- 数学表达式:同编号1的握手流程,但运行于鸿蒙环境
- 关键差异:调用鸿蒙国密加密SDK(科蓝方案)
- 复杂度:同编号1

时序流程图
<br>App启动 → SM3完整性自检 → 检测通过 → SM4解密本地配置<br> → 发起国密SSL握手(SM2/SM3/SM4) → 建立加密通道 → 业务通信<br> → 检测失败 → 触发防篡改响应(退出/告警)<br>

通信图
<br>鸿蒙App(麒麟芯片+国密SDK) ↔ 国密SSL网关(鲲鹏服务器) ↔ 后端微服务(统信UOS)<br>

单终端App内存占用≤80MB;服务端单机(鲲鹏920)支持≥5000移动端长连接;管理规模按政务系统"三员分立"配置

《密码法》、GB/T 39786-2021、GM/T 0002-2012(SM4)、GM/T 0003-2012(SM2)、GM/T 0004-2012(SM3)、《国家政务信息化项目建设管理办法》

4

适配方法

飞腾S2500(ARMv8,支持FEAT_SM3/FEAT_SM4)、海光C86 7285(集成SM4内存加密)

银河麒麟V10、BouncyCastle国密Provider、达梦DM8

数据完整性/密码应用

信创环境下数据完整性校验:SM3替代SHA-256用于日志哈希、文件指纹、数字签名摘要

SM3哈希适配算法(ARMv8 FEAT_SM3指令加速)

函数列表与调用关系
1. sm3_init(state):初始化SM3上下文
- 数学表达式:state = {IV0=0x7380166F, IV1=0x4914B2B9, ..., IV7=0x47BB8943}
- 参数:state[8](32bit字数组)
- 代码:
c<br> void sm3_init(uint32_t state[8]) {<br> state[0]=0x7380166F; state[1]=0x4914B2B9;<br> state[2]=0x172442D7; state[3]=0xDA8A0600;<br> state[4]=0xA96F30BC; state[5]=0x163138AA;<br> state[6]=0xE38DEE4D; state[7]=0xB0FB0E4E;<br> }<br>
- 复杂度:时间O(1),空间O(32B)

2. sm3_compress(state, block):压缩单个512bit块
- 数学表达式:
- 消息扩展:W_j = P_1(W{j-16} ⊕ W{j-9} ⊕ (W{j-3}<<15)) ⊕ (W{j-13}<<7) ⊕ W{j-6},j=16..67
- 迭代:SS1 = ((A<<12) + E + (T_j<<j%32)) << 7
- SS2 = SS1 ⊕ (A<<12)
- TT1 = FF_j(A,B,C) + D + SS2 + W'
j
- TT2 = GG_j(E,F,G) + H + SS1 + W_j
- 状态更新:B=FF_j(A,B,C),...,A=TT1,E=TT2
- 参数:block[64],T_j常量(j<16时0x79CC4519,否则0x7A879D8A)
- 复杂度:时间O(64步×常数),空间O(96字)≈384B

3. sm3_final(state, data_len):输出最终256bit摘要
- 数学表达式:padding = data ∥ '1' ∥ 0^k ∥ length(64bit),填充后分块压缩
- 参数:data_len(原始数据比特长度)
- 复杂度:时间O(1),空间O(64B)

ARMv8 FEAT_SM3硬件加速
c<br>// 使用ARMv8 SM3指令(若CPU支持FEAT_SM3)<br>uint32x4_t sm3_hw_accelerate(uint32x4_t state, uint8x16_t block) {<br> // 单指令完成一轮SM3压缩<br> return vsm3c(state, block, 0); // SM3C指令<br>}<br>
海光C86集成SM4内存加密,性能损耗<1%

时序流程图
<br>输入数据流 → SM3_Init → 分块SM3_Compress(FEAT_SM3硬件加速)<br> → SM3_Final → 256bit摘要输出<br> → 与预期哈希比对(日志完整性/文件指纹验证)<br>

架构图
<br>应用层(达梦DB日志模块) → 中间件(BouncyCastle国密Provider)<br> → 驱动层(ARMv8 FEAT_SM3指令/海光SM4内存加密)<br> → 硬件层(飞腾S2500/海光C86)<br>

单机(飞腾S2500 64核)SM3吞吐≥5 Gbps;日志审计场景支持日增10亿条日志哈希;管理规模≤100台服务器

《密码法》、GB/T 39786-2021、《数据安全法》、GB/T 37973-2019《大数据安全管理指南》(操作日志留存≥1年,共享日志≥3年)

5

适配方法

申威SW64架构服务器、兆芯ZX-C+系列

中科方德服务器OS、达梦DM8、Tongsuo国密库

跨架构二进制适配/兼容层

ARM/LoongArch/X86_64/申威多架构下的二进制翻译与系统调用适配,实现"一次开发、多架构运行"

跨架构二进制翻译适配算法

函数列表与调用关系
1. arch_detect():运行时架构识别
- 数学表达式:arch = decode(cpuid/auxv AT_HWCAP)
- 参数:无,读取ELF auxv向量
- 代码:
c<br> int arch_detect() {<br> unsigned long hwcap = getauxval(AT_HWCAP);<br> if (hwcap & HWCAP_SM3) return ARCH_ARM_V8_SM3;<br> if (hwcap & HWCAP_LOONGARCH) return ARCH_LOONGARCH;<br> return ARCH_X86_64; // 默认<br> }<br>
- 复杂度:时间O(1),空间O(8B)

2. binary_translate(src_insn, tgt_arch):指令集翻译
- 数学表达式:tgt_insn = T(src_insn),T为指令映射函数
- X86→ARM:将x86 CISC指令翻译为ARM RISC指令序列
- 参数:src_insn(源机器码),tgt_arch(目标架构枚举)
- 复杂度:时间O(i)(i=指令数),空间O(i × 平均扩展比)

3. syscall_adapt(syscall_nr, args):系统调用号适配
- 数学表达式:new_nr = map[src_arch][tgt_arch][syscall_nr]
- 关键映射:x86_64 syscall 0 → ARM64 svc 0(execve)
- 复杂度:时间O(1)查表,空间O(映射表大小)

4. lib_wrap(symbol):国密库符号重定向
- 数学表达式:resolve("EVP_sm4_cbc") → Tongsuo实现地址
- 参数:symbol(符号名字符串)
- 复杂度:时间O(log n)(n=符号表大小),空间O(1)

时序流程图
<br>X86二进制程序 → 加载器(arch_detect) → 若为异架构:<br> → binary_translate逐函数翻译 → syscall_adapt重写系统调用<br> → lib_wrap重定向国密库调用 → 执行<br>若为同架构: 直接加载执行<br>

通信图
<br>应用程序 → 兼容层(二进制翻译+syscall适配) → 国密库(Tongsuo)<br> → 操作系统(中科方德) → 硬件(申威SW64/兆芯)<br>

二进制翻译性能损耗≤15%(申威SW64);单机支持≥500并发翻译进程;管理规模≤50台异构服务器

T/GCC 3006—2025《基于Arm架构计算平台的软硬件兼容性认证技术要求》、《信创产品适配清单》要求、安全可靠测评要求

6

适配方法

华为TaiShan 200(鲲鹏920)、智能密码钥匙(USB Key,国密认证)

银河麒麟V10、Tongsuo、达梦DM8、JDK国密版

密码基础设施/密钥管理

国密证书全生命周期管理:申请→签发→部署→轮换→吊销,结合HSM/USB Key硬件密钥保护

国密证书管理与密钥生命周期算法

函数列表与调用关系
1. sm2_keygen():SM2密钥对生成
- 数学表达式:d ∈ [1, n-1]随机,P = d·G(G为SM2推荐曲线基点)
- 参数:曲线参数(p=0xFFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC)
- 代码:
c<br> EC_KEY *sm2_keygen() {<br> EC_KEY *key = EC_KEY_new_by_curve_name(NID_sm2);<br> EC_KEY_generate_key(key); // 硬件实现时调用USB Key API<br> return key;<br> }<br>
- 复杂度:时间O(log n)(模逆运算),空间O(密钥大小)

2. sm2_sign(msg, d):SM2数字签名
- 数学表达式:
- e = SM3(Z_A ∥ M)(Z_A为用户标识哈希)
- (r,s) = Sign(d, e):r = (e + x_1) mod n,s = ((1+d_A)^{-1} × (k - r·d_A)) mod n
- 参数:msg(待签消息),d(私钥)
- 复杂度:时间O(log n)(模幂+模逆),空间O(64B)

3. sm2_verify(msg, sig, P):SM2签名验证
- 数学表达式:
- t = (r+s) mod n ≠ 0
- (x_1,y_1) = s·G + t·P
- R = (e + x_1) mod n,验证R == r
- 参数:sig=(r,s),P(公钥)
- 复杂度:时间O(log n)(双标量乘),空间O(64B)

4. cert_chain_validate(cert, ca_store):证书链验证
- 数学表达式:∀i: SM2_Verify(SM3(cert_i.tbs), cert_i.sig, cert_{i+1}.PK) == 1
- 参数:cert(终端实体证书),ca_store(可信CA链)
- 复杂度:时间O(L × log n)(L=链长度),空间O(L×证书大小)

5. key_rotation(old_key, rotation_period):密钥轮换
- 数学表达式:new_key = SM2_KeyGen(),旧密钥进入吊销列表(CRL)
- 参数:rotation_period=90天(默认)
- 复杂度:时间O(1),空间O(CRL大小)

时序流程图
<br>密钥申请 → HSM/USB Key生成SM2密钥对(私钥不出硬件)<br> → CA签发SM2证书 → 部署至Tongsuo证书库<br> → 服务启用国密SSL → 90天到期触发轮换<br> → 旧证书加入CRL → 新证书生效<br>

架构图
<br>应用层(达梦DB) → 中间件(Tongsuo国密Provider) → 密钥管理层(HSM/USB Key)<br> ↓<br> 证书生命周期管理(申请/签发/轮换/吊销)<br> ↓<br> 硬件层(鲲鹏920 TaiShan + USB Key)<br>

单机HSM支持≥1000 TPS签名请求;证书体系支持10万用户规模;管理按"密钥管理员/密码安全审计员/密码操作员"三员分立

《密码法》、《商用密码管理条例》、《商用密码应用安全性评估量化评估规则》、《信息系统密码应用高风险判定指引》、GB/T 39786-2021(密钥管理、人员管理章节)

7

适配方法

飞腾FT-2000+/64、华为昇腾310P(AI加速)

银河麒麟V10、统信UOS、Tongsuo、达梦DM8、国密KMS

异构算力调度/AI信创

信创环境下AI推理任务的算力调度与国密保护:将AI推理请求路由至最优国产算力节点,并对模型权重进行SM4加密存储、SM2签名验证

异构算力调度与模型国密保护算法

函数列表与调用关系
1. node_capability_probe(node_list):算力节点探测
- 数学表达式:score_i = w_1·CPU_freq_i + w_2·GPU_TFLOPS_i + w_3·(1/latency_i)
- 参数:w=[0.3, 0.5, 0.2],node_list(鲲鹏/昇腾/飞腾节点列表)
- 复杂度:时间O(N)(N=节点数),空间O(N)

2. task_schedule(task, node_scores):任务调度决策
- 数学表达式:selected = argmax_i(score_i × affinity(task, node_i))
- 亲和性:NLP任务偏好昇腾NPU,通用计算偏好鲲鹏CPU
- 复杂度:时间O(N),空间O(1)

3. model_weight_decrypt(encrypted_weights, key):模型权重SM4解密
- 数学表达式:W = SM4_CBC_Dec(Cipher_W, K_model, IV_model)
- 参数:K_model由KMS托管,IV_model由模型元数据提供
- 复杂度:时间O(s/16 × 32轮)(s=权重张量大小),空间O(s)

4. model_signature_verify(model_blob, sig, pk):模型完整性SM2验证
- 数学表达式:valid = SM2_Verify(SM3(model_blob), sig, pk)
- 参数:model_blob(模型文件),sig(64字节SM2签名)
- 复杂度:时间O(log n),空间O(模型大小)

5. inference_pipeline(input, model, node):推理流水线
- 数学表达式:output = Model_Forward(Decrypt(model.weights), input)
- 调用关系:schedule → weight_decrypt → verify → forward
- 复杂度:时间O(模型计算量FLOPs),空间O(激活值)

时序流程图
<br>推理请求 → node_capability_probe → task_schedule(选最优节点)<br> → model_weight_decrypt(SM4) → model_signature_verify(SM2/SM3)<br> → inference_pipeline(昇腾/鲲鹏) → 返回结果<br>

通信图
<br>客户端 → 调度网关(鲲鹏920) → KMS(密钥管理, SM2/SM4)<br> → AI节点1(昇腾310P, 模型SM4解密后推理)<br> → AI节点2(飞腾FT-2000+, 通用推理)<br>

调度网关单机支持≥1000 QPS推理请求路由;AI节点单卡(昇腾310P)支持10亿参数级模型本地部署;管理规模≤50台AI服务器,管理员3人(三员分立)

《密码法》、GB/T 39786-2021、《数据安全法》、GB 42250-2022《网络安全专用产品安全技术要求》、《国家政务信息化项目建设管理办法》

8

适配方法

海光C86 7285(x86指令集兼容,集成SM4内存加密)、兆芯KX-6000

统信UOS、银河麒麟V10、达梦DM8、金仓KingBase、Tongsuo

数据迁移/存储加密

信创环境数据迁移全流程:从X86传统架构迁移至信创硬件,数据脱敏、完整性校验、SM4透明加密、不可逆销毁

数据迁移与全生命周期保护算法

函数列表与调用关系
1. data_classification(data):数据分类分级
- 数学表达式:level = f(sensitivity, business_impact),level∈{公开, 内部, 涉密, 核心}
- 参数:sensitivity[0-3],business_impact[0-3]
- 复杂度:时间O(1),空间O(1)

2. data_masking(data, level):数据脱敏
- 数学表达式:masked = Mask(data, policy[level])
- 策略:涉密级→全掩码,核心级→SM4加密+哈希
- 代码:
java<br> public String data_masking(String data, int level) {<br> switch(level) {<br> case 3: return SM4_Encrypt(data, key); // 核心级<br> case 2: return hash(data); // 涉密级<br> default: return data.charAt(0) + "***"; // 部分掩码<br> }<br> }<br>
- 复杂度:时间O(n)(n=数据长度),空间O(n)

3. integrity_check(source, target):迁移数据完整性校验
- 数学表达式:SM3(source) == SM3(target) ? pass : fail
- 参数:source/target(数据块)
- 复杂度:时间O(m)(m=数据块大小),空间O(32B)

4. sm4_tde_storage(data, tablespace_key):表空间透明加密
- 数学表达式:C = SM4_CBC(data, K_ts, IV_row),IV_row = HMAC_SM3(row_id)[0:16]
- 海光C86硬件SM4加密损耗<1%
- 复杂度:时间O(p/16 × 32轮)(p=页大小),空间O(16KB)

5. irreversible_destroy(data):不可逆销毁
- 数学表达式:data ← Random_Overwrite(data, 7-pass),符合DoD 5220.22-M
- 参数:pass_count=7
- 复杂度:时间O(n),空间O(block_size)

时序流程图
<br>数据梳理分类分级 → 迁移前脱敏 → 结构迁移 → 数据迁移<br> → 增量同步 → 完整性校验(SM3) → SM4-TDE落盘<br> → 双轨比对 → 灰度切流 → 旧数据不可逆销毁<br>

架构图
<br>X86源库 → 数据迁移工具(脱敏+校验) → 信创目标库(海光C86+达梦DM8)<br> ↓<br> SM4-TDE存储层(海光硬件加密)<br> ↓<br> 密钥管理(KMS, SM2/SM4)<br>

单机(海光C86 64核)数据迁移吞吐≥1 GB/s;支持TB级数据迁移;管理规模≤100台服务器,管理员3人(三员分立)

《密码法》、GB/T 39786-2021、《数据安全法》、GB/T 37988-2019、GB/T 37973-2019、《国家政务信息化项目建设管理办法》(操作日志留存≥1年,共享日志≥3年)

📌 补充说明

  1. 规模数据:表中"满足的用户/管理员规模"为基于典型信创项目案例的设计参考值(如浙江省人民医院LIS系统迁移案例仅用2周完成密评整改),实际规模需根据硬件配置和业务负载实测确定。

  2. 复杂度说明:所有算法的时间复杂度均已标注渐进界,ARMv8 FEAT_SM3/FEAT_SM4硬件指令可使SM3/SM4性能提升3-5倍,海光C86集成SM4内存加密技术可将性能损耗控制在1%以内。

  3. 法律法规:所有方案必须满足《密码法》《数据安全法》《网络安全法》三位一体要求,并通过商用密码应用安全性评估(密评),等保2.0三级及以上标准。

  4. 三员分立:信创环境强制要求系统管理员、安全保密员、安全审计员三人分立,且密码安全审计员不得与密钥管理员、密码操作员兼任。

  5. 国密库选型:官方OpenSSL不支持国密算法,必须替换为Tongsuo(铜锁,已列入信创生态产品名录)或GmSSL;Java应用需使用国密兼容JDK或集成BouncyCastle国密Provider。


信创软硬件适配方法与算法示例

核心方法:​ 动态二进制翻译 (Dynamic Binary Translation, DBT)


编号

1

类型

基础适配

信创硬件及国产化硬件

鲲鹏920 (ARMv8) / 飞腾S2500 (ARMv8)

信创及国产化软件

统信UOS / 麒麟V10 + QEMU/KVM虚拟化层

领域

系统软件迁移

算法应用场景

将x86架构的Linux应用程序(如MySQL、Nginx)无缝迁移到ARM架构的信创服务器上运行,无需修改源代码。

算法名称

基本块翻译与优化 (Basic Block Translation & Optimization)


算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度(时间复杂度、空间复杂度、逻辑复杂度)及时序流程图、通信图、架构图
a. translate_block(x86_pc)

功能:从x86程序计数器(PC)开始,解码指令直到遇到分支指令,形成一个基本块。

数学表达式

输入:x86_pc (地址)。

输出:tb (TranslationBlock结构体),包含pc_start, pc_end, ir_list (中间表示列表)。

函数调用关系:被主循环调用,内部调用decode_inst()

参数x86_pc: uint64_t, 当前指令地址。

参数数值设计:例如 x86_pc = 0x400100

伪代码

TranslationBlock* translate_block(uint64_t x86_pc) {
    tb = new TranslationBlock;
    tb->pc_start = x86_pc;
    while (!is_branch_inst(x86_pc)) {
        IR ir = decode_inst(x86_pc); // 调用b函数
        tb->ir_list.append(ir);
        x86_pc += get_inst_length(ir);
    }
    // 处理最后一条分支指令
    IR branch_ir = decode_inst(x86_pc);
    tb->ir_list.append(branch_ir);
    tb->pc_end = x86_pc;
    return tb;
}

复杂度

  • 时间复杂度 O(n)

  • 空间复杂度 O(n)

  • 逻辑复杂度:中等(需处理指令边界和分支判断)

    n为基本块内指令数。


b. decode_inst(x86_pc)

功能:读取x86机器码,解析成内部中间表示(IR)。

数学表达式

输入:x86_pc

输出:IR结构体,包含opcode, operands[]

函数调用关系:被translate_block调用。

参数x86_pc: uint64_t。

参数数值设计:读取内存中4字节数据,如 0x89 E5 (mov ebp, esp)。

伪代码

IR decode_inst(uint64_t x86_pc) {
    uint32_t raw_code = read_mem(x86_pc, 4);
    IR ir;
    // 复杂的查表或模式匹配逻辑
    if ((raw_code & 0xFF) == 0x55) { // push rbp
        ir.opcode = OP_PUSH;
        ir.operands[0] = REG_RBP;
    } else if (...) { ... }
    return ir;
}

复杂度

  • 时间复杂度 O(1)

  • 空间复杂度 O(1)

  • 逻辑复杂度:高(x86指令集庞大复杂)


c. optimize_and_gen_arm(tb)

功能:将IR列表优化并生成ARM指令序列。

数学表达式

输入:tb (IR列表)。

输出:arm_code_buffer (ARM机器码数组)。

函数调用关系:被主循环调用,内部调用liveness_analysis(), register_allocation(), emit_arm_inst()

参数tb: TranslationBlock*。

参数数值设计:假设IR列表有3条指令,需要分配ARM寄存器r0-r3来模拟x86的eax, ebx等。

伪代码

void optimize_and_gen_arm(TranslationBlock *tb) {
    // 1. 死代码消除
    liveness_analysis(tb->ir_list); 
    // 2. 常量折叠
    constant_folding(tb->ir_list);
    // 3. 寄存器分配 (将x86虚拟寄存器映射到ARM物理寄存器)
    reg_map = register_allocation(tb->ir_list); 
    // 4. 发射ARM指令
    for (IR ir : tb->ir_list) {
        emit_arm_inst(ir, reg_map);
    }
}

复杂度

  • 时间复杂度 O(m²) (依赖寄存器分配算法)

  • 空间复杂度 O(m)

  • 逻辑复杂度:非常高(涉及编译原理优化技术)

    m为IR指令数。


d. execute_translated_block(tb, arm_cpu_state)

功能:执行生成的ARM代码块,并更新CPU状态(寄存器、内存)。

数学表达式

输入:tb, arm_cpu_state

输出:无,但状态被修改。

函数调用关系:被主循环调用。

参数tb: TranslationBlock, arm_cpu_state: CPUState

参数数值设计:设置ARM PC寄存器指向生成的代码缓冲区起始地址。

伪代码

void execute_translated_block(TranslationBlock *tb, CPUState *env) {
    // 定义一个函数指针,指向生成的ARM代码
    void (*gen_code)(void*) = (void(*)(void*)) tb->arm_code_buffer;
    // 执行它,传入CPU状态上下文
    gen_code(env); 
    // 执行完后,根据tb中的分支信息,计算下一个x86 PC
    env->next_x86_pc = compute_next_pc(tb, env);
}

复杂度

  • 时间复杂度 O(1) (执行时间取决于代码块大小)

  • 空间复杂度 O(1)

  • 逻辑复杂度:低


时序流程图 (Mermaid)
sequenceDiagram
    participant MainLoop as 主循环
    participant Translator as 翻译器
    participant Executor as 执行器
    participant ARM_CPU as ARM CPU
    
    MainLoop->>Translator: 1. 获取下一个x86_PC
    Translator->>Translator: 2. translate_block(x86_PC)
    Translator->>Translator: 3. 循环decode_inst()形成IR列表
    Translator->>Translator: 4. optimize_and_gen_arm() 生成ARM代码
    Translator-->>MainLoop: 返回TranslationBlock
    MainLoop->>Executor: 5. 执行execute_translated_block()
    Executor->>ARM_CPU: 6. 跳转到ARM代码缓冲区执行
    ARM_CPU-->>Executor: 7. 执行完毕,返回控制权
    Executor-->>MainLoop: 8. 返回下一个x86_PC
    MainLoop->>MainLoop: 9. 重复步骤1
通信图 (Mermaid)
graph LR
    A[x86 Guest App] --> B{DBT Engine (QEMU)};
    B --> C[Basic Block Dispatcher];
    C --> D[Translator Module];
    D --> E[Code Cache];
    E --> F[Execution Module];
    F --> G[ARM Host CPU];
    G --> H[Guest State (Regs/Mem)];
    H --> F;
    F --> C;
架构图 (Mermaid)
graph TD
    subgraph 用户态
        App[x86 Application]
    end
    subgraph 内核态 (KVM/QEMU)
        DBT[DBT Core]
        TCGT[TCG (Tiny Code Generator)]
        MMU[SoftMMU (内存管理单元)]
    end
    subgraph 硬件层
        ARM_CPU[ARM CPU (鲲鹏/飞腾)]
        RAM[RAM]
    end
    App --> DBT
    DBT --> TCGT
    TCGT --> MMU
    MMU --> ARM_CPU
    MMU --> RAM

满足的用户/管理员规模

单机支持数百并发连接;通过集群扩展可支持数千至数万用户。

关联知识和法律法规

关联知识:计算机体系结构 (x86 vs ARM)、编译原理 (中间表示、寄存器分配)、操作系统原理 (进程调度、内存管理)。

法律法规:《网络安全法》、《关键信息基础设施安全保护条例》、GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》。


重要说明

  1. 完整性限制:上述示例仅为框架性展示,真实的DBT引擎(如QEMU的TCG)代码量超过百万行,包含了极其复杂的指令解码表、多种优化pass和异常处理机制。完整的“函数列表及每个函数...”无法在此处穷举。

  2. 代码真实性:提供的伪代码旨在说明算法流程,并非可直接编译运行的QEMU源码。真实的decode_inst函数是一个巨大的switch-case或查表函数。

  3. 复杂度:给出的复杂度是简化后的理论值。实际系统中,由于缓存、TLB缺失等因素,性能表现会复杂得多。

  4. 其他适配方法:除了DBT,还有静态二进制翻译(一次性翻译整个程序)、API兼容层(如Wine用于运行Windows程序)、源码级移植(最彻底,但工作量最大)等方法,它们各有适用场景和算法特点。

每条均结合国产化芯片指令集(LoongArch64 / ARM64 / SW64 / x86_64)与引导程序(昆仑BIOS/UEFI、U-Boot、OpenSBI、PMON)给出可落地设计。

💡 说明:以下内容为信创适配工程设计框架,函数以伪代码/可运行骨架呈现,数值参数为典型工程取值示例,而非某款商用产品的完整源码。国产化芯片与固件生态依据昆仑固件在龙芯、飞腾、申威、海光、兆芯、鲲鹏等全系列处理器上的适配实践,以及国产 U-Boot 作为"开机第一程序"衔接硬件与操作系统的定位。


编号 01

类型

指令集异构适配 · 基础层

信创硬件及国产化硬件

龙芯 3A6000/3C6000(LoongArch64)、飞腾 S5000C/腾锐 D2000(ARMv8)、鲲鹏 920(ARMv8)、申威 1622(SW64)、海光 C86-4G/兆芯 KX-8000(x86_64)

信创及国产化软件

统信 UOS、银河麒麟 V10、OpenEuler、龙蜥 Anolis

领域

异构指令集 · 架构抽象

算法应用场景

同一份操作系统基线需在上述 5 种 ISA 上运行,通过架构抽象层隔离指令集敏感逻辑。

算法名称

异构指令集特征检测与架构抽象层分发算法(ISA-Feature Detection & HAL Dispatch)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度及时序流程图、通信图、架构图

推理思路

  1. 上电后 Bootloader 把设备树(DTB)或 ACPI 表传给内核,内核第一步要判定当前 ISA。

  2. 通过读取 CPUID/CPUID-like 寄存器(ARM: MIDR_EL1;LoongArch: CPUCFG;x86: CPUID leaf 0)得到 ISA 指纹。

  3. 将指纹映射到 HAL 分发表,后续所有原子操作、内存屏障、加解密加速均走对应后端。

函数调用关系hal_init()isa_detect()hal_dispatch_table_build()hal_install_syscalls()

a. isa_detect() — ISA 指纹提取

  • 输入:void* cpuinfo_page(由引导程序映射的 CPU 信息页)

  • 输出:isa_id ∈ {LOONGARCH64=1, ARM64=2, SW64=3, X86_64=4}

  • 数学表达式:isa_id=f(MIDR_EL1, CPUCFG[0], CPUID_leaf0)

  • 参数数值设计:cpuinfo_page 物理地址 0x4000_0000,长度 4KB

  • 伪代码:

int isa_detect(void *cpuinfo_page) {
    uint64_t m = read_sysreg(MIDR_EL1);      // ARM: 0x48xxxxxx 飞腾/鲲鹏
    uint32_t l = loongarch_cpucfg(0);        // LoongArch: bit31..24 = 'L' 'A'
    if ((m >> 24) == 0x48) return ISA_ARM64;
    if ((l & 0xFF000000) == 0x4C000000) return ISA_LOONGARCH64;
    if (sw64_get_impl() > 0) return ISA_SW64;
    return ISA_X86_64;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:低

b. hal_dispatch_table_build() — 构建 HAL 函数指针表

  • 输入:int isa_id

  • 输出:struct hal_ops* ops(含 32 个函数指针)

  • 伪代码:

struct hal_ops* hal_dispatch_table_build(int isa_id) {
    struct hal_ops *ops = kmalloc(sizeof(*ops));
    switch (isa_id) {
    case ISA_LOONGARCH64:
        ops->mb = loongarch_mb; ops->cas = la_cas;
        ops->aes_enc = la_aes_enc; /* 国密/LSX加速 */
        break;
    case ISA_ARM64:
        ops->mb = arm64_dmb; ops->cas = arm64_ldaxr_stlxr;
        ops->aes_enc = arm64_aes_ce; /* ARMv8 Crypto Extension */
        break;
    /* ... SW64, X86_64 分支 */
    }
    return ops;
}
  • 时间复杂度 O(k)(k=32,ISA 相关后端数量),空间复杂度 O(k),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

isa_detect

O(1)

O(1)

hal_dispatch_table_build

O(k)

O(k)

hal_install_syscalls

O(n)

O(n)

(n 为系统调用数,典型值 350)

时序流程图

BootROM → 昆仑BIOS/UEFI → U-Boot → Kernel
                                      │
                                      ▼
                              hal_init()
                                      │
                 ┌────────────────────┼────────────────────┐
                 ▼                    ▼                    ▼
          isa_detect()     hal_dispatch_table_build()   hal_install_syscalls()
                 │                    │                    │
                 └────────────────────┼────────────────────┘
                                      ▼
                              内核继续启动

通信图

[Bootloader] --DTB/ACPI--> [Kernel HAL Core] --dispatch--> [ISA-specific Backend]
                                                        ├─ LoongArch Backend
                                                        ├─ ARM64 Backend
                                                        ├─ SW64 Backend
                                                        └─ x86_64 Backend

架构图

┌──────────────────────────────────────────────┐
│              应用程序 / 容器                   │
├──────────────────────────────────────────────┤
│          系统调用接口 (SCI)                   │
├──────────────────────────────────────────────┤
│      硬件抽象层 HAL (hal_ops 分发表)          │
│   ┌────────┬────────┬────────┬──────────┐    │
│   │LoongArc│ ARM64 │ SW64  │ x86_64   │    │
│   │ h64    │       │       │          │    │
│   └────────┴────────┴───────┴──────────┘    │
├──────────────────────────────────────────────┤
│   昆仑BIOS / UEFI / U-Boot / OpenSBI         │
├──────────────────────────────────────────────┤
│   国产 CPU (龙芯/飞腾/鲲鹏/申威/海光/兆芯)    │
└──────────────────────────────────────────────┘

满足的用户/管理员规模

单集群可纳管 5 种 ISA 混合节点 ≥ 1000 台;单机上支持多容器跨 ISA 运行(通过 qemu-user-static + binfmt_misc)

关联知识和法律法规

  • 关联知识:计算机体系结构、编译原理(后端代码生成)、CPU micro-architecture

  • 法律法规:GB/T 29827-2013《信息安全技术 可信计算规范 可信平台主板功能接口》、等保 2.0


编号 02

类型

固件与启动栈协同 · 基础层

信创硬件及国产化硬件

龙芯 3C6000 服务器、飞腾 S5000C 服务器(均配备昆仑 BIOS V4.0)

信创及国产化软件

昆仑 BIOS V4.0(符合 UEFI/PI 规范)+ 统信 UOS Server / 银河麒麟 Server

领域

固件 · 多 CPU 架构引导

算法应用场景

昆仑 BIOS 作为"点亮中国计算机的第一段代码",需在龙芯、飞腾、申威、海光、兆芯、鲲鹏等多样处理器上完成硬件初始化并引导国产 OS。

算法名称

多处理器架构统一框架引导算法(Unified Firmware Framework Boot, UFB²)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

昆仑 BIOS 采用四层互联固件模型,通过同一架构支撑多处理器平台;模块化设计让处理器、芯片组、外设驱动、安全可信等作为独立模块按需加载。

a. kunlun_uefi_entry() — 昆仑 BIOS 主入口

  • 输入:无(BootROM 跳转至此,寄存器状态由 SoC 定义)

  • 输出:永不返回,最终 jmp 到 OS Loader

  • 伪代码:

void kunlun_uefi_entry(void) {
    sec_phase();          /* SEC: 建立临时栈, 使能cache */
    pei_phase();          /* PEI: 内存初始化, 找到主存 */
    dxe_phase();          /* DXE: 加载驱动, 枚举PCIe */
    bl_phase();           /* BootLoader: 加载 grub.efi */
}
  • 时间复杂度 O(1)(各阶段内部为线性),空间复杂度 O(m)(m 为已加载模块数),逻辑复杂度:高

b. pei_module_dispatch() — PEI 阶段按 ISA 分发模块

  • 输入:uint32_t isa_tag

  • 输出:EFI_STATUS

  • 伪代码:

EFI_STATUS pei_module_dispatch(uint32_t isa_tag) {
    switch (isa_tag) {
    case ISA_LOONGARCH64:
        return LoadLoongArchPeiModules(); /* TLB init, 异常向量 */
    case ISA_ARM64:
        return LoadArm64PeiModules();     /* MMU enable, GIC init */
    case ISA_SW64:
        return LoadSw64PeiModules();      /* 自研PEI模块 */
    }
}
  • 时间复杂度 O(p)(p 为该 ISA 下 PEI 模块数,典型 8-16 个),空间复杂度 O(p),逻辑复杂度:高

复杂度汇总

函数

时间

空间

逻辑

kunlun_uefi_entry

O(1)

O(m)

pei_module_dispatch

O(p)

O(p)

dxe_driver_load

O(d·log d)

O(d)

(d 为 DXE 驱动数,典型 60-120)

时序流程图

上电 → BootROM → SEC → PEI → DXE → BDS → OS Loader → 统信UOS/麒麟
         │        │      │      │      │       │
         │        │      │      │      │       └─ 引导grub.efi
         │        │      │      │      └─ 枚举PCIe, 加载驱动
         │        │      │      └─ 内存初始化
         │        │      └─ 按ISA分发PEI模块
         │        └─ 建立栈, 使能Cache
         └─ 第一段代码入口

通信图

[BootROM] → [SEC Core] → [PEI Dispatcher] → [DXE Dispatcher]
                                                │
                        ┌───────────────────────┼───────────────────────┐
                        ▼                       ▼                       ▼
                [LoongArch Modules]    [ARM64 Modules]         [SW64/x86 Modules]
                        │                       │                       │
                        └───────────────────────┼───────────────────────┘
                                                ▼
                                        [OS Loader (grub.efi)]

架构图

┌────────────────────────────────────────────────┐
│                 统信UOS / 银河麒麟              │
├────────────────────────────────────────────────┤
│              OS Loader (grub.efi)              │
├────────────────────────────────────────────────┤
│                 昆仑BIOS V4.0                   │
│  ┌──────────────────────────────────────────┐  │
│  │  BDS  │  DXE  │  PEI  │  SEC            │  │
│  └──────────────────────────────────────────┘  │
│  ┌──────────────────────────────────────────┐  │
│  │  模块化: Processor/ Chipset/ Driver/ TCM │  │
│  └──────────────────────────────────────────┘  │
├────────────────────────────────────────────────┤
│  硬件: 龙芯/飞腾/申威/海光/兆芯/鲲鹏          │
└────────────────────────────────────────────────┘

满足的用户/管理员规模

单机;通过 BMC 可远程带外管理 ≥ 4096 台服务器节点

关联知识和法律法规

  • 关联知识:UEFI/PI 规范、可信计算 3.0、国密 SM2/SM3/SM4

  • 法律法规:GB/T 38638-2020《信息安全技术 可信计算规范 可信计算体系结构》、等保 2.0


编号 03

类型

板级引导适配 · 嵌入式/终端层

信创硬件及国产化硬件

飞腾 D2000 桌面终端、龙芯 3A6000 桌面、瑞芯微 RK3588(ARM64,作为对照)

信创及国产化软件

国产 U-Boot(基于开源 U-Boot 二次开发,自主可控)

领域

Bootloader · 板级适配

算法应用场景

U-Boot 作为"嵌入式设备的开机第一程序",需针对本土芯片进行专项开发,初始化 CPU/内存/存储/外设,加载 Linux 内核并移交控制权。

算法名称

国产 U-Boot 多架构板级适配与设备树重写算法(Multi-Arch U-Boot DT Rewrite)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. U-Boot 第一阶段(SPL)需在 SRAM 中运行,完成 DDR 训练。

  2. 第二阶段 U-Boot 主体从 Flash 加载到 DDR,解析 DTB,重写时钟/电源节点适配具体板级。

  3. 飞腾平台需注意内存映射差异,确保 64KB 物理页内 4KB 页属性一致。

a. spl_dram_init() — DDR 初始化

  • 输入:struct dram_params* p(由板级 board.cfg 提供)

  • 输出:int ret(0 成功)

  • 参数数值设计:DDR4-3200,容量 16GB,2 ranks,每 rank 8 banks

  • 伪代码:

int spl_dram_init(struct dram_params *p) {
    phy_train(p);                 /* DDR PHY 训练 */
    set_timing_regs(p);           /* 写时序寄存器 */
    for (int i = 0; i < p->ranks; i++) {
        ddr_cmd(ACTIVATE_ALL_BANKS, i);
        ddr_cmd(ZQ_CALIBRATION, i);
    }
    return 0;
}
  • 时间复杂度 O(r·b)(r=rank 数,b=bank 数),空间复杂度 O(1),逻辑复杂度:高

b. ft_dtb_rewrite() — 飞腾平台 DTB 重写

  • 输入:void* dtb_blob

  • 输出:int ret

  • 伪代码:

int ft_dtb_rewrite(void *dtb_blob) {
    /* 飞腾: 修正64KB页表对齐 */
    fixup_memory_node(dtb_blob, 0x80000000, 0x400000000ULL);
    /* 修正 GIC 重定向 */
    fixup_gic_redist(dtb_blob, 0x84000000);
    /* 修正 PCIe ECAM 基地址 */
    fixup_pcie_ecam(dtb_blob, 0xe0000000);
    return 0;
}
  • 时间复杂度 O(n)(n 为 DTB 节点数,典型 200-500),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

spl_dram_init

O(r·b)

O(1)

ft_dtb_rewrite

O(n)

O(1)

bootm_load_kernel

O(s/B)

O(B)

(s 为内核镜像大小,B 为块大小 512B)

时序流程图

BootROM → SPL (SRAM) → U-Boot (DDR) → bootm → Linux Kernel
   │         │             │              │        │
   │         │             │              │        └─ 移交控制权
   │         │             │              └─ 加载Image + DTB到内存
   │         │             └─ DTB重写, 外设初始化
   │         └─ DDR训练, 时钟初始化
   └─ 跳转SPL

通信图

[BootROM] → [SPL] → [U-Boot]
                        │
          ┌─────────────┼─────────────┐
          ▼             ▼             ▼
     [DRAM Init]   [DTB Rewrite]  [Storage Read]
          │             │             │
          └─────────────┼─────────────┘
                        ▼
                 [Linux Kernel Image]

架构图

┌─────────────────────────────────┐
│           Linux Kernel           │
├─────────────────────────────────┤
│     国产 U-Boot (SPL + U-Boot)    │
│  ┌─────────────────────────────┐ │
│  │ board/ 飞腾D2000 龙芯3A6000 │ │
│  ├─────────────────────────────┤ │
│  │ arch/ ARM64 LoongArch       │ │
│  ├─────────────────────────────┤ │
│  │ drivers/ 国产物料驱动        │ │
│  └─────────────────────────────┘ │
├─────────────────────────────────┤
│  SoC: 飞腾D2000 / 龙芯3A6000    │
└─────────────────────────────────┘

满足的用户/管理员规模

嵌入式/工业控制单节点;支持工业网关、智能终端、轨道交通设备

关联知识和法律法规

  • 关联知识:DDR 训练算法、Device Tree 规范、ARM Trusted Firmware 协同

  • 法律法规:《关键信息基础设施安全保护条例》


编号 04

类型

RISC-V 引导链适配 · 专用层

信创硬件及国产化硬件

奕斯伟 EIC770x RISC-V SoC(可作为信创 RISC-V 路线参照)

信创及国产化软件

OpenSBI + U-Boot 组合镜像 fw_payload.bin

领域

Bootloader · M-mode/S-mode 切换

算法应用场景

RISC-V 架构采用 OpenSBI(M-mode)作为标准二进制接口,屏蔽底层硬件差异,U-Boot 作为二级 Bootloader 桥接 OpenSBI 与 Linux Kernel(S-mode)。

算法名称

OpenSBI + U-Boot 链式引导装配算法(RISC-V M/S Mode Chain Boot)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

BootROM → OpenSBI (M-mode) → U-Boot (S-mode) → Kernel (S-mode)。OpenSBI 通过 SBI 接口为上层提供统一的系统服务。

a. opensbi_init() — OpenSBI 入口

  • 输入:unsigned long hart_id, void* fdt_addr

  • 输出:永不返回

  • 伪代码:

void opensbi_init(unsigned long hart_id, void *fdt_addr) {
    sbi_init(hart_id);              /* 设置M-mode trap vector */
    fdt_parse(fdt_addr);            /* 解析DTB获取内存/CPU拓扑 */
    platform_early_init();          /* 平台早期初始化 */
    sbi_hart_switch_mode(hart_id, 0, (unsigned long)uboot_entry,
                         SBI_HART_SMODE, fdt_addr);
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

b. fw_payload_assemble() — 组合镜像装配

  • 数学表达式:fw_payload=OpenSBIM−mode​∥U-BootS−mode​

  • 参数数值设计:OpenSBI 加载地址 0x80000000,U-Boot 加载地址 0x80200000

  • 伪代码:

void fw_payload_assemble(const char* opensbi, const char* uboot,
                         const char* fdt, char* out) {
    memcpy(out, opensbi, SBI_SIZE);
    memcpy(out + SBI_SIZE, uboot, UBOOT_SIZE);
    /* 写入 fdt 到预定偏移 */
    memcpy(out + FDT_OFFSET, fdt, fdt_size());
}
  • 时间复杂度 O(s)(s 为镜像总大小),空间复杂度 O(1),逻辑复杂度:低

复杂度汇总

函数

时间

空间

逻辑

opensbi_init

O(1)

O(1)

fw_payload_assemble

O(s)

O(1)

sbi_hart_switch_mode

O(1)

O(1)

时序流程图

BootROM → OpenSBI(M-mode) → U-Boot(S-mode) → Kernel(S-mode)
   │            │               │               │
   │            │               │               └─ 系统启动
   │            │               └─ 加载Image, 跳转Kernel
   │            └─ 解析DTB, 切换到S-mode
   └─ 加载fw_payload.bin到0x80000000

通信图

[BootROM] → [OpenSBI] ↔ [U-Boot] ↔ [Linux Kernel]
              ↑                    ↑
              └─ SBI Calls ────────┘

架构图

┌──────────────────────────────┐
│         Linux Kernel          │ S-mode
├──────────────────────────────┤
│         U-Boot                │ S-mode
├──────────────────────────────┤
│         OpenSBI               │ M-mode
├──────────────────────────────┤
│  硬件: RISC-V EIC770x SoC    │
└──────────────────────────────┘

满足的用户/管理员规模

嵌入式/RISC-V 单节点

关联知识和法律法规

  • 关联知识:RISC-V 特权架构 v1.12、SBI 规范 v2.0

  • 法律法规:等保 2.0(RISC-V 平台同样适用)


编号 05

类型

硬件资源解析适配 · 系统层

信创硬件及国产化硬件

飞腾 S5000C(ARM64,ACPI 平台)、龙芯 3C6000(LoongArch,ACPI+DTB 双模)

信创及国产化软件

统信 UOS Server、银河麒麟 V10 Server

领域

固件接口 · ACPI/SMBIOS

算法应用场景

飞腾平台常因 ACPI 表不完整导致电源管理失效;需解析并校验 ACPI 表的完整性,补全缺失的 PSS/CST 对象。

算法名称

ACPI 表完整性校验与补丁算法(ACPI Integrity Check & Patch)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 从 RSDP → RSDT/XSDT → 各表(DSDT/FADT/MADT/...)逐级遍历。

  2. 对每个表计算校验和,与 OEM 表头中的 checksum 比对。

  3. 若关键表(如 FADT 中 _CST 对象)缺失,从固件补丁库注入。

a. acpi_walk_tables() — 遍历 ACPI 表

  • 输入:struct acpi_rsdp* rsdp

  • 输出:struct acpi_table_list* list

  • 伪代码:

struct acpi_table_list* acpi_walk_tables(struct acpi_rsdp *rsdp) {
    struct acpi_table_list *list = kzalloc(sizeof(*list));
    void *xsdt = phys_to_virt(rsdp->xsdt_phys);
    int n = (xsdt_header->length - sizeof(struct acpi_table_header)) / 8;
    for (int i = 0; i < n; i++) {
        void *tbl = phys_to_virt(((uint64_t*)xsdt)[i]);
        if (acpi_verify_checksum(tbl) != 0) {
            pr_err("ACPI table %s checksum fail\n", tbl->signature);
            continue;
        }
        list->tables[list->count++] = tbl;
    }
    return list;
}
  • 时间复杂度 O(t)(t 为 ACPI 表数量,典型 20-40),空间复杂度 O(t),逻辑复杂度:中

b. acpi_patch_fadt_cst() — 补全 _CST 对象

  • 输入:struct fadt* fadt

  • 输出:int ret

  • 伪代码:

int acpi_patch_fadt_cst(struct fadt *fadt) {
    if (!aml_object_exists(fadt->dsdt, "_CST"))
        aml_inject_object(fadt->dsdt, patch_cst_template);
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

acpi_walk_tables

O(t)

O(t)

acpi_verify_checksum

O(s)

O(1)

acpi_patch_fadt_cst

O(1)

O(1)

(s 为单表大小)

时序流程图

内核启动 → 定位RSDP → 遍历XSDT → 校验每个表 → 补全缺失对象 → 构建ACPI命名空间
                                                          ↓
                                                    正常电源管理

通信图

[Kernel] ↔ [ACPI Core] ↔ [Table Parser] ↔ [AML Interpreter]
                                          ↑
                                   [Patch Library]

架构图

┌────────────────────────────────────┐
│            OS Power Manager         │
├────────────────────────────────────┤
│            ACPI Core                │
│   ┌──────────────────────────────┐  │
│   │ RSDP → XSDT → DSDT/FADT/... │  │
│   └──────────────────────────────┘  │
├────────────────────────────────────┤
│   昆仑BIOS ACPI Tables              │
├────────────────────────────────────┤
│   飞腾S5000C / 龙芯3C6000          │
└────────────────────────────────────┘

满足的用户/管理员规模

单机;集群场景下可统一管理 ACM(ACPI 兼容管理)策略

关联知识和法律法规

  • 关联知识:ACPI 6.3 规范、AML 字节码解释器

  • 法律法规:GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》


编号 06

类型

二进制翻译/ABI 兼容 · 运行层

信创硬件及国产化硬件

龙芯 3A6000(LoongArch,内置 LBT 二进制翻译扩展)

信创及国产化软件

LATX(LoongArch 二进制翻译器)、统信 UOS

领域

指令集翻译 · 应用兼容

算法应用场景

龙芯 LoongArch 平台需运行 x86/ARM 遗留程序,通过二进制翻译(如 LATX)兼容 x86 应用。

算法名称

基本块动态二进制翻译与优化算法(Dynamic Binary Translation, DBT)

此条承接上一轮对话,此处结合龙芯 LBT 硬件扩展进一步细化。

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 利用龙芯 LBT 硬件扩展,将 x86 的某些指令直接映射为 LoongArch 等价指令,减少纯软件解码开销。

  2. 基本块(Basic Block)为单位翻译,配合代码缓存(Code Cache)。

  3. 热点基本块通过优化 pass 提升翻译质量。

a. dbt_lookup_cache() — 代码缓存查找

  • 输入:uint64_t guest_pc

  • 输出:host_addr(已翻译的主机代码地址,NULL 表示未命中)

  • 数学表达式:hit=∃ entry∈Cache, entry.guestp​c=guest_pc

  • 参数数值设计:Cache 大小 16MB,2-way 组相联,共 8192 个 bucket

  • 伪代码:

void* dbt_lookup_cache(uint64_t guest_pc) {
    int idx = hash(guest_pc) & (CACHE_BUCKETS - 1);
    for (int way = 0; way < 2; way++) {
        struct cache_entry *e = &cache[idx].ways[way];
        if (e->guest_pc == guest_pc && e->valid)
            return e->host_addr;
    }
    return NULL;
}
  • 时间复杂度 O(1)(均摊),空间复杂度 O(C)(C=Cache 容量),逻辑复杂度:中

b. dbt_translate_block() — 基本块翻译

  • 输入:uint64_t guest_pc

  • 输出:TranslationBlock* tb

  • 伪代码:

TranslationBlock* dbt_translate_block(uint64_t guest_pc) {
    TB = alloc_tb();
    int la_insn_cnt = 0;
    while (!is_branch(guest_pc)) {
        x86_insn insn = x86_decode(guest_pc);
        /* 优先利用LBT硬件映射 */
        if (lbt_can_map(insn))
            la_insn_cnt += lbt_emit(TB, insn);
        else
            la_insn_cnt += tcg_translate(TB, insn);
        guest_pc += insn.len;
    }
    TB->la_insn_cnt = la_insn_cnt;
    return TB;
}
  • 时间复杂度 O(n·k)(n 为基本块指令数,k 为单指令翻译平均开销),空间复杂度 O(n),逻辑复杂度:非常高

c. dbt_main_loop() — 翻译器主循环

  • 伪代码:

void dbt_main_loop(uint64_t pc) {
    while (running) {
        void *host = dbt_lookup_cache(pc);
        if (!host) {
            TranslationBlock *tb = dbt_translate_block(pc);
            host = tb->host_code;
            dbt_cache_insert(tb);
        }
        pc = ((host_func)host)(guest_cpu_state);
    }
}
  • 时间复杂度 O(1)(每次调度),空间复杂度 O(1),逻辑复杂度:低

复杂度汇总

函数

时间

空间

逻辑

dbt_lookup_cache

O(1)均摊

O(C)

dbt_translate_block

O(n·k)

O(n)

非常高

dbt_main_loop

O(1)

O(1)

时序流程图

┌────────────────────────────────────────────────────┐
│                   DBT Main Loop                     │
│                                                    │
│   ┌──────────┐     hit?     ┌──────────────────┐   │
│   │ Lookup   │──────────────►│ Execute Host    │   │
│   │ Cache    │              │ Code            │   │
│   └────┬─────┘              └────────┬─────────┘   │
│        │ miss                        │ return next  │
│        ▼                             │ pc           │
│   ┌──────────┐                       │              │
│   │ Translate│◄──────────────────────┘              │
│   │ Basic Blk│                                      │
│   └────┬─────┘                                      │
│        │                                             │
│        ▼                                             │
│   ┌──────────┐                                       │
│   │ Insert   │                                       │
│   │ Cache    │                                       │
│   └──────────┘                                       │
└────────────────────────────────────────────────────┘

通信图

[x86 Guest Binary] → [DBT Engine] → [LoongArch Host CPU]
                          │
            ┌─────────────┼─────────────┐
            ▼             ▼             ▼
       [Code Cache]  [LBT Hardware]  [TCG IR]

架构图

┌────────────────────────────────────────┐
│            x86 Application              │
├────────────────────────────────────────┤
│         DBT Engine (LATX)               │
│  ┌──────────────────────────────────┐  │
│  │ Code Cache │ LBT Emit │ TCG IR  │  │
│  └──────────────────────────────────┘  │
├────────────────────────────────────────┤
│   龙芯3A6000 (LoongArch + LBT扩展)     │
└────────────────────────────────────────┘

满足的用户/管理员规模

单机运行 x86 遗留应用;通过集群可支撑数百并发用户

关联知识和法律法规

  • 关联知识:动态二进制翻译、基本块、TCG 中间表示、龙芯 LBT 扩展

  • 法律法规:《网络安全法》、《关键信息基础设施安全保护条例》


编号 07

类型

外设驱动匹配 · 驱动层

信创硬件及国产化硬件

飞腾 S5000C 服务器(PCIe 4.0)、国产 RAID 卡、国产 GPU(如景嘉微)

信创及国产化软件

统信 UOS Server、银河麒麟 V10 Server

领域

设备驱动 · PCIe 枚举与匹配

算法应用场景

工业级外设常因寄存器映射不规范、中断触发方式特殊导致 OS 无法识别;昆仑 BIOS 通过固件虚拟化技术在国产平台上模拟 X86 指令集,完成显卡、网卡、RAID 等关键高端外设的适配。

算法名称

PCIe 设备枚举与驱动匹配算法(PCIe Enumeration & Driver Match)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 从 Root Complex 出发 DFS 遍历 PCIe 树。

  2. 每个 Function 读取 Vendor ID/Device ID,查 compatible 表或 ACPI _DSM。

  3. 匹配到驱动后调用 probe()

a. pcie_enumerate() — PCIe 枚举

  • 输入:struct pci_bus* bus

  • 输出:int dev_count

  • 伪代码:

int pcie_enumerate(struct pci_bus *bus) {
    int count = 0;
    for (int dev = 0; dev < 32; dev++) {
        for (int fn = 0; fn < 8; fn++) {
            uint32_t vid = pci_read(bus, dev, fn, 0);
            if (vid == 0xFFFFFFFF) continue;  /* 空设备 */
            uint32_t did = pci_read(bus, dev, fn, 2);
            struct pci_dev *pdev = pci_alloc_dev(bus, dev, fn, vid, did);
            pci_setup_device(pdev);
            if (fn == 0 && (vid & 0x00800000))  /* 多功能设备 */
                continue;
            /* 递归枚举下游桥 */
            if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE)
                pcie_enumerate(pdev->subordinate);
            count++;
        }
    }
    return count;
}
  • 时间复杂度 O(b·d·f)(b 为桥层级,d=32,f=8),空间复杂度 O(b·d·f),逻辑复杂度:高

b. pci_match_driver() — 驱动匹配

  • 输入:struct pci_dev* pdev

  • 输出:struct pci_driver* drv(NULL 表示无匹配)

  • 伪代码:

struct pci_driver* pci_match_driver(struct pci_dev *pdev) {
    list_for_each_entry(drv, &pci_driver_list, node) {
        /* 1. 精确匹配 VID:DID */
        if (drv_match_viddid(drv, pdev->vendor, pdev->device))
            return drv;
        /* 2. 匹配 class code */
        if (drv_match_class(drv, pdev->class))
            return drv;
        /* 3. 匹配 ACPI _HID */
        if (drv_match_acpi_hid(drv, pdev->acpi_hid))
            return drv;
    }
    return NULL;
}
  • 时间复杂度 O(m)(m 为驱动数,典型 200-500),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

pcie_enumerate

O(b·256)

O(b·256)

pci_match_driver

O(m)

O(1)

pci_setup_device

O(1)

O(1)

时序流程图

PCIe Root Complex
      │
      ▼
┌─────────────┐
│ DFS Enumerate│──────────────────────────────┐
└─────────────┘                              │
      │                                      │
      ▼                                      ▼
┌─────────────┐                      ┌──────────────┐
│ Match Driver │◄──── 驱动列表 ──────│ 注册 pci_driver│
└─────────────┘                      └──────────────┘
      │
      ▼
┌─────────────┐
│ drv->probe() │
└─────────────┘

通信图

[PCIe Device] ↔ [PCI Subsystem] ↔ [Driver Core]
                                         ↑
                                [Driver List (200-500)]

架构图

┌────────────────────────────────────────┐
│           OS Driver Core               │
├────────────────────────────────────────┤
│        PCI Subsystem                   │
│   ┌────────────────────────────────┐   │
│   │ Enumeration │ Match │ Bind     │   │
│   └────────────────────────────────┘   │
├────────────────────────────────────────┤
│   昆仑BIOS (ACPI/DT 提供设备信息)       │
├────────────────────────────────────────┤
│   PCIe Root Complex (飞腾S5000C)       │
│      ├── 国产 RAID 卡                   │
│      ├── 国产 GPU (景嘉微)              │
│      └── 网卡                           │
└────────────────────────────────────────┘

满足的用户/管理员规模

单机可挂 256 个 PCIe 设备;集群通过 BMC 统一管理

关联知识和法律法规

  • 关联知识:PCIe 5.0 规范、ACPI _DSM 方法

  • 法律法规:GB/T 22239-2019 等保 2.0


编号 08

类型

可信启动度量 · 安全层

信创硬件及国产化硬件

飞腾 S5000C(内置 TCM/TPCM)、龙芯 3C6000(内置可信协处理器)

信创及国产化软件

昆仑可信 BIOS(昆仑 BIOS + 可信计算 3.0)

领域

可信计算 · 启动链度量

算法应用场景

昆仑 BIOS 通过可信计算技术实现对计算机的可信度量,防止关键硬件与核心软件被替换或篡改;支持 TPM/TCM/TPCM 等多种可信硬件模块。

算法名称

启动链逐级可信度量算法(Chain of Trust Measurement, CoTM)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. CRTM(Core Root of Trust Measurement)在 BootROM 阶段固化。

  2. 每一级引导组件在被执行前,先对其镜像做 SM3 哈希, extend 到 TPM PCR。

  3. 度量值形成信任链:CRTM → UEFI → U-Boot → grub → Kernel → Initramfs。

a. tpm_extend_pcr() — PCR 扩展

  • 输入:uint32_t pcr_idx, uint8_t* digest(32B SM3)

  • 输出:EFI_STATUS

  • 数学表达式:PCRi​←SM3(PCRi​∥digest)

  • 参数数值设计:PCR 0-7 用于 SRTM,PCR 8-15 用于 DRTM;SM3 输出 32 字节

关于龙芯 LBT(Loongson Binary Translation)扩展,结合公开的 LoongArch 架构手册与 Linux 内核补丁,这里把它的硬件机制、内核支持、以及与 LATX 的关系一次讲透。

LBT 在 LoongArch 体系里的定位

LBT 是 LoongArch 的扩展部分之一,与 LVZ(虚拟化)、LSX/LASX(向量)并列。龙芯架构参考手册明确:LBT 扩展"用于提升跨指令系统二进制翻译在龙芯架构平台上的执行效率",它在基础指令集之上扩展,同时包含非特权指令集和特权指令集两个部分

从 LoongArch 架构参考手册可以看出,LBT 的设计目标是"提升跨指令系统二进制翻译在龙芯架构平台上的执行效率"。

LBT 硬件暴露了哪些专用资源

这是 LBT 最关键的部分,Linux 6.6 内核补丁给出了确切定义。LBT 为二进制翻译新增了一组专用寄存器资源

  • 4 个临时寄存器 scr0 ~ scr3(scratch registers)

  • x86/ARM 的 eflags 寄存器(标志位整体映射)

  • x87 FPU 栈指针 ftop(x87 floating point stack top)

内核补丁原文:"Loongson Binary Translation (LBT) is used to accelerate binary translation, which contains 4 scratch registers (scr0 to scr3), x86/ARM eflags (eflags) and x87 fpu stack pointer (ftop)"。

此外,LBT 扩展在 CPUCFG2 寄存器中暴露了三个独立的子能力标志位

标志位

含义

CPUCFG2_LBT_X86 (bit 18)

x86 二进制翻译扩展

CPUCFG2_LBT_ARM (bit 19)

ARM 二进制翻译扩展

CPUCFG2_LBT_MIPS (bit 20)

MIPS 二进制翻译扩展

这意味着一颗物理 CPU 可以同时支持三种源架构的翻译加速,二进制翻译器可以按 elf_hwcap 里的 HWCAP_LOONGARCH_LBT_X86/ARM/MIPS 逐一探测、按需启用。

内核侧如何管理 LBT 上下文

LBT 的寄存器属于线程级状态,内核必须在上下文切换、信号处理、异常处理时正确保存/恢复。Linux 6.6 的补丁做了三件事:

1. 使能控制

通过 CSR_EUENCSR_EUEN_LBTEN 位控制 LBT 硬件单元的开关,enable_lbt() / disable_lbt() 操作该位。

2. 懒启用(Lazy Enable)机制

仿照 FPU 的做法——上下文切换时不立即保存/恢复 LBT 寄存器,而是等到真正发生 LBT 访问时再切。相关逻辑在 own_lbt() / lose_lbt() 中:

  • own_lbt(restore):抢占禁用 → 标记 TIF_USEDLBT 线程标志 → 从 thread.lbt 恢复寄存器

  • lose_lbt(save):保存寄存器到 thread.lbt → 清 TIF_USEDLBT → 关 LBTEN

3. 信号处理集成

sigcontext 结构扩展了 LBT 字段,asmmacro.hfpu_save_csr / fpu_restore_csr 在保存 FPU 控制状态时会连带处理 ftop

/* 保存时:若 TM 位置位,读出 x87 栈顶 */
x86mftop \tmp
stptr.w \tmp, \thread, THREAD_FTOP
x86clrtm
/* 恢复时:按 ftop 值 0~7 分支跳转 */
x86mttop 0 ~ x86mttop 7

也就是说,x87 浮点栈顶 ftop 被作为 FPU 状态的附属部分一起保存。

LBT 在 KVM 虚拟化中的支持

2024 年 9 月合入的 b67ee19a907 补丁把 LBT 支持延伸到 KVM 的 vCPU 上下文切换路径,同样是懒启用思路。QEMU 侧的补丁(v5 版本)进一步明确:

⚠️ "Now LBT feature is added in kvm mode, not supported in TCG mode​ since it is not emulated."

也就是说,LBT 是真实的硬件能力,QEMU TCG 软件模拟器无法模拟它。用户可以通过 QEMU 命令行参数 lbt=on/off/auto 控制:

  • lbt=on:强制开启,若宿主机 KVM 不支持则报错退出

  • 默认 auto:自动探测宿主机 KVM 能力,在 cpucfg 中设置 LBT_ALL (bits 18-20) 对应位

LBT 与 LATX 的关系

LATX(LoongArch x86 Translator)是运行在 LoongArch 上的二进制翻译软件系统,基于 QEMU 6 改造,专门把 x86_32/x86_64 程序翻译为 LoongArch 指令执行。它的架构包含:

  • 两段式 IR 流水线:IR1(x86 语义)→ IR2(LoongArch 语义),通过 Capstone 解码

  • 优化子系统:Translation Unit 合并、Flag Reduction(消除冗余 eflags 更新)、立即数缓存、JRRA 分支优化

  • AOT 预编译:把翻译后的代码块持久化到磁盘,下次直接加载

  • 库直通(KZT/Wrapper):把对 x86 标准库的调用重定向到 LoongArch 原生实现

  • 硬件辅助:利用 LBT 指令加速 eflags 模拟、x87 栈管理等最频繁的操作

💡 简单说:LBT 是硬件扩展,LATX 是利用这套硬件扩展的翻译器软件。没有 LBT 硬件,LATX 也能纯软件跑(靠多条基础指令模拟 eflags),但有 LBT 后,原来需要多条指令才能完成的 eflags 批量操作、x87 栈顶管理,可以压缩为单条 LBT 专用指令。

LBT 带来的性能增益(公开数据)

龙芯官方披露:借助 LBT 硬件辅助——

  • MIPS → LoongArch​ 翻译效率接近 100%

  • ARM → LoongArch​ 翻译效率约 90%

  • x86 → LoongArch​ 翻译效率约 80%

LMbench 微基准测试显示 MIPS 翻译代码路径可达原生执行速度的 80-90%。

架构示意图

┌──────────────────────────────────────────────┐
│         x86 应用程序 (未改源码)               │
├──────────────────────────────────────────────┤
│         LATX 翻译器 (基于 QEMU6)              │
│   ┌──────────────────────────────────────┐   │
│   │ IR1 (x86语义) │ IR2 (LA语义)        │   │
│   │ AOT │ TU │ Flag Reduction │ KZT     │   │
│   └──────────────────────────────────────┘   │
├──────────────────────────────────────────────┤
│   硬件辅助层:LBT 扩展指令                    │
│   ┌──────────────────────────────────────┐   │
│   │ scr0~scr3 │ eflags │ ftop            │   │
│   │ LBT_X86 / LBT_ARM / LBT_MIPS         │   │
│   └──────────────────────────────────────┘   │
├──────────────────────────────────────────────┤
│   Linux 内核:LBT 上下文管理                  │
│   ┌──────────────────────────────────────┐   │
│   │ enable/disable_lbt()                 │   │
│   │ own_lbt() / lose_lbt()  (懒启用)     │   │
│   │ _save_lbt() / _restore_lbt()         │   │
│   │ sigcontext 扩展                      │   │
│   └──────────────────────────────────────┘   │
├──────────────────────────────────────────────┤
│   LoongArch CPU (如 3A6000/3C6000)           │
└──────────────────────────────────────────────┘

常见误解

📌 LBT 并非"一条 x86 指令直接映射成一条 LoongArch 指令"的黑盒。它提供的是 eflags 整体操作、x86 栈顶管理、临时寄存器这几样"最高频、最耗时"操作的硬件原语,剩余翻译工作仍由 LATX 软件完成。

📌 公开的内核补丁只明确了 4 个 scr 寄存器 + eflags + ftop 这 6 类资源,并未在开源代码中暴露 LBT 完整指令清单。完整的 LBT 指令集定义以《龙芯架构参考手册》为准——公开资料中对指令总数的说法不一(有"不到 30 条"和"170 多条"两种口径),建议以龙芯官方手册最新版本为准。

📌 LBT 是特权资源,普通应用程序不能直接用,必须经过内核启用 + 翻译器(LATX)调度。这也是为什么内核要做 TIF_USEDLBT 线程标志跟踪。

 LATX 的两段式 IR 具体如何做 Flag Reduction(这是 x86 翻译最大的性能瓶颈);

 LBT 在 KVM 场景下如何让 vCPU 透传 LBT 能力给虚拟机内的 LATX

以下按照您指定的字段格式,纵向展开 10 个编号的信创软硬件适配算法/方法条目。每条均深度结合国产化芯片指令集(LoongArch64 / ARM64 / SW64 / x86_64)、计算机体系架构、器件物理特性、总线(PCIe/CXL/DDR)与驱动,给出可落地的工程设计。

💡 说明:以下内容为信创适配工程设计框架,函数以伪代码/可运行骨架呈现,数值参数为典型工程取值示例,而非某款商用产品的完整源码。国产固件生态依据昆仑固件在龙芯、飞腾、申威、海光、兆芯、鲲鹏等全系列处理器上的适配实践,以及国产 U-Boot 作为"开机第一程序"衔接硬件与操作系统的定位。


编号 01

类型

指令集异构适配 · 基础层

信创硬件及国产化硬件

  • 龙芯 3A6000/3C6000(LoongArch64,自主指令集,含 LBT 扩展)

  • 飞腾 S5000C/腾锐 D3000(ARMv8,FTC862 自研核,PSPA 2.0)

  • 申威 SW831(SW64,源自 DEC Alpha 深度扩展,256 位向量)

  • 鲲鹏 920 / 海光 C86-5G(x86_64 兼容 / ARM64)

信创及国产化软件

统信 UOS、银河麒麟 V10、OpenEuler、龙蜥 Anolis

领域

异构指令集 · 架构抽象

算法应用场景

同一份操作系统基线需在上述多种 ISA 上运行。龙芯 LoongArch 是完全自主的 RISC 指令集,飞腾为 ARMv8 自研 FTC 核(不是公版 Cortex,编译需 -march=armv8-a+crc+crypto,否则性能差 30% 以上),申威 SW64 为大端序 64 位 RISC,指令集差异导致内核模块、图形栈及加密算法库无法直接复用。

算法名称

异构指令集特征检测与架构抽象层分发算法(ISA-Feature Detection & HAL Dispatch)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 上电后 Bootloader 把设备树(DTB)或 ACPI 表传给内核,内核第一步要判定当前 ISA。

  2. 通过读取 CPUID/CPUID-like 寄存器得到 ISA 指纹:

    • ARM64: 飞腾 MIDR_EL1 的 Implementer 字段为 0x70(Phytium),0x48 为华为

    • LoongArch: CPUCFG2 寄存器 bit[18..20] 指示 LBT_X86 / LBT_ARM / LBT_MIPS 子能力

    • SW64: 通过自研 SW64_CP0 状态寄存器读取厂商签名

  3. 将指纹映射到 HAL 分发表,后续所有原子操作、内存屏障、加解密加速均走对应后端。

函数调用关系hal_init()isa_detect()hal_dispatch_table_build()hal_install_syscalls()

a. isa_detect() — ISA 指纹提取

  • 输入:void* cpuinfo_page(由引导程序映射的 CPU 信息页)

  • 输出:isa_id ∈ {LOONGARCH64=1, ARM64=2, SW64=3, X86_64=4}

  • 数学表达式:isa_id=f(MIDR_EL1, CPUCFG2[18..20], SW64_CP0_Vendor)

  • 参数数值设计:cpuinfo_page 物理地址 0x4000_0000,长度 4KB

  • 伪代码:

int isa_detect(void *cpuinfo_page) {
    uint64_t midr = read_sysreg(MIDR_EL1);    // ARM64 自研核
    if ((midr >> 24) == 0x70) {               // Phytium FTC862
        /* 进一步探 LBT 等扩展 */
        uint32_t cpucfg2 = la_cpucfg(2);
        g_hwcap |= (cpucfg2 & (1<<18)) ? HWCAP_LBT_X86 : 0;
        g_hwcap |= (cpucfg2 & (1<<19)) ? HWCAP_LBT_ARM  : 0;
        return ISA_ARM64;
    }
    if (la_cpucfg(0) == LA_MAGIC)             // LoongArch 'L''A'
        return ISA_LOONGARCH64;
    if (sw64_get_impl() == SW831_IMPL)         // SW64 大端序
        return ISA_SW64;
    return ISA_X86_64;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:低

b. hal_dispatch_table_build() — 构建 HAL 函数指针表

  • 输入:int isa_id, uint64_t hwcap

  • 输出:struct hal_ops* ops(含 32 个函数指针)

  • 伪代码:

struct hal_ops* hal_dispatch_table_build(int isa_id, uint64_t hwcap) {
    struct hal_ops *ops = kmalloc(sizeof(*ops));
    switch (isa_id) {
    case ISA_LOONGARCH64:
        ops->mb = la_dbar;                    /* LoongArch 内存屏障 */
        ops->cas = la_amswap;                 /* LL/SC 原子 */
        /* 若有 LBT 扩展,二进制翻译走硬件加速 */
        if (hwcap & HWCAP_LBT_X86) ops->x86_translate = la_lbt_x86;
        /* 国密 SM4 通过龙芯 Security Engine 加速器 */
        ops->sm4_enc = loongson_se_sm4;       /*  */
        break;
    case ISA_ARM64:
        ops->mb = arm64_dmb_sy;               /* ARM 全系统屏障 */
        ops->cas = arm64_cas_alternatives;    /* LSE 原子指令 */
        /* 飞腾 FTC 核支持 ARMv8 CRC+Crypto 扩展 */
        if (hwcap & HWCAP_CRC32) ops->crc32 = crc32_crypto_insn;
        /* 国密走 HSM 驱动 phytium-sm-crypto  */
        ops->sm3_hash = phytium_hsm_sm3;
        break;
    case ISA_SW64:
        /* SW64 原生支持 SM3/SM4/AES/SHA 指令  */
        ops->sm4_enc = sw64_sm4_insn;
        ops->sm3_hash = sw64_sm3_insn;
        /* SW64 大端序,需翻转字节序处理网络协议 */
        ops->ntohl = sw64_bswap32;
        break;
    }
    return ops;
}
  • 时间复杂度 O(k)(k=32,典型后端函数数量),空间复杂度 O(k),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

isa_detect

O(1)

O(1)

hal_dispatch_table_build

O(k)

O(k)

hal_install_syscalls

O(n)

O(n)

(n 为系统调用数,典型值 350)

时序流程图

BootROM → 昆仑BIOS/UEFI → U-Boot → Kernel
                                      │
                                      ▼
                                 hal_init()
                                      │
                 ┌────────────────────┼────────────────────┐
                 ▼                    ▼                    ▼
          isa_detect()     hal_dispatch_table_build()   hal_install_syscalls()
                 │                    │                    │
                 └────────────────────┼────────────────────┘
                                      ▼
                              内核继续启动

通信图

[Bootloader] --DTB/ACPI--> [Kernel HAL Core] --dispatch--> [ISA-specific Backend]
                                                        ├─ LoongArch Backend (+LBT)
                                                        ├─ ARM64 Backend (+FTC ext)
                                                        ├─ SW64 Backend (+国密指令)
                                                        └─ x86_64 Backend

架构图

┌──────────────────────────────────────────────┐
│              应用程序 / 容器 / LATX            │
├──────────────────────────────────────────────┤
│          系统调用接口 (SCI)                   │
├──────────────────────────────────────────────┤
│      硬件抽象层 HAL (hal_ops 分发表)          │
│   ┌────────┬────────┬────────┬──────────┐    │
│   │LoongArc│ ARM64 │ SW64  │ x86_64   │    │
│   │ h64    │ FTC   │ 256bit│          │    │
│   │ +LBT   │ +CRC  │ VEC   │          │    │
│   └────────┴────────┴───────┴──────────┘    │
├──────────────────────────────────────────────┤
│   昆仑BIOS V4.0 / UEFI / U-Boot / OpenSBI    │
├──────────────────────────────────────────────┤
│   国产 CPU (龙芯3C6000/飞腾D3000/申威SW831)   │
│   ┌──────────────────────────────────────┐   │
│   │ DDR5 控制器 │ PCIe 5.0 Root Complex │   │
│   └──────────────────────────────────────┘   │
└──────────────────────────────────────────────┘

满足的用户/管理员规模

单集群可纳管 5 种 ISA 混合节点 ≥ 1000 台;单机上支持多容器跨 ISA 运行(通过 qemu-user-static + binfmt_misc)

关联知识和法律法规

  • 关联知识:计算机体系结构、编译原理(后端代码生成)、CPU micro-architecture、国密算法

  • 法律法规:GB/T 29827-2013《信息安全技术 可信计算规范 可信平台主板功能接口》、等保 2.0


编号 02

类型

固件与启动栈协同 · 基础层

信创硬件及国产化硬件

龙芯 3C6000 服务器、飞腾 D3000 服务器(均配备昆仑 BIOS V4.0)

信创及国产化软件

昆仑 BIOS V4.0(符合 UEFI/PI 规范)+ 统信 UOS Server / 银河麒麟 Server

领域

固件 · 多 CPU 架构引导

算法应用场景

昆仑 BIOS 作为"点亮中国计算机的第一段代码",需在龙芯、飞腾、申威、海光、兆芯、鲲鹏等多样处理器上完成硬件初始化并引导国产 OS。昆仑 BIOS 通过独有设计的四层互联固件模型,使 BIOS 固件产品可通过同一架构支撑多处理器平台。

算法名称

多处理器架构统一框架引导算法(Unified Firmware Framework Boot, UFB²)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

昆仑 BIOS 采用四层互联固件模型,通过同一架构支撑多处理器平台;模块化设计让处理器、芯片组、外设驱动、安全可信等作为独立模块按需加载。从芯片物理角度看:

  • 龙芯 3C6000:需初始化 LoongArch 的 TLB、例外向量表、LBT 扩展寄存器

  • 飞腾 D3000:需初始化 ARMv8 的 MMU、GIC-600、PCIe 5.0 Root Complex

  • 申威 SW831:需初始化 SW64 的 PAL 层、256 位向量单元

a. kunlun_uefi_entry() — 昆仑 BIOS 主入口

  • 输入:无(BootROM 跳转至此,寄存器状态由 SoC 定义)

  • 输出:永不返回,最终 jmp 到 OS Loader

  • 伪代码:

void kunlun_uefi_entry(void) {
    sec_phase();          /* SEC: 建立临时栈, 使能cache */
    pei_phase();          /* PEI: 内存初始化, 找到主存 */
    dxe_phase();          /* DXE: 加载驱动, 枚举PCIe */
    bl_phase();           /* BootLoader: 加载 grub.efi */
}
  • 时间复杂度 O(1)(各阶段内部为线性),空间复杂度 O(m)(m 为已加载模块数),逻辑复杂度:高

b. pei_module_dispatch() — PEI 阶段按 ISA 分发模块

  • 输入:uint32_t isa_tag, uint32_t chip_ext

  • 输出:EFI_STATUS

  • 伪代码:

EFI_STATUS pei_module_dispatch(uint32_t isa_tag, uint32_t chip_ext) {
    switch (isa_tag) {
    case ISA_LOONGARCH64:
        LoadLoongArchPeiModules();    /* TLB init, 异常向量, LBT使能 */
        if (chip_ext & LBT_X86) enable_lbt_x86();
        break;
    case ISA_ARM64:
        LoadArm64PeiModules();        /* MMU enable, GICv3 init */
        if (chip_ext & PSPA_2_0)      /* 飞腾 PSPA 2.0 安全架构  */
            ps_pa_2_0_init();
        break;
    case ISA_SW64:
        LoadSw64PeiModules();         /* SW64自研PEI模块, 大端序处理 */
        break;
    }
}
  • 时间复杂度 O(p)(p 为该 ISA 下 PEI 模块数,典型 8-16 个),空间复杂度 O(p),逻辑复杂度:高

复杂度汇总

函数

时间

空间

逻辑

kunlun_uefi_entry

O(1)

O(m)

pei_module_dispatch

O(p)

O(p)

dxe_driver_load

O(d·log d)

O(d)

(d 为 DXE 驱动数,典型 60-120)

时序流程图

上电 → BootROM → SEC → PEI → DXE → BDS → OS Loader → 统信UOS/麒麟
         │        │      │      │      │       │
         │        │      │      │      │       └─ 引导grub.efi
         │        │      │      │      └─ 枚举PCIe 5.0, 加载驱动
         │        │      │      └─ DDR5 训练, 内存初始化
         │        │      └─ 按ISA分发PEI模块(含LBT/PSPA/SW64)
         │        └─ 建立栈, 使能Cache
         └─ 第一段代码入口

通信图

[BootROM] → [SEC Core] → [PEI Dispatcher] → [DXE Dispatcher]
                                                │
                        ┌───────────────────────┼───────────────────────┐
                        ▼                       ▼                       ▼
                [LoongArch Modules]    [ARM64/FTC Modules]    [SW64 Modules]
                        │                       │                       │
                        └───────────────────────┼───────────────────────┘
                                                ▼
                                   [OS Loader (grub.efi)]

架构图

┌────────────────────────────────────────────────┐
│                 统信UOS / 银河麒麟              │
├────────────────────────────────────────────────┤
│              OS Loader (grub.efi)              │
├────────────────────────────────────────────────┤
│                 昆仑BIOS V4.0                   │
│  ┌──────────────────────────────────────────┐  │
│  │  BDS  │  DXE  │  PEI  │  SEC            │  │
│  └──────────────────────────────────────────┘  │
│  ┌──────────────────────────────────────────┐  │
│  │  四层互联固件模型            │  │
│  │  Processor│Chipset│Driver│TCM/TPCM      │  │
│  └──────────────────────────────────────────┘  │
├────────────────────────────────────────────────┤
│  硬件: 龙芯3C6000/飞腾D3000/申威SW831          │
│  DDR5 4800MT/s │ PCIe 5.0 32GT/s │ PSPA 2.0  │
└────────────────────────────────────────────────┘

满足的用户/管理员规模

单机;通过昆仑 BMC 可远程带外管理 ≥ 4096 台服务器节点

关联知识和法律法规

  • 关联知识:UEFI/PI 规范、可信计算 3.0、国密 SM2/SM3/SM4、PSPA 安全架构

  • 法律法规:GB/T 38638-2020《信息安全技术 可信计算规范 可信计算体系结构》、等保 2.0


编号 03

类型

板级引导适配 · 嵌入式/终端层

信创硬件及国产化硬件

  • 飞腾 D2000 桌面终端:FTC663 核,34 lane PCIe 3.0,2×DDR4

  • 龙芯 2K1000 嵌入式:DDR3L 1.35V 内存控制器

  • 飞腾 D3000:FTC862 核,28 lane PCIe 5.0/4.0/3.0,2×DDR5

信创及国产化软件

国产 U-Boot(基于开源 U-Boot 二次开发,自主可控)+ 昆仑 BIOS 协同

领域

Bootloader · 板级适配

算法应用场景

U-Boot 作为"嵌入式设备的开机第一程序",需针对本土芯片进行专项开发。以龙芯 2K1000 为例,DDR3 物理层调试涉及读时序(CL 后颗粒驱动 DQS/DQ,DQS 边沿对齐 DQ)和写时序(CWL 后驱动,DQS 边沿位于 DQ 数据窗口正中);飞腾 D2000 的 PCIe 3.0 Root Complex 基址 0x4000_0000,ECAM 空间需正确配置。

算法名称

国产 U-Boot 多架构板级适配与 DDR 训练算法(Multi-Arch U-Boot DDR Training)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. SPL 阶段:在 SRAM 中运行,DDR 控制器 PHY 训练是核心。

  2. DDR 物理特性:以 DDR4-3200 为例,理论带宽 25.6 GB/s,电压 1.2V,需执行 ZQ 校准、Write Leveling、Gate Training、Data Eye Training。

  3. U-Boot 主体:从 Flash 加载到 DDR,解析 DTB,重写时钟/电源节点。

  4. 飞腾平台:需注意 64KB 物理页内 4KB 页属性一致。

a. spl_dram_training() — DDR PHY 训练

  • 输入:struct dram_params* p(由板级 board.cfg 提供)

  • 输出:int ret(0 成功)

  • 参数数值设计(DDR4-3200 典型值):

参数

数值

物理含义

tCL (CAS Latency)

22 cycles

读命令到数据有效

tRCD

22 cycles

ACT 到 READ/WRITE

tCWL (Write CL)

16 cycles

写延迟

tREFI

7.8μs

刷新间隔(全部行 64ms)

VDD

1.2V

DDR4 电压

  • 伪代码:

int spl_dram_training(struct dram_params *p) {
    /* 1. 复位 DDRC 和 PHY */
    ddr_ctrl_reset();
    phy_reset();
    /* 2. 写入 JEDEC 参数  */
    write_timing_regs(p);      /* tCL, tRCD, tCWL */
    /* 3. ZQ 校准: 校准输出阻抗  */
    ddr_zq_calibration();
    /* 4. Write Leveling: 对齐 CK 和 DQS  */
    for (int byte = 0; byte < p->bytes; byte++) {
        uint8_t dqs_delay = phy_write_leveling(byte);
        phy_set_dqs_delay(byte, dqs_delay);
    }
    /* 5. Gate Training: 确定读数据有效窗口  */
    for (int byte = 0; byte < p->bytes; byte++)
        phy_gate_training(byte);
    /* 6. Data Eye Training: 寻找最佳采样点  */
    for (int byte = 0; byte < p->bytes; byte++) {
        int best_delay = phy_data_eye_scan(byte);
        phy_set_dq_delay(byte, best_delay);
    }
    /* 7. 使能控制器 */
    ddr_ctrl_enable();
    return 0;
}
  • 时间复杂度 O(b·n)(b 为字节通道数,典型 8-16;n 为训练扫描点数,典型 64),空间复杂度 O(b),逻辑复杂度:高

b. ft_pcie_ecam_setup() — 飞腾 PCIe ECAM 配置

  • 输入:void* dts_node

  • 输出:int ret

  • 参数数值设计:飞腾 D2000 PCIe ECAM 基址 0x4000_0000,34 lane

  • 伪代码:

int ft_pcie_ecam_setup(void *dts_node) {
    uint64_t ecam_base = 0x40000000;
    /* 映射 ECAM 空间 */
    map_mmio(ecam_base, 0x40000000);    /* 1GB ECAM 空间 */
    /* 配置 Root Complex */
    ft_rc_init(ecam_base);
    /* 配置 GIC SPI 中断路由 */
    gic_route_spi(FT_PCIE_SPI_BASE, 128);
    /* 支持 x1/x4/x8/x16 配置  */
    ft_pcie_set_link_width(PCIE_LINK_WIDTH_16X);
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

spl_dram_training

O(b·n)

O(b)

ft_pcie_ecam_setup

O(1)

O(1)

bootm_load_kernel

O(s/B)

O(B)

(b=字节通道数 8-16;n=训练扫描点数 64;s 为内核镜像大小;B=块大小 512B)

时序流程图

BootROM → SPL (SRAM) → U-Boot (DDR) → bootm → Linux Kernel
   │         │             │              │        │
   │         │             │              │        └─ 移交控制权
   │         │             │              └─ 加载Image + DTB到内存
   │         │             └─ DTB重写, PCIe ECAM配置
   │         └─ DDR训练(Write Leveling/Gate/Data Eye)
   └─ 跳转SPL

通信图

[BootROM] → [SPL] → [U-Boot]
                        │
          ┌─────────────┼─────────────┐
          ▼             ▼             ▼
     [DDR PHY Train] [PCIe ECAM]  [Storage Read]
     (ZQ/WL/Gate/DE)  (0x4000_0000)  (NVMe/eMMC)
          │             │             │
          └─────────────┼─────────────┘
                        ▼
                 [Linux Kernel Image]

架构图

┌─────────────────────────────────────────────┐
│           Linux Kernel (ARM64/LoongArch)     │
├─────────────────────────────────────────────┤
│     国产 U-Boot (SPL + U-Boot)                │
│  ┌──────────────────────────────────────┐   │
│  │ board/ 飞腾D3000/D2000 龙芯2K1000    │   │
│  ├──────────────────────────────────────┤   │
│  │ arch/ ARM64 LoongArch               │   │
│  ├──────────────────────────────────────┤   │
│  │ drivers/ 国产物料驱动                 │   │
│  │  ├─ ddr/ phy_training.c              │   │
│  │  ├─ pci/ pcie_ft_rp.c                │   │
│  │  └─ net/ gmac_phytium.c              │   │
│  └──────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│  SoC: 飞腾D3000 (FTC862, PCIe5.0, DDR5)    │
│       龙芯2K1000 (LoongArch, DDR3L)         │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

嵌入式/工业控制单节点;通过昆仑 BMC 可管理 ≥ 4096 台设备

关联知识和法律法规

  • 关联知识:JEDEC DDR4/DDR5 规范、DDR PHY 训练算法(Write Leveling/Gate/Data Eye)、PCIe 5.0 规范、Device Tree 规范

  • 法律法规:《关键信息基础设施安全保护条例》、等保 2.0


编号 04

类型

RISC-V 引导链适配 · 专用层

信创硬件及国产化硬件

奕斯伟 EIC770x RISC-V SoC(信创 RISC-V 路线参照)、香山 RISC-V 处理器

信创及国产化软件

OpenSBI + U-Boot 组合镜像 fw_payload.bin

领域

Bootloader · M-mode/S-mode 切换

算法应用场景

RISC-V 架构采用 OpenSBI(M-mode)作为标准二进制接口,屏蔽底层硬件差异,U-Boot 作为二级 Bootloader 桥接 OpenSBI 与 Linux Kernel(S-mode)。总线层面,RISC-V 平台多采用 PLIC/APLIC 中断控制器和 TLB 管理。

算法名称

OpenSBI + U-Boot 链式引导装配算法(RISC-V M/S Mode Chain Boot)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

BootROM → OpenSBI (M-mode) → U-Boot (S-mode) → Kernel (S-mode)。OpenSBI 通过 SBI 接口为上层提供统一的系统服务,包括 IPI、Timer、RFENCE 等。

a. opensbi_init() — OpenSBI 入口

  • 输入:unsigned long hart_id, void* fdt_addr

  • 输出:永不返回

  • 参数数值设计:OpenSBI 加载地址 0x80000000(RISC-V 标准内核起始地址)

  • 伪代码:

void opensbi_init(unsigned long hart_id, void *fdt_addr) {
    sbi_init(hart_id);              /* 设置M-mode trap vector */
    fdt_parse(fdt_addr);            /* 解析DTB获取内存/CPU拓扑 */
    platform_early_init();          /* 平台早期初始化: UART, PLIC */
    /* 切换到S-mode, 跳转U-Boot */
    sbi_hart_switch_mode(hart_id, 0, (unsigned long)uboot_entry,
                         SBI_HART_SMODE, fdt_addr);
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

b. fw_payload_assemble() — 组合镜像装配

  • 数学表达式:fw_payload=OpenSBIM−mode​∥U-BootS−mode​

  • 参数数值设计:OpenSBI 加载地址 0x80000000,U-Boot 加载地址 0x80200000

  • 伪代码:

void fw_payload_assemble(const char* opensbi, const char* uboot,
                         const char* fdt, char* out) {
    memcpy(out, opensbi, SBI_SIZE);
    memcpy(out + SBI_SIZE, uboot, UBOOT_SIZE);
    memcpy(out + FDT_OFFSET, fdt, fdt_size());
}
  • 时间复杂度 O(s)(s 为镜像总大小),空间复杂度 O(1),逻辑复杂度:低

复杂度汇总

函数

时间

空间

逻辑

opensbi_init

O(1)

O(1)

fw_payload_assemble

O(s)

O(1)

sbi_hart_switch_mode

O(1)

O(1)

时序流程图

BootROM → OpenSBI(M-mode) → U-Boot(S-mode) → Kernel(S-mode)
   │            │               │               │
   │            │               │               └─ 系统启动
   │            │               └─ 加载Image, 跳转Kernel
   │            └─ 解析DTB, 切换到S-mode
   └─ 加载fw_payload.bin到0x80000000

通信图

[BootROM] → [OpenSBI] ↔ [U-Boot] ↔ [Linux Kernel]
              ↑                    ↑
              └─ SBI Calls ────────┘

架构图

┌──────────────────────────────┐
│         Linux Kernel          │ S-mode
├──────────────────────────────┤
│         U-Boot                │ S-mode
├──────────────────────────────┤
│         OpenSBI               │ M-mode
├──────────────────────────────┤
│  硬件: RISC-V EIC770x SoC    │
│  PLIC | TLB | UART            │
└──────────────────────────────┘

满足的用户/管理员规模

嵌入式/RISC-V 单节点

关联知识和法律法规

  • 关联知识:RISC-V 特权架构 v1.12、SBI 规范 v2.0、PLIC/APLIC 中断控制器

  • 法律法规:等保 2.0(RISC-V 平台同样适用)


编号 05

类型

硬件资源解析适配 · 系统层

信创硬件及国产化硬件

  • 飞腾 D3000(ARMv8,ACPI 平台,PSPA 2.0)

  • 龙芯 3C6000(LoongArch,ACPI+DTB 双模,LBT 扩展)

信创及国产化软件

统信 UOS Server、银河麒麟 V10 Server

领域

固件接口 · ACPI/SMBIOS

算法应用场景

飞腾平台常因 ACPI 表不完整导致电源管理失效;需解析并校验 ACPI 表的完整性,补全缺失的 PSS/CST 对象。昆仑 BIOS 以国际通用 UEFI 规范为基础,支持各类总线协议,实现主板芯片、板卡外设的互联互通和交互配置。

算法名称

ACPI 表完整性校验与补丁算法(ACPI Integrity Check & Patch)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 从 RSDP → RSDT/XSDT → 各表(DSDT/FADT/MADT/...)逐级遍历。

  2. 对每个表计算校验和,与 OEM 表头中的 checksum 比对。

  3. 若关键表(如 FADT 中 _CST 对象)缺失,从固件补丁库注入。

a. acpi_walk_tables() — 遍历 ACPI 表

  • 输入:struct acpi_rsdp* rsdp

  • 输出:struct acpi_table_list* list

  • 伪代码:

struct acpi_table_list* acpi_walk_tables(struct acpi_rsdp *rsdp) {
    struct acpi_table_list *list = kzalloc(sizeof(*list));
    void *xsdt = phys_to_virt(rsdp->xsdt_phys);
    int n = (xsdt_header->length - sizeof(struct acpi_table_header)) / 8;
    for (int i = 0; i < n; i++) {
        void *tbl = phys_to_virt(((uint64_t*)xsdt)[i]);
        if (acpi_verify_checksum(tbl) != 0) {
            pr_err("ACPI table %s checksum fail\n", tbl->signature);
            continue;
        }
        list->tables[list->count++] = tbl;
    }
    return list;
}
  • 时间复杂度 O(t)(t 为 ACPI 表数量,典型 20-40),空间复杂度 O(t),逻辑复杂度:中

b. acpi_patch_fadt_cst() — 补全 _CST 对象

  • 输入:struct fadt* fadt

  • 输出:int ret

  • 伪代码:

int acpi_patch_fadt_cst(struct fadt *fadt) {
    if (!aml_object_exists(fadt->dsdt, "_CST"))
        aml_inject_object(fadt->dsdt, patch_cst_template);
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

acpi_walk_tables

O(t)

O(t)

acpi_verify_checksum

O(s)

O(1)

acpi_patch_fadt_cst

O(1)

O(1)

(s 为单表大小)

时序流程图

内核启动 → 定位RSDP → 遍历XSDT → 校验每个表 → 补全缺失对象 → 构建ACPI命名空间
                                                          ↓
                                                    正常电源管理

通信图

[Kernel] ↔ [ACPI Core] ↔ [Table Parser] ↔ [AML Interpreter]
                                          ↑
                                   [Patch Library]

架构图

┌────────────────────────────────────┐
│            OS Power Manager         │
├────────────────────────────────────┤
│            ACPI Core                │
│   ┌──────────────────────────────┐  │
│   │ RSDP → XSDT → DSDT/FADT/... │  │
│   └──────────────────────────────┘  │
├────────────────────────────────────┤
│   昆仑BIOS ACPI Tables              │
├────────────────────────────────────┤
│   飞腾D3000 (PSPA 2.0) / 龙芯3C6000│
└────────────────────────────────────┘

满足的用户/管理员规模

单机;集群场景下可统一管理 ACM(ACPI 兼容管理)策略

关联知识和法律法规

  • 关联知识:ACPI 6.3 规范、AML 字节码解释器

  • 法律法规:GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》


编号 06

类型

二进制翻译/ABI 兼容 · 运行层

信创硬件及国产化硬件

龙芯 3A6000/3C6000(LoongArch,内置 LBT 二进制翻译扩展)

信创及国产化软件

LATX(LoongArch 二进制翻译器)、统信 UOS

领域

指令集翻译 · 应用兼容

算法应用场景

龙芯 LoongArch 平台需运行 x86/ARM 遗留程序。LBT 扩展仅新增不到 30 条指令,提供 4 个 scratch 寄存器(SCR0-SCR3)、x86/ARM eflags、x87 FPU 栈指针 ftop,将二进制翻译过程中最频繁、最耗时的通用操作硬件化。LBT 分 LBT-x86 和 LBT-arm 两个子集,可独立配置。

算法名称

基于 LBT 硬件加速的基本块动态二进制翻译算法(LBT-Hardened DBT)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 利用龙芯 LBT 硬件扩展,将 x86 的某些指令直接映射为 LoongArch 等价指令,减少纯软件解码开销。

  2. LBT 的 eflags 寄存器直接映射 x86 的 EFLAGS,LBT 指令可以直接对标志位进行批量操作,不需要逐位运算

  3. 基本块(Basic Block)为单位翻译,配合代码缓存(Code Cache)。

  4. 内核侧 LBT 上下文管理:通过 CSR_EUEN_LBTEN 位控制开关,own_lbt()/lose_lbt() 实现懒启用。

a. lbt_enabled_check() — LBT 硬件能力探测

  • 输入:无

  • 输出:uint32_t lbt_cap(bit0: LBT_X86, bit1: LBT_ARM, bit2: LBT_MIPS)

  • 数学表达式:lbt_cap=CPUCFG2[18]≪0∣CPUCFG2[19]≪1∣CPUCFG2[20]≪2

  • 伪代码:

uint32_t lbt_cap_detect(void) {
    uint32_t cpucfg2 = la_cpucfg(2);
    uint32_t cap = 0;
    if (cpucfg2 & (1 << 18)) cap |= LBT_X86;  /* x86 翻译 */
    if (cpucfg2 & (1 << 19)) cap |= LBT_ARM;  /* ARM 翻译 */
    if (cpucfg2 & (1 << 20)) cap |= LBT_MIPS; /* MIPS 翻译 */
    return cap;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:低

b. dbt_translate_block_lbt() — LBT 加速的基本块翻译

  • 输入:uint64_t guest_pc

  • 输出:TranslationBlock* tb

  • 伪代码:

TranslationBlock* dbt_translate_block_lbt(uint64_t guest_pc) {
    TB = alloc_tb();
    int la_insn_cnt = 0;
    while (!is_branch(guest_pc)) {
        x86_insn insn = x86_decode(guest_pc);
        /* 优先利用LBT硬件映射  */
        if (lbt_x86_can_map(insn)) {
            /* eflags 批量操作: 单条LBT指令替代多条基础指令 */
            la_insn_cnt += lbt_x86_emit(TB, insn);
        } else {
            /* 软件TCG翻译 */
            la_insn_cnt += tcg_translate(TB, insn);
        }
        guest_pc += insn.len;
    }
    TB->la_insn_cnt = la_insn_cnt;
    return TB;
}
  • 时间复杂度 O(n·k)(n 为基本块指令数,k 为单指令翻译平均开销),空间复杂度 O(n),逻辑复杂度:非常高

c. lbt_ctx_switch() — LBT 上下文切换(内核侧)

  • 输入:struct task_struct* prev, struct task_struct* next

  • 输出:无

  • 伪代码:

void lbt_ctx_switch(struct task_struct *prev, struct task_struct *next) {
    if (test_thread_flag(TIF_USEDLBT)) {
        /* 保存 scr0~scr3, eflags, ftop 到 prev


编号 07

类型

内存一致性模型与原子操作适配 · 运行层

信创硬件及国产化硬件

  • 飞腾 D3000(ARMv8,弱一致性模型,支持 LSE 原子扩展)

  • 龙芯 3C6000(LoongArch,弱一致性模型,LL/SC + AMO 指令)

  • 申威 SW831(SW64,强一致性模型,类似 Alpha)

  • 海光 C86-5G(x86_64,强一致性模型,TSO)

信创及国产化软件

统信 UOS、银河麒麟 V10、OpenEuler

领域

内存屏障 · 原子操作 · 锁机制

算法应用场景

跨 ISA 的并行程序(如 MySQL、Nginx、数据库内核)依赖正确的内存序和原子操作。不同芯片的内存模型差异巨大:x86 提供 TSO(Total Store Order),ARM64 和 LoongArch 是弱一致性(Relaxed),申威 SW64 类似 Alpha 的强顺序但需要显式屏障。驱动程序、同步原语必须按芯片特性选择最优实现。

算法名称

多架构内存屏障与原子操作自适应选择算法(Memory Barrier & Atomic Adaptation, MBAA)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 内核和用户态库(glibc/pthread)需要在编译时或运行时选择正确的内存屏障和原子操作实现。

  2. ARM64 弱一致性:dmb ish 用于数据同步,stlr/ldar 提供 acquire-release 语义。

  3. LoongArch:dbar 指令提供不同级别的屏障(0~7),ll/sc 对用于原子 RMW,amswap 等 AMO 指令直接原子交换。

  4. 申威 SW64:虽然强一致性,但 I/O 操作仍需 mb 屏障,其原子操作通过 fetchadd 指令实现。

  5. 海光 x86:mfencelock cmpxchg 等。

a. smp_mb_arch() — 架构特定的全内存屏障

  • 输入:无

  • 输出:无(执行屏障指令)

  • 伪代码:

static inline void smp_mb_arch(void) {
#if defined(__loongarch__)
    __asm__ volatile("dbar 0" ::: "memory");  /* 数据屏障级别0 */
#elif defined(__aarch64__)
    __asm__ volatile("dmb ish" ::: "memory"); /* 内部可共享域 */
#elif defined(__sw64__)
    __asm__ volatile("mb" ::: "memory");
#else /* x86 */
    __asm__ volatile("mfence" ::: "memory");
#endif
}
  • 时间复杂度 O(1)(单条指令),空间复杂度 O(1),逻辑复杂度:低

b. atomic_cmpxchg_arch() — 架构特定的 CAS 原子操作

  • 输入:atomic_t *v, int old, int new

  • 输出:int ret(旧值)

  • 数学表达式:ret=CAS(v,old,new)

  • 参数数值设计:v 为 4 字节对齐地址

  • 伪代码:

static inline int atomic_cmpxchg_arch(atomic_t *v, int old, int new) {
#if defined(__loongarch__)
    int ret;
    __asm__ volatile(
        "1: ll.w %0, %1\n"
        "   bne %0, %2, 2f\n"
        "   move $t0, %3\n"
        "   sc.w $t0, %1\n"
        "   beqz $t0, 1b\n"
        "2:"
        : "=&r"(ret), "+ZC"(*v)
        : "r"(old), "r"(new)
        : "t0", "memory");
    return ret;
#elif defined(__aarch64__) && defined(CONFIG_ARM64_LSE_ATOMICS)
    /* LSE 原子指令 cas */
    unsigned int tmp;
    __asm__ volatile(
        "mov %w0, %w2\n"
        "cas %w0, %w3, %1\n"
        : "=&r"(tmp), "+Q"(*v)
        : "r"(old), "r"(new)
        : "memory");
    return tmp;
#elif defined(__sw64__)
    /* SW64 使用 fetchadd 模拟 CAS */
    return sw64_atomic_cmpxchg(v, old, new);
#else /* x86 */
    return __sync_val_compare_and_swap(v, old, new);
#endif
}
  • 时间复杂度 O(1)(LL/SC 可能重试,均摊常数),空间复杂度 O(1),逻辑复杂度:中

c. spin_lock_arch() — 架构优化的自旋锁

  • 输入:arch_spinlock_t *lock

  • 输出:无

  • 伪代码:

static inline void spin_lock_arch(arch_spinlock_t *lock) {
#if defined(__loongarch__)
    /* 使用 amswap 实现 ticket lock */
    uint32_t ticket = atomic_fetch_add(&lock->next, 1);
    while (atomic_read(&lock->owner) != ticket)
        cpu_relax();
#elif defined(__aarch64__)
    /* ARM64 使用 WFE 优化 */
    uint32_t val;
    do {
        __asm__ volatile("ldaxr %w0, %1" : "=&r"(val) : "Q"(lock->lock));
        if (val) {
            __asm__ volatile("wfe" ::: "memory");
            continue;
        }
    } while (__cmpxchg(&lock->lock, 0, 1));
#else
    /* x86/SW64 使用简单的 test-and-set */
    while (atomic_xchg(&lock->lock, 1))
        cpu_relax();
#endif
}
  • 时间复杂度 O(1)(平均等待次数),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

smp_mb_arch

O(1)

O(1)

atomic_cmpxchg_arch

O(1)

O(1)

spin_lock_arch

O(1)

O(1)

时序流程图(以 spin_lock 为例):

线程A请求锁
    │
    ▼
┌─────────────┐
│ arch_spin_lock │
└──────┬──────┘
       │
       ├─ LoongArch: amswap ticket
       ├─ ARM64: ldaxr/stxr + wfe
       ├─ SW64: fetchadd
       └─ x86: lock xchg
       │
       ▼
  获得锁 → 临界区 → 释放锁

通信图

[Thread A] ↔ [Memory Subsystem] ↔ [Cache Coherence (MESI)]
                ↑
        [Barrier Instruction]

架构图

┌─────────────────────────────────────────────┐
│           应用程序 / 内核同步原语             │
├─────────────────────────────────────────────┤
│         Memory Model Abstraction Layer       │
│   ┌────────┬────────┬────────┬──────────┐   │
│   │LoongArc│ ARM64 │ SW64  │ x86_64   │   │
│   │ dbar   │ dmb   │ mb    │ mfence   │   │
│   │ ll/sc  │ lse   │ fa    │ lock     │   │
│   └────────┴────────┴───────┴──────────┘   │
├─────────────────────────────────────────────┤
│   CPU Core (FTC862/LA664/SW831/Zen)         │
│   Cache Coherency Protocol (MOESI/MEI)      │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机任意并发线程数;集群中影响分布式锁性能,可支撑数千并发事务

关联知识和法律法规

  • 关联知识:内存一致性模型(TSO/RCsc/RCpc)、MESI 协议、LL/SC 与 ABA 问题、WFE 指令

  • 法律法规:等保 2.0 中关于并发控制的安全要求


编号 08

类型

中断控制器与 IPI 适配 · 系统层

信创硬件及国产化硬件

  • 飞腾 D3000(GIC-600,支持 GICv3/v4,LPI 中断)

  • 龙芯 3C6000(LoongArch 自有 INTC,支持 MSI 和 IPI)

  • 申威 SW831(自有中断控制器,类似 Alpha 的 IOC)

  • 海光 C86-5G(xAPIC/x2APIC)

信创及国产化软件

统信 UOS、银河麒麟 V10、OpenEuler

领域

中断管理 · 多核通信

算法应用场景

操作系统需要为不同架构的中断控制器提供统一接口,包括:中断路由、优先级管理、IPI 发送、中断亲和性设置。飞腾 GIC-600 需要配置 Redistributor 和 ITS(Interrupt Translation Service)以支持 PCIe MSI/MSI-X;龙芯 INTC 需要配置中断向量表和 IPI 消息寄存器。

算法名称

多架构中断控制器抽象与 IPI 路由算法(Generic Interrupt Controller Abstraction, GICA)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 每个 CPU 核启动时,初始化本地中断控制器(GIC CPU Interface / INTC Core)。

  2. 注册全局中断控制器描述符,提供 irq_mask/unmask/ack/set_affinity 回调。

  3. IPI 发送通过写特定寄存器触发:ARM64 写 ICC_SGI1R_EL1,LoongArch 写 IPI 消息寄存器,x86 写 ICR。

a. gic_init_cpu_interface() — ARM64 GIC CPU 接口初始化

  • 输入:int cpu

  • 输出:int ret

  • 参数数值设计:GIC 基址 0x2f000000(飞腾 D3000 典型值),Redistributor 基址 0x2f100000

  • 伪代码:

int gic_init_cpu_interface(int cpu) {
    uint64_t base = gic_get_rdist_base(cpu);
    /* 启用 GIC CPU 接口 */
    writel(base + GICR_WAKER, 0);  /* 清除 ProcessorSleep */
    while (readl(base + GICR_WAKER) & GICR_WAKER_ChildrenAsleep);
    /* 配置优先级掩码 */
    write_sysreg(0xff, ICC_PMR_EL1);
    /* 启用组1中断 */
    write_sysreg(1, ICC_IGRPEN1_EL1);
    /* 启用 EOImode 为 0(写EOIR确认) */
    write_sysreg(0, ICC_CTLR_EL1);
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

b. la_ipi_send() — 龙芯 INTC IPI 发送

  • 输入:int target_cpu, uint32_t ipi_type

  • 输出:无

  • 参数数值设计:IPI 消息寄存器基址 0x1fe01000,target_cpu 为 0~63

  • 伪代码:

void la_ipi_send(int target_cpu, uint32_t ipi_type) {
    uint64_t ipi_reg = LA_IPI_BASE + (target_cpu << 4);
    /* 写 IPI 消息寄存器 */
    writel(ipi_type, ipi_reg + LA_IPI_MSG);
    /* 触发 IPI:写触发寄存器 */
    writel(1, ipi_reg + LA_IPI_TRIGGER);
    /* 等待完成(轮询状态寄存器) */
    while (readl(ipi_reg + LA_IPI_STAT) & 1);
}
  • 时间复杂度 O(1)(等待轮询时间极短),空间复杂度 O(1),逻辑复杂度:低

c. irq_set_affinity_arch() — 设置中断亲和性

  • 输入:struct irq_data *data, const struct cpumask *dest, bool force

  • 输出:int ret

  • 伪代码:

int irq_set_affinity_arch(struct irq_data *data, const struct cpumask *dest, bool force) {
    struct irq_chip *chip = data->chip;
    if (chip->irq_set_affinity)
        return chip->irq_set_affinity(data, dest, force);
    /* 默认:写中断控制器路由寄存器 */
    u64 val = cpumask_bits(dest)[0];
    switch (data->controller_type) {
    case CTL_GICV3:
        writeq_relaxed(val, data->chip_data + GICD_IROUTER + data->hwirq * 8);
        break;
    case CTL_LA_INTC:
        writel(val, data->chip_data + LA_INT_ROUTE + data->hwirq * 4);
        break;
    }
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

gic_init_cpu_interface

O(1)

O(1)

la_ipi_send

O(1)

O(1)

irq_set_affinity_arch

O(1)

O(1)

时序流程图(中断响应):

外设产生中断
    │
    ▼
中断控制器 (GIC/INTC/xAPIC)
    │
    ├─ 路由到目标 CPU
    │
    ▼
CPU 进入中断向量
    │
    ├─ 保存上下文
    ├─ 调用 handler
    └─ 写 EOIR 确认

通信图

[Peripheral] → [Interrupt Controller] → [CPU Core]
                    ↑
              [IPI from other core]

架构图

┌─────────────────────────────────────────────┐
│            OS 中断子系统                      │
│   ┌─────────────────────────────────────┐   │
│   │ Generic IRQ Layer                   │   │
│   │ irq_chip: mask/unmask/ack/affinity  │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   ┌────────┬────────┬────────┬──────────┐   │
│   │GICv3   │LA INTC │SW64 IOC│x2APIC   │   │
│   │(飞腾)  │(龙芯)  │(申威)  │(海光)   │   │
│   └────────┴────────┴───────┴──────────┘   │
├─────────────────────────────────────────────┤
│   CPU Cores (0~N)                           │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机支持 128 核及以上;集群中中断负载均衡影响整体性能

关联知识和法律法规

  • 关联知识:GICv3/v4 架构、MSI/MSI-X、中断亲和性、CPU 拓扑

  • 法律法规:等保 2.0 中关于可用性和容错的要求


编号 09

类型

PCIe 总线枚举与 DMA 地址映射 · 驱动层

信创硬件及国产化硬件

  • 飞腾 D3000(PCIe 5.0 Root Complex,集成 SMMU v3.1)

  • 龙芯 3C6000(PCIe 4.0,集成 IOMMU)

  • 申威 SW831(PCIe 3.0,自有 DMA 映射机制)

信创及国产化软件

统信 UOS、银河麒麟 V10、OpenEuler

领域

设备驱动 · DMA 内存管理

算法应用场景

国产外设(如国产 GPU、NVMe SSD、网卡)通过 PCIe 总线连接,需要操作系统正确枚举总线拓扑、分配总线号、配置 BAR 空间,并为 DMA 操作建立 IOMMU/SMMU 映射,保证设备只能访问授权的物理内存区域。

算法名称

PCIe 拓扑枚举与 IOMMU DMA 映射算法(PCIe Topology Enumeration & IOMMU Mapping)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 从 Root Complex 开始深度优先遍历 PCIe 总线,发现桥设备后递归枚举次级总线。

  2. 为每个设备分配总线号、配置 BAR(Base Address Register)。

  3. 对于支持 ATS(Address Translation Services)的设备,配置 IOMMU 页表。

  4. DMA 映射时,调用 IOMMU 驱动创建 IOVA 到物理地址的映射。

a. pci_scan_bridge() — 递归扫描 PCIe 桥

  • 输入:struct pci_bus *bus, int devfn

  • 输出:struct pci_bus *child

  • 参数数值设计:devfn 编码设备号和功能号

  • 伪代码:

struct pci_bus *pci_scan_bridge(struct pci_bus *bus, int devfn) {
    uint32_t vendor = pci_read_config(bus, devfn, PCI_VENDOR_ID);
    if (vendor == 0xFFFF || vendor == 0x0000) return NULL;
    uint8_t hdr_type = pci_read_config(bus, devfn, PCI_HEADER_TYPE);
    if (!(hdr_type & 0x80)) return NULL;  /* 非桥设备 */
    /* 分配次级总线号 */
    int secondary = allocate_bus_number();
    int subordinate = secondary;
    /* 配置桥的 primary/secondary/subordinate 寄存器 */
    pci_write_config(bus, devfn, PCI_PRIMARY_BUS, bus->number);
    pci_write_config(bus, devfn, PCI_SECONDARY_BUS, secondary);
    pci_write_config(bus, devfn, PCI_SUBORDINATE_BUS, subordinate);
    /* 创建子总线对象 */
    struct pci_bus *child = pci_alloc_child_bus(bus, devfn, secondary);
    /* 递归扫描子总线上的设备 */
    for (int dev = 0; dev < 32; dev++)
        for (int fn = 0; fn < 8; fn++)
            pci_scan_device(child, PCI_DEVFN(dev, fn));
    return child;
}
  • 时间复杂度 O(d·f)(d=设备数,f=功能数),空间复杂度 O(n)(n=总线数),逻辑复杂度:高

b. smmu_map_dma() — SMMU DMA 映射

  • 输入:struct device *dev, dma_addr_t iova, phys_addr_t pa, size_t size, int prot

  • 输出:int ret

  • 参数数值设计:页大小 4KB,SMMU STE(Stream Table Entry)配置

  • 伪代码:

int smmu_map_dma(struct device *dev, dma_addr_t iova, phys_addr_t pa, size_t size, int prot) {
    struct arm_smmu_domain *smmu_domain = dev->iommu_domain;
    size_t offset = iova & (SMMU_PAGE_SIZE - 1);
    iova &= ~(SMMU_PAGE_SIZE - 1);
    pa &= ~(SMMU_PAGE_SIZE - 1);
    size = ALIGN(size + offset, SMMU_PAGE_SIZE);
    /* 逐页建立映射 */
    for (size_t done = 0; done < size; done += SMMU_PAGE_SIZE) {
        int ret = arm_smmu_map_page(smmu_domain, iova + done, pa + done, prot);
        if (ret) return ret;
    }
    return 0;
}
  • 时间复杂度 O(n_pages),空间复杂度 O(n_pages)(页表占用),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

pci_scan_bridge

O(d·f)

O(n)

smmu_map_dma

O(n_pages)

O(n_pages)

pci_setup_bar

O(1)

O(1)

时序流程图(PCIe 枚举):

Root Complex
    │
    ▼
扫描 Bus 0
    │
    ├─ 发现桥设备 → 分配次级总线 → 递归扫描
    │
    ▼
所有设备枚举完成
    │
    ▼
配置 BAR 空间
    │
    ▼
启用总线 mastering

通信图

[CPU] ↔ [PCIe RC] ↔ [Switch/Bridge] ↔ [Endpoint Device]
         ↑
    [IOMMU/SMMU]
         ↑
    [DMA Mapping]

架构图

┌─────────────────────────────────────────────┐
│            OS PCI Subsystem                  │
│   ┌─────────────────────────────────────┐   │
│   │ Enumeration │ Resource Allocation  │   │
│   │ IOMMU API   │ DMA API             │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   ┌────────┬────────┬────────┬──────────┐   │
│   │飞腾    │龙芯    │申威    │海光      │   │
│   │SMMU v3 │IOMMU   │自有    │VT-d     │   │
│   └────────┴────────┴───────┴──────────┘   │
├─────────────────────────────────────────────┤
│   PCIe 5.0/4.0/3.0 Root Complex             │
│   ┌──────────┐ ┌──────────┐ ┌──────────┐   │
│   │  GPU     │ │ NVMe SSD │ │ 网卡     │   │
│   └──────────┘ └──────────┘ └──────────┘   │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机支持 256 个 PCIe 设备;集群通过 SR-IOV 可虚拟化更多

关联知识和法律法规

  • 关联知识:PCIe 5.0 规范、SMMU v3.1 架构、IOVA 分配算法、ATS/PRI

  • 法律法规:GB/T 22239-2019 等保 2.0


编号 10

类型

国密算法硬件加速适配 · 密码层

信创硬件及国产化硬件

  • 龙芯 3C6000(内置 Security Engine,支持 SM2/SM3/SM4 硬件加速)

  • 飞腾 D3000(PSPA 2.0 安全架构,内置 SM3/SM4 指令扩展)

  • 申威 SW831(SM3/SM4/AES/SHA 原生指令,256 位向量单元)

  • 海光 C86-5G(支持 AES-NI,但 SM 系列需软件实现或密码卡)

信创及国产化软件

统信 UOS、银河麒麟 V10(内置 gmssl/openssl 国密引擎)

领域

密码学 · 硬件加速

算法应用场景

国密算法(SM2/SM3/SM4)是国家标准密码算法,广泛应用于电子政务、金融、云计算。不同国产芯片提供不同级别的硬件加速:龙芯有独立 Security Engine 协处理器,飞腾有 SM3/SM4 指令扩展(类似 ARMv8.2 的 SM3/SM4 扩展),申威有原生指令。操作系统需要探测硬件能力并选择最优实现。

算法名称

国密算法硬件加速探测与多后端调度算法(SM Hardware Acceleration Probe & Dispatch)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 通过 CPUID/CPUCFG 或设备树探测硬件加速能力。

  2. 注册多个后端:硬件指令后端、Security Engine 协处理器后端、纯软件后端。

  3. 运行时根据算法类型和密钥长度选择最快后端。

a. sm_hw_caps_probe() — 探测国密硬件能力

  • 输入:无

  • 输出:struct sm_caps(bitmask)

  • 伪代码:

struct sm_caps sm_hw_caps_probe(void) {
    struct sm_caps caps = {0};
#if defined(__loongarch__)
    uint32_t cpucfg3 = la_cpucfg(3);
    if (cpucfg3 & (1 << 24)) caps.sm3 = 1;  /* LSX SM3 加速 */
    if (cpucfg3 & (1 << 26)) caps.sm4 = 1;  /* LSX SM4 加速 */
    /* 检查 Security Engine 是否存在 */
    if (loongson_se_present()) caps.se = 1;
#elif defined(__aarch64__)
    uint64_t isar0 = read_sysreg(ID_AA64ISAR0_EL1);
    if ((isar0 >> 44) & 0xf) caps.sm3 = 1;  /* SM3 扩展 */
    if ((isar0 >> 52) & 0xf) caps.sm4 = 1;  /* SM4 扩展 */
#elif defined(__sw64__)
    /* SW64 原生支持 SM 指令 */
    caps.sm3 = 1; caps.sm4 = 1;
#endif
    return caps;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:低

b. sm4_encrypt_arch() — 架构优化的 SM4 加密

  • 输入:const uint8_t *plain, uint8_t *cipher, const uint8_t *key, int len

  • 输出:int ret

  • 数学表达式:cipher=SM4_Encrypt(key,plain)

  • 参数数值设计:密钥长度 16 字节,分组大小 16 字节

  • 伪代码:

int sm4_encrypt_arch(const uint8_t *plain, uint8_t *cipher, const uint8_t *key, int len) {
    struct sm_caps caps = sm_hw_caps_probe();
    if (caps.se) {
        /* 龙芯 Security Engine 协处理器 */
        return loongson_se_sm4_enc(plain, cipher, key, len);
    } else if (caps.sm4) {
        /* SM4 指令扩展(飞腾/申威) */
        for (int i = 0; i < len; i += 16) {
            __asm__("sm4enc %0, %1, %2" : "+w"(*(__uint128_t*)(cipher+i))
                     : "w"(*(__uint128_t*)(plain+i)), "w"(*(__uint128_t*)key));
        }
        return 0;
    } else {
        /* 纯软件 fallback */
        return sm4_soft_encrypt(plain, cipher, key, len);
    }
}
  • 时间复杂度 O(len/16),空间复杂度 O(1),逻辑复杂度:中

c. sm3_hash_arch() — 架构优化的 SM3 哈希

  • 输入:const uint8_t *msg, size_t len, uint8_t hash[32]

  • 输出:int ret

  • 伪代码:

int sm3_hash_arch(const uint8_t *msg, size_t len, uint8_t hash[32]) {
    struct sm_caps caps = sm_hw_caps_probe();
    if (caps.sm3) {
        /* SM3 指令扩展 */
        sm3_ce_transform(msg, len, hash);  /* 飞腾/申威 */
        return 0;
    } else if (caps.se) {
        /* 龙芯 SE 协处理器 */
        return loongson_se_sm3_hash(msg, len, hash);
    } else {
        return sm3_soft_hash(msg, len, hash);
    }
}
  • 时间复杂度 O(len/block)(block=64 字节),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

sm_hw_caps_probe

O(1)

O(1)

sm4_encrypt_arch

O(len/16)

O(1)

sm3_hash_arch

O(len/64)

O(1)

时序流程图(SM4 加密调用):

应用程序调用 SM4 加密
    │
    ▼
sm_hw_caps_probe()
    │
    ├─ 龙芯 SE: loongson_se_sm4_enc (DMA 提交)
    ├─ 飞腾/申威: sm4enc 指令 (单周期)
    └─ 无硬件: sm4_soft_encrypt (查表+轮函数)
    │
    ▼
返回密文

通信图

[Application] → [OpenSSL/GmSSL] → [SM Engine]
                                        │
                            ┌───────────┼───────────┐
                            ▼           ▼           ▼
                    [SE协处理器]  [SM指令扩展]  [软件实现]

架构图

┌─────────────────────────────────────────────┐
│           应用程序 (TLS/IPSec/数字签名)      │
├─────────────────────────────────────────────┤
│         GmSSL / OpenSSL 国密引擎            │
│   ┌─────────────────────────────────────┐   │
│   │ SM2 │ SM3 │ SM4 │ ZUC              │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   硬件加速后端                               │
│   ┌────────┬────────┬────────┬──────────┐   │
│   │龙芯SE  │飞腾SMx │申威SMx │海光AES-NI│   │
│   │协处理器│指令扩展│原生指令│ +软实现  │   │
│   └────────┴────────┴───────┴──────────┘   │
├─────────────────────────────────────────────┤
│   CPU Core + 密码协处理器                    │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机 TLS 吞吐可达 10Gbps+;集群中作为密码加速节点可服务数千客户端

关联知识和法律法规

  • 关联知识:SM2/SM3/SM4 国标(GB/T 32918、GB/T 32905、GB/T 32907)、ARMv8.2 SM 扩展、龙芯 Security Engine

  • 法律法规:《密码法》、《网络安全法》、GM/T 0028《密码模块安全技术要求》



编号 11

类型

虚拟化扩展适配 · 系统层

信创硬件及国产化硬件

  • 飞腾 D3000(ARMv8,支持 VHE、GICv4 直通)

  • 龙芯 3C6000(LoongArch,LVZ 虚拟化扩展)

  • 海光 C86-5G(x86_64,AMD SVM/NPT)

信创及国产化软件

KVM 虚拟化 + 统信 UOS Server / 银河麒麟 Server

领域

硬件辅助虚拟化 · vCPU 调度

算法应用场景

在信创服务器上运行虚拟机(VM),需要利用芯片的虚拟化扩展实现高效 vCPU 调度、内存虚拟化(NPT/Stage-2 page tables)和设备直通。不同架构的虚拟化扩展差异显著:ARM 的 VHE(Virtualization Host Extensions)允许宿主内核直接在 EL2 运行,LoongArch 的 LVZ 提供类似的根/非根模式。

算法名称

多架构 KVM 虚拟化扩展适配算法(Multi-Arch KVM Virtualization Adaptation)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. KVM 模块初始化时探测 CPU 支持的虚拟化特性。

  2. 创建 VM 时配置 VMCS/VTCR/Guest 状态区域。

  3. vCPU 运行时通过 kvm_arch_vcpu_run 进入 Guest 模式,捕获敏感指令并模拟。

a. kvm_arch_hardware_enable() — 启用硬件虚拟化

  • 输入:int cpu

  • 输出:int ret

  • 伪代码:



int kvm_arch_hardware_enable(int cpu) {
#if defined(__aarch64__)
    /* 检查 VHE 支持 */
    uint64_t id_aa64mmfr1 = read_sysreg(ID_AA64MMFR1_EL1);
    if ((id_aa64mmfr1 >> 8) & 0xf) {
        /* VHE 可用,内核已在 EL2 */
        write_sysreg(read_sysreg(HCR_EL2) | HCR_TGE | HCR_E2H, HCR_EL2);
    } else {
        /* 经典模式,需切换到 EL2 */
        install_hyp_vector();
    }
#elif defined(__loongarch__)
    /* 检查 LVZ 扩展 */
    uint32_t cpucfg2 = la_cpucfg(2);
    if (!(cpucfg2 & (1 << 21))) return -ENODEV;  /* LVZ 不可用 */
    /* 配置 Guest CSR 寄存器 */
    write_csr_guest(CSR_GSTAT, 0);
    write_csr_guest(CSR_GCCTL, GCCTL_CFG);
#endif
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

b. kvm_arch_vcpu_load() — 加载 vCPU 上下文

  • 输入:struct kvm_vcpu *vcpu, int cpu

  • 输出:无

  • 伪代码:



void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) {
    /* 切换 Stage-2 页表 */
    switch (vcpu->kvm->arch.pgd) {
#if defined(__aarch64__)
        write_sysreg(vcpu->kvm->arch.vtcr, VTCR_EL2);
        __tlbi(vmalle1);
#elif defined(__loongarch__)
        write_csr_guest(vcpu->kvm->arch.gstage_pgd, CSR_GTLB);
        local_flush_tlb_all();
#endif
    }
    /* 加载 vCPU 的定时器和中断状态 */
    vgic_v3_load(vcpu);
    timer_load(vcpu);
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

kvm_arch_hardware_enable

O(1)

O(1)

kvm_arch_vcpu_load

O(1)

O(1)

kvm_arch_vcpu_put

O(1)

O(1)

时序流程图



QEMU 创建 VM → ioctl(KVM_CREATE_VM) → kvm_arch_create_vm
                    │
                    ▼
QEMU 添加 vCPU → ioctl(KVM_CREATE_VCPU) → kvm_arch_vcpu_init
                    │
                    ▼
QEMU 运行 vCPU → ioctl(KVM_RUN) → kvm_arch_vcpu_run
                    │
                    ▼
进入 Guest 模式 (EL2/根模式)
    │
    ├─ 捕获敏感指令 → 模拟返回
    ├─ 外部中断 → 退出到 Host
    └─ 定时器到期 → 退出到 Host

通信图



[QEMU] ↔ [KVM (/dev/kvm)] ↔ [Host Kernel]
                               │
                          [Hypervisor]
                               │
                    ┌──────────┼──────────┐
                    ▼          ▼          ▼
                [VM #1]   [VM #2]   [VM #3]

架构图



┌─────────────────────────────────────────────┐
│            QEMU / libvirt                    │
├─────────────────────────────────────────────┤
│            KVM Hypervisor                    │
│   ┌─────────────────────────────────────┐   │
│   │ ARM64 VHE / LoongArch LVZ / x86 SVM│   │
│   │ Stage-2 MMU / NPT / GVA→GPA        │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   CPU: 飞腾D3000 / 龙芯3C6000 / 海光C86    │
│   GICv4 / LVZ / AMD-V                      │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机可运行数十个 VM;集群通过 OpenStack 管理数千 VM

关联知识和法律法规

  • 关联知识:ARM VHE、LoongArch LVZ、AMD SVM/NPT、Stage-2 页表

  • 法律法规:等保 2.0 虚拟化安全扩展要求


编号 12

类型

NUMA 感知与内存拓扑适配 · 系统层

信创硬件及国产化硬件

  • 飞腾 D3000(多 Die NUMA,每 Die 4 核,DDR5 本地通道)

  • 龙芯 3C6000(多芯片互联,HT 总线,NUMA 节点间延迟差异大)

  • 申威 SW831(多路 SMP,NUMA 架构)

信创及国产化软件

统信 UOS、银河麒麟 V10、OpenEuler

领域

内存管理 · NUMA 调度

算法应用场景

现代国产服务器普遍采用 NUMA 架构,访问本地内存延迟远低于远端内存。操作系统需要识别 NUMA 拓扑,在进程调度和内存分配时尽量保持本地性,避免跨片访问导致的性能下降。飞腾 D3000 的 Die 间延迟约 1.5 倍本地延迟,龙芯 HT 总线延迟约 2 倍。

算法名称

NUMA 拓扑发现与感知调度算法(NUMA Topology Discovery & Aware Scheduling)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 从 ACPI SRAT/SLIT 表或设备树读取 NUMA 距离矩阵。

  2. 为每个 NUMA 节点维护空闲内存列表。

  3. 进程调度时优先选择与上次运行相同的节点,内存分配时优先本地节点。

a. numa_topology_init() — 初始化 NUMA 拓扑

  • 输入:struct acpi_table_header *srat, *slit

  • 输出:int num_nodes

  • 伪代码:



int numa_topology_init(struct acpi_table_header *srat, struct acpi_table_header *slit) {
    /* 解析 SRAT 获取 CPU 和内存亲和性 */
    struct acpi_srat *srat_tbl = (struct acpi_srat *)srat;
    for (int i = 0; i < srat_tbl->num_entries; i++) {
        struct acpi_srat_entry *entry = &srat_tbl->entries[i];
        if (entry->type == ACPI_SRAT_CPU_AFFINITY) {
            int node = entry->proximity_domain;
            int cpu = entry->apic_id;
            set_cpu_numa_node(cpu, node);
        } else if (entry->type == ACPI_SRAT_MEM_AFFINITY) {
            int node = entry->proximity_domain;
            add_memory_to_node(node, entry->base_addr, entry->length);
        }
    }
    /* 解析 SLIT 获取距离矩阵 */
    memcpy(numa_distance_matrix, slit->entry, slit->length - sizeof(*slit));
    return srat_tbl->num_nodes;
}
  • 时间复杂度 O(e)(e 为 SRAT 条目数,典型 50-200),空间复杂度 O(n²)(n 为节点数),逻辑复杂度:中

b. alloc_pages_node() — 指定节点内存分配

  • 输入:int node, gfp_t flags, unsigned int order

  • 输出:struct page *page

  • 伪代码:



struct page *alloc_pages_node(int node, gfp_t flags, unsigned int order) {
    struct pglist_data *pgdat = NODE_DATA(node);
    struct page *page = __rmqueue(pgdat, flags, order);
    if (!page && !(flags & __GFP_THISNODE)) {
        /* 本地失败,尝试就近节点 */
        int nearest = find_nearest_node(node);
        page = alloc_pages_node(nearest, flags, order);
    }
    return page;
}
  • 时间复杂度 O(log n)(伙伴系统搜索),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

numa_topology_init

O(e)

O(n²)

alloc_pages_node

O(log n)

O(1)

numa_sched_balance

O(n)

O(1)

时序流程图



系统启动 → ACPI解析 → SRAT/SLIT → 构建NUMA节点
    │
    ▼
进程创建 → 选择最近节点 → 分配本地内存
    │
    ▼
运行中 → 缺页 → 按节点分配物理页
    │
    ▼
负载均衡 → 跨节点迁移任务

通信图



[CPU 0 (Node 0)] ←→ [Local Memory (Node 0)]
    │                        │
    │  (Cross-socket)        │
    ▼                        ▼
[CPU 1 (Node 1)] ←→ [Local Memory (Node 1)]

架构图



┌─────────────────────────────────────────────┐
│            NUMA Scheduler                    │
│   ┌─────────────────────────────────────┐   │
│   │ Node 0 (CPU 0-3, Mem 0-32GB)       │   │
│   │ Node 1 (CPU 4-7, Mem 32-64GB)      │   │
│   │ Distance Matrix:                    │   │
│   │   Node0↔Node0: 10                  │   │
│   │   Node0↔Node1: 20                  │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   CPU: 飞腾D3000 2-Die / 龙芯3C6000 4-chip │
│   Interconnect: HT 3.0 / CCIX               │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机支持 8 节点 NUMA;集群中每个节点独立 NUMA 拓扑

关联知识和法律法规

  • 关联知识:ACPI SRAT/SLIT、NUMA 距离、伙伴系统、进程负载均衡

  • 法律法规:等保 2.0 性能监控要求


编号 13

类型

容器运行时隔离适配 · 虚拟化层

信创硬件及国产化硬件

  • 飞腾 D3000(ARMv8,支持硬件虚拟化扩展用于 Kata Containers)

  • 龙芯 3C6000(LoongArch,LVZ 扩展可用于轻量级 VM)

  • 申威 SW831(SW64,支持 Docker 原生运行)

信创及国产化软件

Docker / Podman / Kata Containers + 统信 UOS

领域

容器 · 安全隔离

算法应用场景

容器在信创平台上需要安全隔离。Kata Containers 利用硬件虚拟化为每个容器提供轻量级 VM,实现内核级隔离。不同架构的虚拟化扩展差异导致 Kata 的 runtime 实现不同。

算法名称

多架构 Kata Containers 轻量级 VM 适配算法(Multi-Arch Kata Containers VM Adaptation)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. Kata Runtime 启动一个轻量级 VM(使用 Firecracker 或 QEMU)。

  2. VM 内运行精简内核和 rootfs,容器进程作为 VM 内 init 进程。

  3. 通过 virtio 设备与宿主机通信(网络、存储)。

a. kata_create_vm() — 创建 Kata VM

  • 输入:struct kata_config *cfg

  • 输出:struct kata_vm *vm

  • 参数数值设计:vCPU 数 1-4,内存 128MB-2GB,内核路径 /usr/share/kata-containers/vmlinux

  • 伪代码:



struct kata_vm *kata_create_vm(struct kata_config *cfg) {
    struct kata_vm *vm = kzalloc(sizeof(*vm));
    /* 启动 QEMU 或 Firecracker */
    vm->pid = fork();
    if (vm->pid == 0) {
        /* 子进程 exec hypervisor */
        char *args[] = {
            "/usr/bin/qemu-system-aarch64",
            "-machine", "virt,gic-version=3",
            "-cpu", "host",
            "-smp", cfg->vcpus,
            "-m", cfg->memory,
            "-kernel", cfg->kernel_path,
            "-append", "console=ttyAMA0",
            "-device", "virtio-net-pci,netdev=net0",
            "-netdev", "user,id=net0",
            "-drive", "file=/dev/nbd0,if=none,id=drive0",
            "-device", "virtio-blk-pci,drive=drive0",
            NULL
        };
        execvp(args[0], args);
    }
    /* 等待 VM 就绪 */
    wait_for_vm_ready(vm);
    return vm;
}
  • 时间复杂度 O(1)(fork+exec),空间复杂度 O(1),逻辑复杂度:高

b. kata_run_container() — 在 VM 内运行容器

  • 输入:struct kata_vm *vm, struct container_spec *spec

  • 输出:int pid

  • 伪代码:



int kata_run_container(struct kata_vm *vm, struct container_spec *spec) {
    /* 通过 vsock 或 virtio-serial 发送命令 */
    struct kata_command cmd = {
        .type = RUN_CONTAINER,
        .image = spec->image,
        .cmdline = spec->cmd,
        .env = spec->env,
    };
    write(vm->vsock_fd, &cmd, sizeof(cmd));
    /* 读取容器 PID */
    int container_pid;
    read(vm->vsock_fd, &container_pid, sizeof(container_pid));
    return container_pid;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

kata_create_vm

O(1)

O(1)

kata_run_container

O(1)

O(1)

kata_destroy_vm

O(1)

O(1)

时序流程图



kata-runtime run
    │
    ▼
创建 VM (QEMU/Firecracker)
    │
    ▼
VM 启动精简内核
    │
    ▼
启动 agent (kata-agent)
    │
    ▼
接收容器规格 → pull 镜像 → 创建容器进程
    │
    ▼
容器运行

通信图



[Host] ↔ [Kata Shim] ↔ [VM (QEMU)] ↔ [Guest Kernel] ↔ [Container Process]
                           ↑
                      [virtio devices]

架构图



┌─────────────────────────────────────────────┐
│            Host Kernel                       │
│   ┌─────────────────────────────────────┐   │
│   │ Kata Shim (containerd-shim-kata-v2) │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   ┌─────────────────────────────────────┐   │
│   │ VM #1 (QEMU aarch64)                │   │
│   │ ┌───────────────────────────────┐   │   │
│   │ │ Guest Kernel + kata-agent     │   │   │
│   │ │ ┌─────────────────────────┐   │   │   │
│   │ │ │ Container Process       │   │   │   │
│   │ │ └─────────────────────────┘   │   │   │
│   │ └───────────────────────────────┘   │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   CPU: 飞腾D3000 / 龙芯3C6000               │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机可运行数十个 Kata VM;集群通过 Kubernetes 管理

关联知识和法律法规

  • 关联知识:Kata Containers、Firecracker、virtio、vsock

  • 法律法规:等保 2.0 容器安全要求


编号 14

类型

文件系统与块设备适配 · 存储层

信创硬件及国产化硬件

  • 飞腾 D3000(集成 SATA/NVMe 控制器,支持 AHCI)

  • 龙芯 3C6000(集成 SATA 3.0 控制器,支持 NCQ)

  • 申威 SW831(集成 SAS 控制器,支持 RAID)

信创及国产化软件

统信 UOS、银河麒麟 V10(ext4/xfs/btrfs)

领域

块设备 · I/O 调度

算法应用场景

国产 SoC 集成的存储控制器存在寄存器差异,操作系统需要适配不同控制器的 DMA 描述符格式、中断处理方式和命令队列深度。NVMe 驱动相对标准化,但 SATA/AHCI 控制器可能存在时序差异。

算法名称

国产存储控制器适配与 I/O 调度算法(Domestic Storage Controller Adaptation & IO Scheduler)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 探测 AHCI/SATA 控制器的端口数量和能力。

  2. 配置 DMA 描述符环(Command List + Received FIS)。

  3. I/O 调度器(如 mq-deadline)按 LBA 排序请求以减少寻道时间。

a. ahci_port_init() — AHCI 端口初始化

  • 输入:struct ahci_host_priv *hpriv, int port

  • 输出:int ret

  • 参数数值设计:AHCI 基址 0x22000000(飞腾典型值),端口数 2-6

  • 伪代码:



int ahci_port_init(struct ahci_host_priv *hpriv, int port) {
    void __iomem *port_mmio = hpriv->mmio + 0x100 + port * 0x80;
    /* 复位端口 */
    writel(PORT_CMD_FIS_RX | PORT_CMD_START, port_mmio + PORT_CMD);
    udelay(10);
    /* 配置 Command List 基址 */
    dma_addr_t clb = dma_alloc_coherent(...);
    writel(lower_32_bits(clb), port_mmio + PORT_CLB);
    writel(upper_32_bits(clb), port_mmio + PORT_CLBU);
    /* 配置 Received FIS 基址 */
    dma_addr_t fb = dma_alloc_coherent(...);
    writel(lower_32_bits(fb), port_mmio + PORT_FB);
    writel(upper_32_bits(fb), port_mmio + PORT_FBU);
    /* 使能中断 */
    writel(PORT_IRQ_D2H_REG_FIS | PORT_IRQ_PIOS_FIS, port_mmio + PORT_IRQ_MASK);
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

b. nvme_queue_rq() — NVMe 命令提交

  • 输入:struct nvme_queue *nvmeq, struct request *req

  • 输出:blk_status_t

  • 伪代码:



blk_status_t nvme_queue_rq(struct nvme_queue *nvmeq, struct request *req) {
    struct nvme_command *cmnd = nvme_alloc_command(nvmeq);
    /* 填充命令 */
    cmnd->rw.opcode = nvme_cmd_read;
    cmnd->rw.nsid = req->nsid;
    cmnd->rw.slba = cpu_to_le64(blk_rq_pos(req));
    cmnd->rw.length = cpu_to_le16(blk_rq_sectors(req) >> (ilog2(NVME_LOGICAL_BLOCK_SIZE) - 9));
    /* 设置 PRP 列表 */
    nvme_setup_prps(nvmeq, req, cmnd);
    /* 写门铃寄存器通知控制器 */
    writel(nvmeq->sq_tail, nvmeq->q_db);
    return BLK_STS_OK;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

ahci_port_init

O(1)

O(1)

nvme_queue_rq

O(1)

O(1)

deadline_dispatch

O(log n)

O(n)

时序流程图



应用程序发起读写
    │
    ▼
VFS → 文件系统 → 块层
    │
    ▼
I/O 调度器 (mq-deadline)
    │
    ▼
NVMe/AHCI 驱动 → 提交命令到队列
    │
    ▼
控制器处理 → DMA 传输 → 完成中断

通信图



[Application] → [VFS] → [File System] → [Block Layer]
                                            │
                                    [I/O Scheduler]
                                            │
                                    [NVMe/AHCI Driver]
                                            │
                                    [Storage Controller]

架构图



┌─────────────────────────────────────────────┐
│            Application                       │
├─────────────────────────────────────────────┤
│            File System (ext4/xfs)            │
├─────────────────────────────────────────────┤
│            Block Layer                       │
│   ┌─────────────────────────────────────┐   │
│   │ mq-deadline / none / kyber         │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   ┌──────────┐ ┌──────────┐ ┌──────────┐   │
│   │ NVMe     │ │ AHCI    │ │ SAS      │   │
│   │ (飞腾)   │ │ (龙芯)  │ │ (申威)   │   │
│   └──────────┘ └──────────┘ └──────────┘   │
├─────────────────────────────────────────────┤
│   SSD / HDD / NVMe                          │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机支持数十块盘;集群通过 SAN/NAS 扩展

关联知识和法律法规

  • 关联知识:AHCI 1.3.1、NVMe 1.4、NCQ、PRP/SGL、I/O 调度算法

  • 法律法规:GB/T 22239-2019 数据备份与恢复要求


编号 15

类型

网络协议栈卸载适配 · 网络层

信创硬件及国产化硬件

  • 飞腾 D3000(集成 GMAC 千兆网卡,支持 TCP Segmentation Offload)

  • 龙芯 3C6000(集成 GMAC,支持 Checksum Offload)

  • 海光 C86-5G(集成 Intel I210 兼容 MAC)

信创及国产化软件

统信 UOS、银河麒麟 V10(Linux 网络协议栈)

领域

网络 · 硬件卸载

算法应用场景

国产 SoC 集成的 MAC 控制器通常支持有限的硬件卸载能力(如 TCP/UDP 校验和计算、TCP 分段卸载 TSO、大接收卸载 LRO)。操作系统需要在驱动中正确配置这些卸载特性,避免协议栈重复计算,提升网络吞吐。

算法名称

国产 MAC 控制器卸载能力探测与配置算法(Domestic MAC Offload Capability Probe & Config)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 读取 MAC 控制器的能力寄存器。

  2. 根据能力设置 net_devicefeatures 标志。

  3. 在 xmit 函数中根据 skb 的协议类型设置描述符的卸载标志。

a. phy_gmac_probe_caps() — 探测 GMAC 卸载能力

  • 输入:struct platform_device *pdev

  • 输出:netdev_features_t features

  • 伪代码:



netdev_features_t phy_gmac_probe_caps(struct platform_device *pdev) {
    void __iomem *base = platform_get_resource(pdev)->start;
    uint32_t hw_feat = readl(base + GMAC_HW_FEATURE);
    netdev_features_t feat = NETIF_F_SG | NETIF_F_HIGHDMA;
    if (hw_feat & GMAC_HW_TX_COE) feat |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
    if (hw_feat & GMAC_HW_RX_COE) feat |= NETIF_F_RXCSUM;
    if (hw_feat & GMAC_HW_TSO)    feat |= NETIF_F_TSO | NETIF_F_TSO6;
    if (hw_feat & GMAC_HW_LRO)    feat |= NETIF_F_LRO;
    return feat;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:低

b. gmac_start_xmit() — 发送报文(含卸载)

  • 输入:struct sk_buff *skb, struct net_device *dev

  • 输出:netdev_tx_t

  • 伪代码:



netdev_tx_t gmac_start_xmit(struct sk_buff *skb, struct net_device *dev) {
    struct gmac_priv *priv = netdev_priv(dev);
    struct dma_desc *desc = &priv->tx_ring[priv->tx_cur];
    /* 填充描述符 */
    desc->addr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE);
    desc->len = skb->len;
    /* 设置卸载标志 */
    if (skb->ip_summed == CHECKSUM_PARTIAL) {
        desc->flags |= DESC_FLAG_TX_CSUM;
        desc->csum_offset = skb_checksum_start_offset(skb);
        desc->csum_start = skb_transport_offset(skb);
    }
    if (skb_is_gso(skb)) {
        desc->flags |= DESC_FLAG_TSO;
        desc->mss = skb_shinfo(skb)->gso_size;
    }
    /* 触发发送 */
    priv->tx_cur = (priv->tx_cur + 1) % TX_RING_SIZE;
    writel(priv->tx_cur, priv->mmio + GMAC_DMA_TX_POLL);
    return NETDEV_TX_OK;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

phy_gmac_probe_caps

O(1)

O(1)

gmac_start_xmit

O(1)

O(1)

gmac_interrupt

O(n)

O(1)

时序流程图



应用程序 send()
    │
    ▼
TCP 协议栈 → 构造 skb
    │
    ▼
dev_queue_xmit → 驱动 xmit
    │
    ▼
GMAC 硬件 → 计算校验和/分段 → DMA 发送
    │
    ▼
发送完成中断 → 回收 skb

通信图



[Application] → [Socket] → [TCP/IP Stack] → [Driver] → [GMAC MAC]
                                                    ↑
                                               [Offload Features]

架构图



┌─────────────────────────────────────────────┐
│            Application                       │
├─────────────────────────────────────────────┤
│            TCP/IP Stack                      │
│   ┌─────────────────────────────────────┐   │
│   │ Checksum (可选卸载)                 │   │
│   │ TSO (可选卸载)                      │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│            GMAC Driver                      │
│   ┌─────────────────────────────────────┐   │
│   │ TX Descriptor Setup                 │   │
│   │ RX Descriptor Recycle               │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   SoC: 飞腾D3000 GMAC / 龙芯3C6000 GMAC    │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机千兆/万兆线速转发;集群中作为接入交换机上行

关联知识和法律法规

  • 关联知识:TCP/IP 卸载、TSO/LRO/GRO、Checksum Offload、DMA 描述符

  • 法律法规:GB/T 22239-2019 网络安全审计要求


编号 16

类型

GPU 显示与加速适配 · 图形层

信创硬件及国产化硬件

  • 景嘉微 JM9231/JM9100(国产 GPU,支持 OpenGL 4.5 / Vulkan 1.1)

  • 摩尔线程 S2000(国产 GPU,支持 DirectX 11 / Vulkan)

  • 芯动科技风华系列(国产 GPU)

信创及国产化软件

统信 UOS、银河麒麟 V10(Xorg/Wayland + mesa 驱动)

领域

图形显示 · GPU 计算

算法应用场景

国产 GPU 需要完整的 DRM/KMS 驱动和用户态 mesa 驱动才能在信创操作系统上提供图形界面和加速能力。驱动需要处理帧缓冲管理、模式设置、GPU 命令提交、内存管理等。

算法名称

国产 GPU DRM/KMS 驱动适配与命令提交算法(Domestic GPU DRM/KMS Driver Adaptation)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. 注册 DRM 设备,实现 struct drm_driver 回调。

  2. 实现 KMS(Kernel Mode Setting)接口:crtc_initencoder_initconnector_init

  3. GPU 命令通过 ring buffer 提交,硬件调度执行。

a. jm_gpu_init() — 景嘉微 GPU 初始化

  • 输入:struct drm_device *dev

  • 输出:int ret

  • 伪代码:



int jm_gpu_init(struct drm_device *dev) {
    struct jm_private *priv = dev->dev_private;
    /* 映射 MMIO 寄存器 */
    priv->mmio = ioremap(0x38000000, 0x100000);
    /* 复位 GPU */
    writel(1, priv->mmio + JM_RESET);
    mdelay(10);
    writel(0, priv->mmio + JM_RESET);
    /* 初始化命令环 */
    priv->ring = dma_alloc_coherent(dev->dev, RING_SIZE, &priv->ring_dma, GFP_KERNEL);
    writel(priv->ring_dma, priv->mmio + JM_RING_BASE);
    writel(RING_SIZE, priv->mmio + JM_RING_SIZE);
    /* 初始化显示控制器 */
    jm_crtc_init(dev);
    jm_encoder_init(dev);
    jm_connector_init(dev);
    return 0;
}
  • 时间复杂度 O(1),空间复杂度 O(1),逻辑复杂度:高

b. jm_submit_command() — 提交 GPU 命令

  • 输入:struct drm_file *file_priv, struct drm_jm_exec *exec

  • 输出:int ret

  • 伪代码:



int jm_submit_command(struct drm_file *file_priv, struct drm_jm_exec *exec) {
    struct jm_private *priv = file_priv->minor->dev->dev_private;
    /* 拷贝用户态命令到 ring buffer */
    uint32_t *ring_ptr = priv->ring + priv->ring_head;
    copy_from_user(ring_ptr, exec->commands, exec->command_len);
    /* 更新 head 指针 */
    priv->ring_head = (priv->ring_head + exec->command_len) & (RING_SIZE - 1);
    writel(priv->ring_head, priv->mmio + JM_RING_HEAD);
    /* 等待硬件完成(轮询 tail 指针) */
    while (readl(priv->mmio + JM_RING_TAIL) != priv->ring_head)
        cpu_relax();
    return 0;
}
  • 时间复杂度 O(n)(n 为命令长度),空间复杂度 O(1),逻辑复杂度:中

复杂度汇总

函数

时间

空间

逻辑

jm_gpu_init

O(1)

O(1)

jm_submit_command

O(n)

O(1)

jm_crtc_mode_set

O(1)

O(1)

时序流程图



Xorg/Wayland 启动 → 打开 /dev/dri/card0
    │
    ▼
DRM 驱动初始化 → GPU 复位 → 显示控制器初始化
    │
    ▼
应用程序调用 OpenGL → mesa 生成命令
    │
    ▼
ioctl(DRM_IOCTL_JM_EXEC) → 命令提交到 ring
    │
    ▼
GPU 硬件执行 → 渲染完成 → 中断通知

通信图



[Application] → [mesa] → [DRM Driver] → [GPU Hardware]
                               ↑
                          [Ring Buffer]

架构图



┌─────────────────────────────────────────────┐
│            Application (GUI/游戏)            │
├─────────────────────────────────────────────┤
│            Mesa (OpenGL/Vulkan)              │
├─────────────────────────────────────────────┤
│            DRM/KMS Driver                   │
│   ┌─────────────────────────────────────┐   │
│   │ CRTC │ Encoder │ Connector         │   │
│   │ Command Ring │ FB Management       │   │
│   └─────────────────────────────────────┘   │
├─────────────────────────────────────────────┤
│   GPU: 景嘉微JM9231 / 摩尔线程S2000         │
│   DisplayPort / HDMI / VGA                  │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机单用户桌面;服务器场景下通过 GPU 虚拟化服务多用户

关联知识和法律法规

  • 关联知识:DRM/KMS、mesa、OpenGL/Vulkan、GPU 命令调度

  • 法律法规:GB/T 22239-2019 图形界面安全要求


编号 17

类型

安全启动与固件验证 · 安全层

信创硬件及国产化硬件

  • 飞腾 D3000(支持 TrustZone,内置 BootROM 签名验证)

  • 龙芯 3C6000(内置 TCM 可信密码模块,支持安全启动)

  • 申威 SW831(支持 UEFI Secure Boot)

信创及国产化软件

昆仑 BIOS(支持 Secure Boot)+ 统信 UOS / 银河麒麟 V10

领域

可信启动 · 固件安全

算法应用场景

从 BootROM 到 OS 内核的启动链中,每个组件都需要被签名验证,防止恶意固件或内核被加载。国产芯片通常集成硬件信任根(如飞腾的 BootROM 签名校验、龙芯的 TCM),操作系统需要配合固件实现 UEFI Secure Boot 或类似机制。

算法名称

多架构 UEFI Secure Boot 链式验证算法(Multi-Arch UEFI Secure Boot Chain Verification)

算法中的函数列表及每个函数逐步推理思考的数学表达式及函数调用关系及参数列表及参数数值设计及每个函数的完整代码及数学复杂度

推理思路

  1. BootROM 验证固件(如 U-Boot 或 UEFI)的签名。

  2. UEFI 验证 Option ROM、bootloader 的签名。

  3. bootloader(如 GRUB)验证内核和 initramfs 的签名。

  4. 内核验证内核模块的签名。

a. secure_boot_verify_image() — 验证镜像签名

  • 输入:const void *image, size_t image_len, const void *sig, size_t sig_len, const void *cert

  • 输出:bool valid

  • 数学表达式:valid=SM2_Verify(cert,image,sig)

  • 伪代码:



bool secure_boot_verify_image(const void *image, size_t image_len,
                              const void *sig, size_t sig_len,
                              const void *cert) {
    /* 解析证书获取公钥 */
    struct x509_cert *x509 = x509_parse(cert);
    /* 计算镜像哈希 */
    uint8_t hash[32];
    sm3_hash(image, image_len, hash);
    /* SM2 签名验证 */
    int ret = sm2_verify(x509->pub_key, hash, sig, sig_len);
    return ret == 0;
}
  • 时间复杂度 O(image_len)(哈希计算),空间复杂度 O(1),逻辑复杂度:中

b. efi_signature_list_verify() — 验证 EFI 签名列表

  • 输入:const void *db, size_t db_size

  • 输出:bool valid

  • 伪代码:



bool efi_signature_list_verify(const void *db, size_t db_size) {
    struct efi_signature_list *list = (struct efi_signature_list *)db;
    if (list->type != EFI_CERT_SHA256_GUID) return false;
    /* 遍历签名列表 */
    uint8_t *sig_data = list->signatures;
    for (int i = 0; i < list->num_signatures; i++) {
        struct efi_signature_data *sig = (struct efi_signature_data *)sig_data;
        /* 比较哈希 */
        if (memcmp(sig->hash, expected_hash, 32) == 0)
            return true;
        sig_data += sizeof(*sig) + sig->size;
    }
    return false;
}
  • 时间复杂度 O(n)(n 为签名数),空间复杂度 O(1),逻辑复杂度:低

复杂度汇总

函数

时间

空间

逻辑

secure_boot_verify_image

O(L)

O(1)

efi_signature_list_verify

O(n)

O(1)

shim_verify_kernel

O(L)

O(1)

时序流程图



BootROM → 验证固件签名 → 固件
    │
    ▼
固件 → 验证Option ROM签名 → 加载Option ROM
    │
    ▼
GRUB → 验证内核签名 → 加载内核
    │
    ▼
内核 → 验证模块签名 → 加载模块

通信图



[BootROM] → [UEFI FW] → [GRUB] → [Kernel] → [Module]
    ↑           ↑          ↑         ↑           ↑
[Hardware]  [FW DB]   [Shim]   [IMA]     [modsign]

架构图



┌─────────────────────────────────────────────┐
│            OS Kernel (IMA + module sign)    │
├─────────────────────────────────────────────┤
│            GRUB (shim + kernel sign)        │
├─────────────────────────────────────────────┤
│            UEFI Firmware (Secure Boot DB)   │
├─────────────────────────────────────────────┤
│            BootROM (硬件信任根)               │
├─────────────────────────────────────────────┤
│   CPU: 飞腾D3000 TrustZone / 龙芯TCM       │
└─────────────────────────────────────────────┘

满足的用户/管理员规模

单机;企业级部署中通过 PKI 管理所有节点的密钥

关联知识和法律法规

  • 关联知识:UEFI Secure Boot、SM2/SM3 签名、IMA、modsign、PKI

  • 法律法规:《密码法》、《网络安全法》、等保 2.0 可信验证要求


编号 18

类型

电源管理与能耗优化 · 系统层

信创硬件及国产化硬件

  • **飞腾 D300

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐