Clang编译MAME0289成功

<p>由于最新版的mame代码使用了一些c++20的新特性,为了避免配置尝试用clang编译mame源码</p> <p>由于clang对类型的检查相对严格,首先编辑一些在clang中无法通过编译的部分,以及一些在龙架构中会导致运行错误的部分</p> <blockquote class="uncited"><div><p>diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp<br> index 0d514451..678fd830 100644<br> --- a/src/devices/cpu/drcbec.cpp<br> +++ b/src/devices/cpu/drcbec.cpp<br> @@ -21,7 +21,7 @@<br> #include &lt;cfenv&gt;<br> #include &lt;cmath&gt;</p> <p>-#if defined(<strong>clang_major</strong>) &amp;&amp; (<strong>clang_major</strong> &lt; 12)<br> +#if defined(<strong>clang_major</strong>) &amp;&amp; (<strong>clang_major</strong> &lt; 20)<br> // can't guarantee floating point environment control works<br> #else<br> #pragma STDC FENV_ACCESS ON<br> diff --git a/src/emu/audio_effects/eq.cpp b/src/emu/audio_effects/eq.cpp<br> index 59b17dcc..c852bb49 100644<br> --- a/src/emu/audio_effects/eq.cpp<br> +++ b/src/emu/audio_effects/eq.cpp<br> @@ -243,7 +243,7 @@ void audio_effect_eq::build_low_shelf(u32 band)<br> float sr = m_sample_rate;<br> float f = std::clamp(float(m_f[band]), 1.0f, sr/2.0f - 1.0f);</p> <ul><li>float V = pow(10, abs(m_db[band])/20);</li> <li>float V = pow(10, fabs(m_db[band])/20);<br> float K = tan(std::numbers::pi * f / sr);<br> float K2 = K*K;</li></ul> <p>diff --git a/src/lib/util/delegate.h b/src/lib/util/delegate.h<br> index d1f778a3..1c8d1e9d 100644<br> --- a/src/lib/util/delegate.h<br> +++ b/src/lib/util/delegate.h<br> @@ -146,6 +146,8 @@<br> #define MAME_DELEGATE_USE_TYPE MAME_DELEGATE_TYPE_COMPATIBLE<br> #elif defined(<strong>clang</strong>) &amp;&amp; defined(<strong>i386</strong>) &amp;&amp; defined(_WIN32)<br> #define MAME_DELEGATE_USE_TYPE MAME_DELEGATE_TYPE_COMPATIBLE</p> <ul><li>#elif defined(<strong>loongarch</strong>)</li> <li>#define MAME_DELEGATE_USE_TYPE MAME_DELEGATE_TYPE_COMPATIBLE<br> #else<br> #define MAME_DELEGATE_USE_TYPE MAME_DELEGATE_TYPE_ITANIUM<br> #endif</li></ul></div></blockquote> <p>makefile不需要更改,clang中包含了-m64等参数的支持,但是运行make命令时要在命令行中指明要使用clang编译,配置为64位,code model为medium</p> <p><code>PTR64=1 CFLAGS='-mcmodel=medium' LDFLAGS='-mcmodel=medium' OVERRIDE_CC=clang OVERRIDE_CXX=clang++ OVERRIDE_LD=lld OVERRIDE_AR=llvm-ar make</code></p>

2026/8/11
阅读更多

请问为何龙芯版Java25跑Swing程序严重卡顿

<p>Java Swing可以说是能同时兼容新旧世界和Windows的最佳方案了,但是最新的Java25 LTS跑Swing程序严重卡顿,Netbeans更是卡到没法用,请问是不是在跑Swing时需要打开某个选项?还是需要配置编译参数重新编译?</p> <p>多谢了</p>

2026/7/31
阅读更多

龙芯2K3000&3B6000M的GPGPU一些参数

<p>先放老胡PPT里面GPGPU的图</p> <p><img class="FoFUpload--Upl-Image-Preview" src="https://imgproxy.citrusreader.com/21RSa3Bp1Hv4OsMpjeqroigSODHQMmsujeFESgSkjyk/raw:1/aHR0cHM6Ly9sYXVvc2MuY24vYXNzZXRzL2ZpbGVzLzIwMjYtMDctMDUvMTc4MzI0MTE5My0yODA5ODItbG9vbmdzb24tZ3BncHUucG5n" title="loongson-gpgpu.png" alt data-id="65c2b1e8-562a-43d9-bb3f-6e7a122dbb57" loading="lazy" referrerpolicy="no-referrer"></p> <p>结合loonggpu驱动源码和部分猜测,对LG200的一些参数做了一些归纳</p> <p>2K3000内置的GPGPU有一个GPC(Graphics Process Cluster)</p> <p>这个GPC中有一个GP(图形管线,每周期16个像素),二个SP(Stream Processor)</p> <p>备注:每周期16个像素,说明图形管线配置了16个光栅化引擎ROPs,ROPs负责将片段(fragment)写入帧缓冲区<br> gpu工作频率 x 每周期像素填充个数 = 像素填充率</p> <p>显卡的实际工作能力,还受到纹理映射、着色器性能以及内存带宽的影响</p> <p>可以把LG200看作是支持硬件多线程,有8个SIMD核,每个核有16个通道的SIMD处理器?!</p> <p>20260704 添加:和loonggpu驱动代码的对应关系</p> <p>代码中的CU,对应SP(流处理器)<br> 代码中的SIMD,对应图里面的VU,向量单元</p> <pre><code>acu_info-&gt;simd_per_cu = 4; // 每个SP里面有4个VU acu_info-&gt;max_waves_per_simd = 10; // 每个VU里面最多可以有10个线程,实际/最大=占用率 acu_info-&gt;wave_front_size = 32; // 每个线程 32 个字节 acu_info-&gt;max_scratch_slots_per_cu = 40; // 每个SP最多线程数 40 个 acu_info-&gt;lds_size = 128; // 每个SP里面的高速缓存是 128KB</code></pre> <p>推算:高速缓存可以容纳 4K 个线程数据</p> <p>acu_info-&gt;number 是活跃的SP个数</p> <pre><code>if (adev-&gt;family_type == CHIP_LG100) // LG100 1个SP acu_info-&gt;number = 1; else if (adev-&gt;family_type == CHIP_LG200)  // LG200 2K3000/3B6000M 2个SP acu_info-&gt;number = 2; else if (adev-&gt;family_type == CHIP_LG210) // LG210 应该就是9A1000,8个SP acu_info-&gt;number = 8; else DRM_ERROR("%s Illegal Family type %d\n", __FUNCTION__, adev-&gt;family_type);</code></pre> <p>每个SP中,包含有4个VU(Vector Unit)和一个纹理单元(TPU,有纹理采样,坐标变换和过滤插值)</p> <p>备注:每个sp是可调度的独立的计算单元,提供纹理处理功能,可完成像素计算和着色。图形功能和AI计算都使用SP,同时工作存在资源竞争</p> <p>VU 是向量单元,有寄存器(堆),支持指令调度(乱序发射),支持单精度、双精度和矩阵计算</p> <ul><li>16个单精度ALU(相当于 CUDA核心),可提供16个通路,完成一次SIMD运算</li> <li>1个张量计算单元,16位/8位两个通路,支持矩阵计算</li> <li>1个双精度ALU,支持计算的一些后处理运算</li> <li>通过寄存器堆,支持乱序发射,提供指令调度功能</li></ul> <p>SP中实现对一批数据并行执行同样的操作,VU是其调度单元,指定多少VU参加并行计算。</p> <ul><li>图形管线中的着色器,每个节点至少分配一个VU,16个alu</li> <li>图形管线工作时,顶点、几何图元、像素着色等组件并行工作,至少需要5个VU</li> <li>每个SP里面有个共享的纹理单元,负责纹理采样(取坐标颜色)和法线贴图</li> <li>所以两个SP的VU都可参与图形渲染,两个纹理单元也参与像素渲染</li></ul> <p>SP中的计算单元:</p> <ul><li>每个VU中,都包含一个光线追踪RT单元和一个张量单元,共8个</li> <li>光线追踪单元每周期处理8条相干光线,完成BVH遍历和光线-三角形相交计算</li> <li>张量单元是一个 8x8x8 的乘加ALU脉动网格,组成脉动阵列,alu执行乘加操作,共8个,在一个周期内,两个8x8的二维数组,一下子就算完了</li> <li>特征数据横向加载,权重数据纵向注入,在脉动阵列里,进行连续乘加操作</li> <li>结果保存在64个专用的累加寄存器里,经FP16/INT8量化输出</li> <li>可以利用张量单元对RT单元的输出进行“推理”运算,得到高分辨率的光线追踪数据</li></ul> <p>数据流动:</p> <ul><li>张量计算,int8 和 bf16 走不同的数据通路</li> <li>张量计算和VU里面的16个alu走不同的数据通路,张量计算有自己的“缓存” <ul><li>根据不同的数据类型,选择不同的路径(fp32,fp64走vu里面的计算单元,int8,bf16走张量单元)</li></ul></li> <li>权重(Weights)- 模型数据 从左侧逐列“注入”阵列,沿列方向自上而下流动,每个时钟周期下移一行 = 二维矩阵的一行;</li> <li>激活值(Activations)-用户数据 从顶部逐行“注入”,沿行方向自左向右流动,每个时钟周期右移一列;</li> <li>乘积累加(MAC) 在每个ALU节点上持续进行:当一组权重和激活值在某节点相遇,即刻完成一次乘法并累加到局部寄存器中。</li></ul> <p><strong>那么2K3000的资源算下来:</strong></p> <p>1个GPC,1个GP,2个SP,8个VU,2个纹理,128个单精度ALU,8个双精度ALU,8个张量单元</p> <ul><li>理论上 LG200 8 x ( 8 x 8 x 8 ) x1Ghz = 8TOPS </li> <li>2k3000 800Mhz = 6.4TOPS</li> <li>3b6000m 900Mhz = 7.2TOPS</li></ul>

2026/7/5
阅读更多

龙芯 GPU loonggpu驱动完整启动流程

<h2>龙芯 GPU 驱动完整启动流程</h2> <p>根据提供的源码,以下是龙芯 GPU 驱动从内核引导到为用户提供渲染服务的完整流程。</p> <hr> <h2>一、整体架构分层</h2> <pre><code>┌─────────────────────────────────────────────────────────────────────────────┐ │ 用户空间 (Userspace) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │ │ │ OpenGL 应用 │ │ Vulkan 应用 │ │ DRM 客户端 (libdrm) │ │ │ └────────┬────────┘ └────────┬────────┘ └──────────────┬──────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────────┐│ │ │ DRM 核心 API (drm_ioctl) ││ │ └─────────────────────────────────────────────────────────────────────────┘│ ├─────────────────────────────────────────────────────────────────────────────┤ │ 内核空间 (Kernel) │ │ ┌─────────────────────────────────────────────────────────────────────────┐│ │ │ DRM 框架 (drm_drv.c) ││ │ └─────────────────────────────────────────────────────────────────────────┘│ │ │ │ │ ┌──────────────────────────────────┼──────────────────────────────────────┐│ │ │ 龙芯 GPU 驱动 (loonggpu) ││ │ │ ││ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ │ │ 显示子系统 │ │ 3D 引擎 │ │ 计算驱动 │ │ 内存管理 │ ││ │ │ │ (DC) │ │ (GFX) │ │ (KCD) │ │ (TTM/GEM) │ ││ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ ││ │ └──────────────────────────────────────────────────────────────────────────┘│ └─────────────────────────────────────────────────────────────────────────────┘</code></pre> <hr> <h2>二、完整启动流程</h2> <h3>阶段 1:内核模块加载</h3> <pre><code>1. modprobe loonggpu / insmod loonggpu.ko │ └── loonggpu_init() [loonggpu_drv.c] │ ├── 检查 VBIOS 支持 │ └── check_vbios_info() [loonggpu_dc_vbios.c] │ ├── 从 VRAM 读取 VBIOS │ ├── 从 ACPI VIAT 表读取 │ └── 从系统配置读取 │ ├── loonggpu_sync_init() [loonggpu_sync.c] │ └── 初始化同步对象 slab 缓存 │ ├── loonggpu_fence_slab_init() [loonggpu_fence.c] │ └── 初始化 fence slab 缓存 │ ├── loonggpu_lgkcd_init() [loonggpu_lgkcd.c] │ └── kgd2kcd_init() → 初始化计算驱动 │ ├── pci_register_driver(&amp;loonggpu_kms_pci_driver) │ └── loonggpu_pci_probe() → GPU 设备探测 │ └── pci_register_driver(&amp;loongson_vga_pci_driver) └── loongson_vga_pci_register() → DC 设备探测</code></pre> <h3>阶段 2:PCI 设备探测</h3> <pre><code>2. PCI 设备探测 (GPU) │ └── loonggpu_pci_probe() [loonggpu_drv.c] ├── pci_enable_device(pdev) └── 保存设备信息 (loongson_gpu_pdev) 3. PCI 设备探测 (DC) │ └── loongson_vga_pci_register() [loonggpu_drv.c] ├── pci_enable_device(pdev) │ ├── 识别芯片类型 │ ├── 0x7a46 → dev_2k3000 (2K3000) │ ├── 0x7a36 → dev_2k2000 (2K2000) │ └── 0x7a06 → dev_7a1000 (7A1000) │ ├── 选择寄存器集 │ ├── 2K3000 → gdc_reg = &amp;ls2k3000_dc_reg │ ├── 2K2000 → gdc_reg = &amp;ls7a2000_dc_reg │ └── 7A1000 → gdc_reg = &amp;ls7a1000_dc_reg │ ├── 禁用所有 CRTC │ └── 写 CRTC_CFG 清除 ENABLE 位 │ ├── lg_kick_out_firmware_fb() │ └── 移除冲突的 framebuffer │ ├── drm_dev_alloc() │ └── 分配 DRM 设备结构 │ └── drm_dev_register() └── loonggpu_driver_load_kms()</code></pre> <h3>阶段 3:DRM 驱动加载</h3> <pre><code>4. loonggpu_driver_load_kms() [loonggpu_kms.c] │ └── loonggpu_device_init() [loonggpu_device.c] │ ├── 基础初始化 │ ├── adev-&gt;dev = &amp;pdev-&gt;dev │ ├── adev-&gt;ddev = ddev │ ├── adev-&gt;pdev = pdev │ ├── adev-&gt;family_type = flags &amp; GAGPU_ASIC_MASK │ │ ├── CHIP_LG100 (7A2000 配套 GPU) │ │ ├── CHIP_LG200 (2K2000/2K3000 配套 GPU) │ │ └── CHIP_LG210 (9A1000 配套 GPU) │ └── adev-&gt;usec_timeout = LOONGGPU_MAX_USEC_TIMEOUT │ ├── 互斥锁初始化 │ ├── mutex_init(&amp;adev-&gt;gfx.gpu_clock_mutex) │ ├── mutex_init(&amp;adev-&gt;srbm_mutex) │ ├── mutex_init(&amp;adev-&gt;grbm_idx_mutex) │ └── spin_lock_init(&amp;adev-&gt;dc_mmio_lock) │ ├── 映射 MMIO 空间 │ ├── adev-&gt;rmmio = ioremap(rmmio_base, rmmio_size) // GPU 寄存器 │ └── adev-&gt;loongson_dc_rmmio = pci_iomap() // DC 寄存器 │ ├── loonggpu_device_ip_early_init() │ └── loonggpu_set_ip_blocks() [loonggpu_common.c] │ ├── loonggpu_common_ip_block (基础 IP) │ ├── mmu_ip_block (MMU/内存控制器) │ ├── zip_ip_block (压缩引擎) │ ├── loonggpu_ih_ip_block (中断处理) │ ├── dc_ip_block (显示控制器) │ ├── gfx_ip_block (3D 引擎) │ └── xdma_ip_block (DMA 引擎) │ ├── loonggpu_fence_driver_init() │ └── 初始化 fence 驱动 │ ├── drm_mode_config_init() │ └── 初始化 DRM 模式配置 │ ├── loonggpu_cp_init() [loonggpu_cp.c] │ ├── loonggpu_init_microcode() │ │ └── request_firmware("loonggpu/lg200_cp.bin") │ ├── loonggpu_cp_gfx_load_microcode() │ │ └── 加载 CP 固件到 GPU │ ├── loonggpu_cp_enable() │ │ └── 使能命令处理器 │ └── loonggpu_get_version() │ └── 读取 GPU 版本信息 │ ├── loonggpu_device_ip_init() │ ├── 各 IP 块 sw_init() │ │ ├── mmu_sw_init() → 内存控制器初始化 │ │ ├── zip_sw_init() → 压缩引擎初始化 │ │ ├── loonggpu_ih_sw_init() → 中断环初始化 │ │ ├── dc_sw_init() → 显示控制器初始化 │ │ ├── gfx_sw_init() → 3D 引擎初始化 │ │ └── xdma_sw_init() → DMA 引擎初始化 │ │ │ └── 各 IP 块 hw_init() │ ├── mmu_hw_init() → GART/MMU 使能 │ ├── zip_hw_init() → 压缩引擎使能 │ ├── loonggpu_ih_hw_init() → 中断使能 │ ├── dc_hw_init() → 显示控制器使能 │ ├── gfx_hw_init() → 3D 引擎使能 │ └── xdma_hw_init() → DMA 引擎使能 │ ├── loonggpu_fbdev_init() → FBDEV 控制台 ├── loonggpu_debugfs_init() → DebugFS 节点 └── loonggpu_device_ip_late_init() └── 延迟初始化 (IB 测试等)</code></pre> <h3>阶段 4:DC 显示控制器初始化</h3> <pre><code>5. dc_sw_init() [loonggpu_dc_drv.c] │ ├── 设置 DMA 掩码 │ └── dc_set_dma_consistent() │ ├── 初始化 TTM 内存管理 │ └── loonggpu_bo_init() │ ├── 初始化 VM 管理器 │ └── loonggpu_vm_manager_init() │ ├── dc_construct() │ ├── dc_vbios_init() │ │ ├── get_vbios_data() │ │ │ ├── read_bios_from_vram() │ │ │ ├── read_bios_from_acpi() │ │ │ └── read_bios_from_sysconf() │ │ ├── dc_vbios_parse() │ │ │ └── 解析描述符表 │ │ └── dc_vbios_show() │ │ │ └── dc_links_init() │ ├── dc_crtc_construct() → 创建 CRTC │ ├── dc_encoder_construct() → 创建编码器 │ └── dc_bridge_construct() → 创建桥接器 │ ├── 选择软件操作表 │ ├── 2K3000 → &amp;ls2k3000_dc_sw_ops │ ├── 2K2000 → &amp;ls2k2000_dc_sw_ops │ └── 7A2000 → &amp;ls7a2000_dc_sw_ops │ └── 拓扑初始化 └── sw_ops-&gt;dc_topology_init() ├── 2K3000: eDP + (HDMI/DP) ├── 2K2000: HDMI + DVO └── 7A2000: HDMI + HDMI 6. dc_hw_init() [loonggpu_dc_drv.c] │ ├── 选择硬件操作表 │ ├── 2K3000 → &amp;ls2k3000_dc_hw_ops │ ├── 2K2000 → &amp;ls2k2000_dc_hw_ops │ └── 7A2000 → &amp;ls7a2000_dc_hw_ops │ ├── dc_initialize_drm_device() │ ├── loonggpu_dc_plane_init() → 初始化 Plane │ ├── loonggpu_dc_crtc_init() → 初始化 CRTC │ └── loonggpu_dc_encoder_init() → 初始化编码器 │ ├── drm_vblank_init() │ └── 初始化 VBlank 处理 │ ├── dc_irq_sw_init() │ ├── loonggpu_dc_irq_init() │ └── dc_register_irq_handlers() │ ├── drm_mode_config_reset() ├── drm_kms_helper_poll_init() ├── loonggpu_dc_meta_set() └── dc_irq_hw_init()</code></pre> <h3>阶段 5:GFX 3D 引擎初始化</h3> <pre><code>7. gfx_sw_init() [loonggpu_gfx.c] │ ├── loonggpu_irq_add_id() │ └── 注册 EOP 中断 │ ├── 设置 GFX Ring │ └── loonggpu_ring_init() │ └── gfx_gpu_early_init() ├── 配置 GFX 参数 └── gfx_gpu_get_cu_info() ├── LG100: 1 CU ├── LG200: 2 CU (2K2000) └── LG210: 8 CU (2K3000) 8. gfx_hw_init() [loonggpu_gfx.c] │ └── gfx_cp_resume() ├── 配置 Ring Buffer ├── 设置基址/大小 └── ring-&gt;ready = true</code></pre> <h3>阶段 6:XDMA DMA 引擎初始化</h3> <pre><code>9. xdma_sw_init() [loonggpu_xdma.c] │ ├── loonggpu_irq_add_id() │ └── 注册 XDMA 中断 │ └── loonggpu_ring_init() └── 初始化 XDMA Ring 10. xdma_hw_init() [loonggpu_xdma.c] │ └── xdma_start() ├── xdma_enable(false) └── xdma_gfx_resume() ├── 配置 Ring Buffer ├── 设置基址/大小 └── ring-&gt;ready = true</code></pre> <h3>阶段 7:MMU 内存管理初始化</h3> <pre><code>11. mmu_sw_init() [loonggpu_mmu.c] │ ├── mmu_irq_set() │ └── 注册 MMU 页错误中断 │ ├── mmu_mc_init() │ ├── 设置 VRAM 基址/大小 │ └── 设置 GART 大小 │ ├── loonggpu_bo_init() │ └── loonggpu_ttm_init() │ ├── mmu_gart_init() │ ├── loonggpu_gart_init() │ └── loonggpu_gart_table_vram_alloc() │ └── loonggpu_vm_manager_init() 12. mmu_hw_init() [loonggpu_mmu.c] │ ├── mmu_gart_enable() │ ├── 设置 MMU 页表基址 │ ├── 设置安全页 │ ├── 配置页目录层级 │ └── 使能 MMU │ └── loonggpu_doorbell_enable()</code></pre> <h3>阶段 8:中断系统初始化</h3> <pre><code>13. loonggpu_ih_sw_init() [loonggpu_ih.c] │ ├── loonggpu_ih_ring_init() │ └── 分配中断环缓冲区 │ ├── loonggpu_irq_init() │ ├── pci_enable_msi() │ └── drm_irq_install() │ └── loonggpu_hw_sema_mgr_init() 14. loonggpu_ih_hw_init() [loonggpu_ih.c] │ └── loonggpu_ih_irq_init() ├── 配置中断环基址/大小 └── 使能中断</code></pre> <h3>阶段 9:KCD 计算驱动初始化</h3> <pre><code>15. loonggpu_lgkcd_device_probe() │ └── kgd2kcd_probe() 16. loonggpu_lgkcd_device_init() │ └── kgd2kcd_device_init() ├── 配置共享资源 │ ├── compute_vmid_bitmap │ ├── cp_queue_bitmap │ └── doorbell 配置 └── KCD 设备初始化</code></pre> <h3>阶段 10:用户空间服务准备</h3> <pre><code>17. 用户空间连接 │ ├── 应用打开 DRM 设备 │ └── loonggpu_driver_open_kms() [loonggpu_kms.c] │ ├── loonggpu_vm_init() → 创建 GPU VM │ └── loonggpu_ctx_mgr_init() │ ├── GEM 对象分配 │ └── loonggpu_gem_create_ioctl() [loonggpu_gem.c] │ └── loonggpu_gem_object_create() │ └── loonggpu_bo_create() │ ├── 命令提交 (CS) │ └── loonggpu_cs_ioctl() [loonggpu_cs.c] │ ├── loonggpu_cs_parser_init() │ ├── loonggpu_cs_ib_fill() │ ├── loonggpu_cs_parser_bos() │ ├── loonggpu_cs_dependencies() │ └── loonggpu_cs_submit() │ ├── loonggpu_ib_schedule() │ └── loonggpu_fence_emit() │ └── 渲染完成通知 └── loonggpu_fence_process() └── dma_fence_signal()</code></pre> <hr> <h2>三、关键函数调用链</h2> <h3>3.1 设备探测调用链</h3> <pre><code>loonggpu_init() ├── check_vbios_info() ├── pci_register_driver(&amp;loonggpu_kms_pci_driver) │ └── loonggpu_pci_probe() └── pci_register_driver(&amp;loongson_vga_pci_driver) └── loongson_vga_pci_register() ├── drm_dev_alloc() ├── drm_dev_register() └── loonggpu_driver_load_kms() └── loonggpu_device_init()</code></pre> <h3>3.2 IP 块初始化调用链</h3> <pre><code>loonggpu_device_init() ├── loonggpu_device_ip_early_init() │ └── loonggpu_set_ip_blocks() │ ├── loonggpu_device_ip_block_add(&amp;loonggpu_common_ip_block) │ ├── loonggpu_device_ip_block_add(&amp;mmu_ip_block) │ ├── loonggpu_device_ip_block_add(&amp;zip_ip_block) │ ├── loonggpu_device_ip_block_add(&amp;loonggpu_ih_ip_block) │ ├── loonggpu_device_ip_block_add(&amp;dc_ip_block) │ ├── loonggpu_device_ip_block_add(&amp;gfx_ip_block) │ └── loonggpu_device_ip_block_add(&amp;xdma_ip_block) │ └── loonggpu_device_ip_init() ├── 各 IP 块 sw_init() └── 各 IP 块 hw_init()</code></pre> <h3>3.3 命令提交调用链</h3> <pre><code>loonggpu_cs_ioctl() ├── loonggpu_cs_parser_init() │ └── loonggpu_ctx_get() │ ├── loonggpu_cs_ib_fill() │ └── loonggpu_ib_get() │ ├── loonggpu_cs_parser_bos() │ ├── loonggpu_bo_list_get() │ ├── ttm_eu_reserve_buffers() │ ├── loonggpu_vm_validate_pt_bos() │ └── loonggpu_cs_list_validate() │ ├── loonggpu_cs_dependencies() │ └── loonggpu_sync_fence() │ ├── loonggpu_cs_ib_vm_chunk() │ └── loonggpu_vm_bo_update() │ └── loonggpu_cs_submit() ├── drm_sched_job_init() ├── loonggpu_ctx_add_fence() ├── loonggpu_ib_schedule() │ ├── loonggpu_ring_alloc() │ ├── loonggpu_vm_flush() │ ├── loonggpu_ring_emit_ib() │ ├── loonggpu_fence_emit() │ └── loonggpu_ring_commit() └── drm_sched_entity_push_job()</code></pre> <hr> <h2>四、各 IP 块功能总结</h2> <p>| IP 块 | 功能 | 关键文件 |<br> |-------|------|----------|<br> | <strong>Common</strong> | 基础初始化、电源管理 | <code>loonggpu_common.c</code> |<br> | <strong>MMU</strong> | 内存管理、GART、VM | <code>loonggpu_mmu.c</code> |<br> | <strong>ZIP</strong> | 压缩引擎 | <code>loonggpu_zip.c</code> |<br> | <strong>IH</strong> | 中断处理 | <code>loonggpu_ih.c</code>, <code>loonggpu_irq.c</code> |<br> | <strong>DC</strong> | 显示控制器 | <code>loonggpu_dc_*.c</code> |<br> | <strong>GFX</strong> | 3D 渲染引擎 | <code>loonggpu_gfx.c</code> |<br> | <strong>XDMA</strong> | DMA 引擎 | <code>loonggpu_xdma.c</code> |</p> <hr> <h2>五、用户空间渲染流程</h2> <pre><code>1. 应用初始化 │ ├── drmOpen("loonggpu") │ └── 打开 /dev/dri/card0 │ ├── drmGetBusid() └── drmSetMaster() 2. 创建上下文 │ └── DRM_IOCTL_LOONGGPU_CTX (LOONGGPU_CTX_OP_ALLOC_CTX) └── loonggpu_ctx_alloc() ├── loonggpu_ctx_init() ├── drm_sched_entity_init() └── loonggpu_queue_mgr_init() 3. 分配 GEM 缓冲区 │ └── DRM_IOCTL_LOONGGPU_GEM_CREATE └── loonggpu_gem_create_ioctl() └── loonggpu_gem_object_create() └── loonggpu_bo_create() 4. 提交渲染命令 │ └── DRM_IOCTL_LOONGGPU_CS └── loonggpu_cs_ioctl() ├── 解析 IB ├── 验证 BO ├── 更新页表 └── 提交调度器 5. 等待完成 │ └── DRM_IOCTL_LOONGGPU_WAIT_CS └── loonggpu_cs_wait_ioctl() └── dma_fence_wait_timeout() 6. 清理 │ ├── DRM_IOCTL_LOONGGPU_CTX (FREE) └── drmClose()</code></pre> <hr> <h2>六、总结</h2> <p>龙芯 GPU 驱动的启动流程分为以下几个关键阶段:</p> <ol style="list-style-type:decimal"><li><strong>模块加载</strong> → 驱动初始化、PCI 探测</li> <li><strong>设备识别</strong> → 芯片类型检测、寄存器映射</li> <li><strong>IP 块初始化</strong> → 各硬件模块依次初始化</li> <li><strong>显示初始化</strong> → VBIOS 解析、CRTC/Encoder/Connector 创建</li> <li><strong>内存管理</strong> → TTM/GART/VM 初始化</li> <li><strong>中断系统</strong> → 中断环配置、MSI 使能</li> <li><strong>计算驱动</strong> → KCD 初始化</li> <li><strong>用户服务</strong> → 提供 DRM/GEM/CS 等用户空间 API</li></ol>

2026/7/5
阅读更多

龙芯2K2000 SOC中设备ID整理

<p>结合Loongnix25 &amp; aosc 中完整 <code>lspci</code> 输出,我重新整理并按设备ID排序的表格如下:</p> <p>| 设备ID | PCI地址 | 类别 | 描述 |<br> |--------|---------|------|------|<br> | 7a0e | 00:1d.0 | 加密控制器 | 2K2000 AES加密控制器 |<br> | 7a13 | 00:03.0 | 以太网 | 2K2000 / 7A2000 千兆以太网控制器 |<br> | 7a13 | 00:03.1 | 以太网 | 2K2000 / 7A2000 千兆以太网控制器 |<br> | 7a16 | 00:06.3 | 多媒体控制器 | 2K1000/2000 VPU解码器 |<br> | 7a18 | 00:08.0 | SATA控制器 | 2K2000/3000 / 3B6000M / 7A2000 6Gb/s SATA AHCI控制器 |<br> | 7a1b | 00:16.0 | 系统外设 | 2K2000/3000 / 3B6000M / 7A2000 SPI控制器 |<br> | 7a1c | 00:1c.1 | 内存控制器 | 2K2000/3000 / 3B6000M SDIO控制器 |<br> | 7a1e | 00:1d.1 | 加密控制器 | 2K2000 DES加密控制器 |<br> | 7a25 | 00:06.0 | 多媒体视频控制器 | 2K2000 / 7A2000 LG100 GPU |<br> | 7a27 | 00:07.0 | 多媒体音频控制器 | 2K2000/3000 / 3B6000M / 7A2000 I2S控制器 |<br> | 7a2e | 00:1d.2 | 加密控制器 | 2K2000 RSA加密控制器 |<br> | 7a2f | 00:1e.0 | 系统外设 | 2K2000 DMA控制器 |<br> | 7a34 | 00:19.0 | USB控制器 | 2K2000/3000 / 3B6000M / 7A2000 USB 3.0 xHCI控制器 |<br> | 7a36 | 00:06.1 | VGA兼容控制器 | 2K2000 / 7A2000 显示控制器 |<br> | 7a37 | 00:06.2 | 音频设备 | 2K2000/3000 / 3B6000M HDMI音频控制器 |<br> | 7a39 | 00:0a.0 | PCI桥 | 2K2000 / 7A2000 PCIe x1根端口 |<br> | 7a39 | 00:0b.0 | PCI桥 | 2K2000 / 7A2000 PCIe x1根端口 |<br> | 7a39 | 00:0c.0 | PCI桥 | 2K2000 / 7A2000 PCIe x1根端口 |<br> | 7a3e | 00:1d.3 | 加密控制器 | 2K2000 RNG随机数控制器 |<br> | 7a44 | 00:04.0 | USB控制器 | 2K2000/3000 / 3B6000M USB 2.0 xHCI控制器 |<br> | 7a49 | 00:09.0 | PCI桥 | 2K2000 / 7A2000 PCIe x4根端口 |<br> | 7a49 | 00:0d.0 | PCI桥 | 2K2000 / 7A2000 PCIe x4根端口 |<br> | 7a54 | 00:05.0 | USB控制器 | 2K2000 OTG USB控制器 |<br> | 7a8e | 00:1f.0 | 加密控制器 | 2K2000 SE安全引擎控制器 |</p> <hr> <p><strong>音频相关设备</strong>:</p> <p>| 设备ID | PCI地址 | 说明 |<br> |--------|---------|------|<br> | <strong>7a27</strong> | <strong>00:07.0</strong> | <strong>I2S音频控制器</strong> — 这是在 <code>sound/soc/loongson/</code> 中开发驱动的主要目标,用于连接外部音频编解码器(Codec) |<br> | <strong>7a37</strong> | <strong>00:06.2</strong> | <strong>HDMI音频控制器</strong> — 通过HDMI/DP接口输出音频(与GPU绑定) |</p> <p>两个音频设备使用不同的驱动路径,目录 <code>sound/soc/loongson/</code> 主要对应 <code>7a27</code> I2S控制器。</p>

2026/7/1
阅读更多

PMON 对龙芯 2K300 处理器的硬件初始化流程

<p>PMON 对龙芯 2K300 处理器的硬件初始化流程。</p> <hr> <h2>PMON 对龙芯 2K300 硬件初始化分析</h2> <h3>一、初始化流程总览</h3> <pre><code>┌─────────────────────────────────────────────────────────────────────────────┐ │ start.S - 最早启动代码 │ │ (CPU 上电后第一条指令入口) │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 第一阶段:CPU 核心初始化 │ │ - 配置内存控制器窗口 │ │ - 解除 DDR/USB 软复位 │ │ - 设置缓存一致性 │ │ - 启用性能计数器 │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 第二阶段:PLL 时钟配置 │ │ (clksetting_2k300.S - SOFT_CLKSEL) │ │ - Node PLL (CPU/总线时钟) │ │ - DDR PLL (内存/外设时钟) │ │ - PIX PLL (显示时钟) │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 第三阶段:缓存与内存映射 │ │ - 锁定 Scache (256KB) 并拷贝代码 │ │ - 初始化串口 (initserial) │ │ - 探测内存大小 │ └─────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 第四阶段:C 语言初始化 │ │ (init_loongarch() → tgt_devconfig()) │ │ - 配置 GPIO 引脚复用 │ │ - 初始化 PCIe 设备 │ │ - 初始化显示控制器 (DC) │ │ - 初始化键盘、RTC 等外设 │ └─────────────────────────────────────────────────────────────────────────────┘</code></pre> <hr> <h3>二、启动汇编代码分析 (<code>start.S</code>)</h3> <h4>2.1 早期 CPU 配置</h4> <pre><code class="language-assembly">_start: start: /* 配置内存控制器窗口 */ li.w t0, 0x16000100 ld.w t1, t0, 0x0 li.w t2, (1 &lt;&lt; 5 | 0xf &lt;&lt; 20) /* bit5=1 默认配置, bit20-23=0xf */ or t1, t1, t2 st.w t1, t0, 0x0 /* 关闭 USB &amp; DDR 软复位 */ li.w t1, 0xffffff7e st.w t1, t0, 0x1c</code></pre> <p><strong>关键寄存器地址 (0x16000100 附近)</strong>:</p> <ul><li><code>0x16000100</code>:芯片配置寄存器 0</li> <li><code>0x1600011c</code>:复位控制寄存器</li></ul> <h4>2.2 缓存一致性配置</h4> <pre><code class="language-assembly"> /* 配置缓存一致性掩码 */ li.w t0, 0x1600010c ld.w t1, t0, 0x0 li.w t2, ((0x1f &lt;&lt; 1) | (0x1f &lt;&lt; 9)) /* 为 USB/GMAC0/GMAC1/DC 启用缓存一致性 */ or t1, t1, t2 st.w t1, t0, 0x0</code></pre> <p><strong>缓存一致性掩码含义</strong>:<br> | 位域 | 设备 | 说明 |<br> |------|------|------|<br> | bit1-5 | USB | USB 控制器缓存一致性 |<br> | bit9-13 | GMAC0/GMAC1/DC | 网络和显示控制器 |</p> <h4>2.3 CPU 特性配置</h4> <pre><code class="language-assembly"> /* 设置 CPUCFG 0 的 bit24 */ li.d t0, (1 &lt;&lt; (24 + 32)) csrxchg t0, t0, 0xc0 /* 设置 CPUCFG 0x13 的 bit16-23 */ li.d t0, (0xa &lt;&lt; (16 + 32)) li.d t1, (0xff &lt;&lt; (16 + 32)) csrxchg t0, t1, 0xc9 /* 启用性能计数器作为 cp0 计数器 */ li.w t0, (0x1 &lt;&lt; 16) csrxchg t0, t0, 0x200</code></pre> <h4>2.4 异常向量配置</h4> <pre><code class="language-assembly"> /* 清除 Vint 配置 */ li.d t0, (0x7 &lt;&lt; 16) csrxchg zero, t0, 0x4 /* 设置 EBase 地址 (异常向量基址) */ li.d t0, PHYS_TO_CACHED(0x1c001000) csrwr t0, 0xc /* 设置 TLB 异常地址 */ li.d t0, 0x000000001c001000 csrwr t0, 0x88 /* 禁用中断 */ li.d t0, (1 &lt;&lt; 2) csrxchg zero, t0, 0x0</code></pre> <h4>2.5 地址模式切换</h4> <pre><code class="language-assembly"> /* 跳转到缓存地址空间 */ li.d t1, CACHED_MEMORY_ADDR pcaddi t0, 3 or t0, t1, t0 jirl zero, t0, 0 /* 从直接地址模式切换到页模式 */ li.w t0, 0xb0 csrwr t0, 0x0</code></pre> <hr> <h3>三、PLL 时钟配置 (<code>clksetting_2k300.S</code>)</h3> <p>PMON 支持软件配置 PLL,通过 <code>SOFT_CLKSEL</code> 宏控制:</p> <pre><code class="language-assembly">#ifdef SOFT_CLKSEL /* NODE PLL 配置 (CPU 核心时钟) */ li.d t0, PHYS_TO_UNCACHED(0x16000400) /* PLL 控制寄存器基址 */ li.w t1, (0x1 &lt;&lt; 5) /* 先下电 PLL */ st.w t1, t0, 0 li.w t4, (NODE_DIV &lt;&lt; 24) | (NODE_LOOPC &lt;&lt; 15) | (NODE_REFC &lt;&lt; 8) st.w t4, t0, 0 /* 配置 GMAC 和 I2S 分频 */ ld.w t1, t0, 4 li.w t2, ~((0x7f &lt;&lt; 8) | 0x7f) and t1, t1, t2 li.w t2, (I2S_DIV &lt;&lt; 8) | (GMAC_DIV) or t2, t2, t1 st.w t2, t0, 0x4 /* 使能 PLL 并等待锁定 */ ori t4, t4, PLL_L1_ENA st.w t4, t0, 0 wait_locked_sys: ld.w a0, t0, 0 and a0, a0, PLL_L1_LOCKED beqz a0, wait_locked_sys</code></pre> <p><strong>PLL 计算公式</strong>:</p> <pre><code class="language-c">// Node PLL (CPU 核心) NODE_LOOPC = (CORE_FREQ * NODE_REFC * NODE_DIV) / 100 CORE_FREQ = 125 * 8 = 1000MHz (GMAC_FREQ=125, NODE_DIV=2, NODE_REFC=6) // DDR PLL (内存) DDR_LOOPC = (DDR_FREQ * DDR_REFC * DDR_DIV) / 100 // PIX PLL (显示) PIX_LOOPC = 80 // 100MHz 输出 PIX_DIV = 20 PIX_REFC = 4</code></pre> <hr> <h3>四、缓存初始化与代码重定位</h3> <h4>4.1 Scache (L2 缓存) 锁定</h4> <pre><code class="language-assembly">/* 锁定 Scache (256KB) */ li.d a0, LOCK_CACHE_BASE li.d a1, LOCK_CACHE_BASE + LOCK_CACHE_SIZE /* 配置 Scache 锁定窗口 */ li.d t0, PHYS_TO_UNCACHED(0x16000200) li.d t1, ~(LOCK_CACHE_SIZE - 1) /* 地址掩码 */ st.d t1, t0, 0x40 /* 设置窗口大小 */ li.d t1, (LOCK_CACHE_BASE &amp; 0xffffffffffff) | (1 &lt;&lt; 63) /* 地址 + 有效位 */ st.d t1, t0, 0x0 /* 设置窗口基址 */</code></pre> <h4>4.2 代码拷贝到锁定缓存</h4> <pre><code class="language-assembly">/* 将 Flash 代码拷贝到 Scache */ li.d a1, PHYS_TO_CACHED(0x1c000000) /* Flash 起始地址 */ la a0, start /* 目标地址 (锁定缓存) */ la a2, edata /* 数据结束地址 */ copy_loop: ld.d a3, a1, 0 st.d a3, a0, 0 addi.d a0, a0, 8 addi.d a1, a1, 8 bne a2, a0, copy_loop</code></pre> <hr> <h3>五、串口初始化 (<code>serial.S</code>)</h3> <pre><code class="language-assembly">LEAF(initserial) li.d a0, COM1_BASE_ADDR /* UART 基址 */ /* 设置 DLAB=1,访问波特率寄存器 */ li.w a1, 0x80 st.b a1, a0, 3 /* 设置波特率 (115200) */ li.w a1, UART_DIV_HI st.b a1, a0, 1 li.w a1, UART_DIV_LO st.b a1, a0, 0 /* 设置数据格式: 8 位数据 */ li.w a1, 3 st.b a1, a0, 3 /* 使能 FIFO */ li.w a1, 71 st.b a1, a0, 2 jirl zero, ra, 0 END(initserial)</code></pre> <p><strong>波特率计算</strong>:</p> <pre><code class="language-c">#define UART_REF_CLK 100000000 #define UART_DIV_HI (((UART_REF_CLK + (115200*8)) / (115200*16)) &gt;&gt; 8) #define UART_DIV_LO (((UART_REF_CLK + (115200*8)) / (115200*16)) &amp; 0xff)</code></pre> <hr> <h3>六、GPIO 引脚复用配置 (<code>pincfgs.c</code>)</h3> <p>2K300 的引脚复用配置非常复杂,通过 <code>set_pin_mode()</code> 宏设置:</p> <pre><code class="language-c">#define set_pin_mode(pin_num, mode) \ do { \ volatile unsigned int *addr = (unsigned int *) \ (LS2K300_GPIO_MULTI_CFG + (pin_num) / 16 * 4); \ int bit = (pin_num) % 16 * 2; \ *addr &amp;= ~(0x3 &lt;&lt; bit); \ *addr |= ((mode) &lt;&lt; bit); \ } while(0)</code></pre> <p><strong>引脚复用模式含义</strong>:<br> | mode | 说明 |<br> |------|------|<br> | 0 | GPIO 模式 |<br> | 1 | 第一复用功能 |<br> | 2 | 第二复用功能 |<br> | 3 | 主功能 |</p> <p><strong>主要引脚配置示例</strong>:</p> <pre><code class="language-c">pin_cfgs_t default_pin_cfgs[106] = { {0, 3}, // lcd_clk (主功能) {1, 3}, // lcd_vsync (主功能) {28, 3}, // gmac0_rx_ctl (GMAC0 接收控制) {40, 3}, // uart0_rx (UART0 接收) {41, 3}, // uart0_tx (UART0 发送) {56, 3}, // spi0_clk (SPI0 时钟) {90, 3}, // sdio0_clk (SDIO0 时钟) // ... };</code></pre> <hr> <h3>七、C 语言初始化 (<code>tgt_machdep.c</code>)</h3> <h4>7.1 主初始化函数 <code>init_loongarch()</code></h4> <pre><code class="language-c">void init_loongarch() { unsigned long long tgt_memsz = readq(SMBIOS_INFO_IN_SDRAM_OFFS); /* 解锁 Scache */ unlock_scache(LOCK_CACHE_BASE, LOCK_CACHE_SIZE); /* 获取内存大小 */ get_memorysize(tgt_memsz); /* 配置所有引脚复用 */ cfg_all_pin_multi(default_pin_cfgs); /* 启用浮点单元 */ tgt_fpuenable(); /* 2K300 特定初始化 (前) */ ls2k300_init_before(); /* 探测 CPU 频率 */ tgt_cpufreq(); /* 拷贝异常向量 */ bcopy(LoongArchException, (char *)GEN_EXC_VEC, LoongArchExceptionEnd - LoongArchException); cpu_set_ebase(); cpu_set_tlb_ebase(); /* 调试器初始化 */ dbginit(NULL); /* 2K300 特定初始化 (后) */ ls2k300_init_after(); /* 进入 main() */ main(); }</code></pre> <h4>7.2 设备配置 <code>tgt_devconfig()</code></h4> <pre><code class="language-c">void tgt_devconfig() { config_init(); configure(); #ifdef DC /* 初始化显示控制器 */ fbaddress = dc_init(); fb_init(fbaddress, ioaddress); vga_available = 1; #endif }</code></pre> <h4>7.3 RTC 初始化</h4> <pre><code class="language-c">static void init_legacy_rtc(void) { /* 配置 RTC 控制寄存器 */ val = (1 &lt;&lt; 13) | (1 &lt;&lt; 11) | (1 &lt;&lt; 8); outl(LS2K300_RTC_CTRL_REG, val); /* 读取并验证时间有效性 */ year = inl(LS2K300_TOY_READ1_REG); month = (val &gt;&gt; 26) &amp; 0x3f; date = (val &gt;&gt; 21) &amp; 0x1f; // ... if (时间无效) { /* 重置为 2000-01-01 00:00:00 */ outl(LS2K300_TOY_WRITE1_REG, 0x64); outl(LS2K300_TOY_WRITE0_REG, (1 &lt;&lt; 26) | (1 &lt;&lt; 21)); } }</code></pre> <hr> <h3>八、时钟频率探测 (<code>_probe_frequencies()</code>)</h3> <pre><code class="language-c">static void _probe_frequencies() { /* 使用 HPET 高精度定时器测量频率 */ outl(LS2K300_HPET0_PERIOD, 0x989680); // 10ns 周期 outl(LS2K300_HPET0_CONF, 0x1); // 使能主时钟 sec = inl(LS2K300_HPET0_MAIN); // 获取当前时间 cnt = CPU_GetCOUNT(); // 获取 CPU 计数器 cur = (inl(LS2K300_HPET0_PERIOD) / 1000000); sec = sec + (100000000 / cur); // 等待 100ms do { cur = inl(LS2K300_HPET0_MAIN); } while (cur &lt; sec); cnt = CPU_GetCOUNT() - cnt; md_pipefreq = cnt / 1000; // 计算频率 md_pipefreq *= 20000; }</code></pre> <hr> <h3>九、2K300 特定外设初始化 (<code>ls2k300_init.c</code>)</h3> <pre><code class="language-c">void ls2k300_init_before(void) { unsigned int val; #ifdef LCD_EN /* LCD 引脚复用配置 */ readl(PHYS_TO_UNCACHED(0x16000490)) |= 0xffffffff; readl(PHYS_TO_UNCACHED(0x16000494)) |= 0xffffff; /* PWM0 复用配置 (用于背光) */ readl(PHYS_TO_UNCACHED(0x160004a4)) &amp;= ~(0x3 &lt;&lt; 12); readl(PHYS_TO_UNCACHED(0x160004a4)) |= (0x2 &lt;&lt; 12); /* PWM 配置 */ readl(PHYS_TO_UNCACHED(0x1611b00c)) &amp;= ~0x1; writel(150, PHYS_TO_UNCACHED(0x1611b004)); // 周期 writel(1500, PHYS_TO_UNCACHED(0x1611b008)); // 占空比 readl(PHYS_TO_UNCACHED(0x1611b00c)) |= 0x1; #endif /* SPI PAD 默认值 */ readl(PHYS_TO_UNCACHED(0x16000110)) |= (0x3 &lt;&lt; 18); }</code></pre> <hr> <h3>十、关键硬件地址映射总结</h3> <p>| 外设 | 物理地址 | 功能 |<br> |------|----------|------|<br> | UART0 | 0x16100000 | 调试串口 |<br> | SPI0 | 0x16010000 | SPI Flash |<br> | SDIO0 | 0x16140000 | SD 卡接口 |<br> | DC | 0x16090000 | 显示控制器 |<br> | GMAC0 | - | 以太网控制器 |<br> | EHCI | 0x16080000 | USB 2.0 主机 |<br> | HPET | 0x16120000 | 高精度定时器 |<br> | RTC | 0x16128000 | 实时时钟 |<br> | GPIO | 0x16104000 | 通用输入输出 |<br> | PLL | 0x16000400 | 时钟 PLL 控制 |<br> | Scache | 0x16000200 | L2 缓存锁定控制 |</p> <hr> <h3>十一、总结</h3> <p>PMON 对 2K300 的硬件初始化具有以下特点:</p> <ol style="list-style-type:decimal"><li><strong>分层初始化</strong>:从汇编到 C 语言,逐步建立运行环境</li> <li><strong>PLL 软件配置</strong>:支持运行时动态配置时钟频率</li> <li><strong>缓存优化</strong>:将关键代码锁定到 Scache 中运行,提升启动速度</li> <li><strong>引脚复用管理</strong>:通过 <code>pincfgs.h</code> 集中管理 106 个引脚的功能配置</li> <li><strong>频率探测</strong>:使用 HPET 精确测量 CPU 和总线频率</li> <li><strong>内存探测</strong>:从 SMBIOS 信息区读取内存配置</li> <li><strong>显示支持</strong>:初始化内置显示控制器 (DC)</li> <li><strong>调试支持</strong>:早期串口输出和异常向量设置</li></ol>

2026/6/24
阅读更多

PMON 2K0300 地址空间分布分析

<h2>PMON 2K0300 地址空间分布完整分析</h2> <h3>一、地址空间总览</h3> <p>PMON 运行在 LoongArch 架构上,使用 <strong>64 位虚拟地址</strong>,高 16 位决定访问属性:</p> <pre><code>┌─────────────────────────────────────────────────────────────────────────────┐ │ LoongArch 64 位地址空间布局 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ 0x0000_0000_0000_0000 ┌─────────────────────────────────────────────────┐ │ │ │ 用户态地址空间 (KUSEG) │ │ │ │ USRTEXT: 0x00400000 (用户代码起始) │ │ │ │ USRSTACK: 0x80000000 (用户栈顶) │ │ │ 0x7FFF_FFFF_FFFF_FFFF ├─────────────────────────────────────────────────┤ │ │ │ 非缓存内存 (UNCACHED) │ │ │ 0x8000_0000_0000_0000 │ PHYS_TO_UNCACHED(x) = x | 0x8000... │ │ │ │ 用于设备寄存器、DMA 缓冲区 │ │ │ 0x8FFF_FFFF_FFFF_FFFF ├─────────────────────────────────────────────────┤ │ │ │ 缓存内存 (CACHED) │ │ │ 0x9000_0000_0000_0000 │ PHYS_TO_CACHED(x) = x | 0x9000... │ │ │ │ 用于普通内存访问 │ │ │ 0x9FFF_FFFF_FFFF_FFFF ├─────────────────────────────────────────────────┤ │ │ │ 保留/其他 │ │ │ 0xFFFF_FFFF_FFFF_FFFF └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘</code></pre> <hr> <h3>二、地址空间核心宏定义 (<code>cpu.h</code>)</h3> <pre><code class="language-c">// cpu.h 中的地址空间定义 #define KUSEG_ADDR 0x0 // 用户段 #define CACHED_MEMORY_ADDR 0x9000000000000000ULL // 缓存内存基址 #define UNCACHED_MEMORY_ADDR 0x8000000000000000ULL // 非缓存内存基址 #define MAX_MEM_ADDR PHYS_TO_UNCACHED(0x1e000000) // 最大内存地址 #define RESERVED_ADDR PHYS_TO_UNCACHED(0x1fc80000) // 保留地址 // 地址转换宏 #define IS_CACHED_ADDR(x) (!!(((x) &amp; 0xff00000000000000ULL) == CACHED_MEMORY_ADDR)) #ifndef _LOCORE #define PHYS_TO_CACHED(x) ((unsigned long long)(x) | CACHED_MEMORY_ADDR) #define PHYS_TO_UNCACHED(x) ((unsigned long long)(x) | UNCACHED_MEMORY_ADDR) #define CACHED_TO_UNCACHED(x) (PHYS_TO_UNCACHED(VA_TO_PHYS(x))) #define UNCACHED_TO_CACHED(x) (PHYS_TO_CACHED(VA_TO_PHYS(x))) #define VA_TO_PHYS(x) ((unsigned long long)(x) &amp; 0xffffffffffffULL) #else // 汇编版本 #define PHYS_TO_CACHED(x) ((x) | CACHED_MEMORY_ADDR) #define PHYS_TO_UNCACHED(x) ((x) | UNCACHED_MEMORY_ADDR) #define VA_TO_PHYS(x) ((x) &amp; 0xffffffffffff) #endif</code></pre> <hr> <h3>三、物理地址空间分布 (<code>bonito.h</code>, <code>ls2k300.h</code>)</h3> <h4>3.1 物理地址总览</h4> <p>| 地址范围 | 大小 | 用途 |<br> |----------|------|------|<br> | 0x0000_0000 - 0x0FFF_FFFF | 256MB | 系统内存(低端) |<br> | 0x1000_0000 - 0x1BFF_FFFF | 192MB | 系统内存(高端) |<br> | <strong>0x1C00_0000 - 0x1CFF_FFFF</strong> | <strong>16MB</strong> | <strong>SPI Flash (PMON 固件)</strong> |<br> | 0x1D00_0000 - 0x1DFF_FFFF | 16MB | 保留 |<br> | 0x1E00_0000 - 0x1EFF_FFFF | 16MB | LIO 内存窗口 |<br> | 0x1F00_0000 - 0x1FDF_FFFF | <sub>14MB</sub> | 设备寄存器 |<br> | 0x1FE0_0000 - 0x1FEF_FFFF | 1MB | SoC 内部寄存器 |<br> | 0x1FF0_0000 - 0x1FFF_FFFF | 1MB | 外设寄存器 |</p> <h4>3.2 Flash 内部布局</h4> <pre><code class="language-c">// bonito.h #define BONITO_FLASH_BASE PHYS_TO_UNCACHED(0x1c000000) #define BONITO_FLASH_SIZE 0x100000 // NVRAM 环境变量区域 #define NVRAM_OFFS 0x000ff000 // 环境变量偏移 #define NVRAM_SECSIZE 500 // 环境变量大小 // DTB 设备树区域 #define DTB_SIZE 0x4000 // 16KB (2K300 为 0x5000) #define DTB_OFFS (NVRAM_OFFS - DTB_SIZE) // 内存信息存储 #define DIMM_INFO_IN_FLASH_OFFS (PHYS_TO_UNCACHED(0x1c000000) + DTB_OFFS - 0x1000) #define SMBIOS_INFO_IN_SDRAM_OFFS PHYS_TO_UNCACHED(0xfffc000)</code></pre> <p><strong>Flash 详细布局</strong>:</p> <pre><code>0x1C00_0000 ┌─────────────────────────────────────────────┐ │ PMON 代码 (.text, .rodata, .data) │ │ (从 _start 到 _edata) │ │ │ │ ~ 800KB - 1MB │ │ │ 0x1C0F_E000 ├─────────────────────────────────────────────┤ ← DTB_OFFS │ DTB 设备树 (16KB/20KB) │ 0x1C0F_F000 ├─────────────────────────────────────────────┤ ← NVRAM_OFFS │ NVRAM 环境变量 (500 字节) │ 0x1C0F_F500 ├─────────────────────────────────────────────┤ │ 保留 │ 0x1C0F_FFFF └─────────────────────────────────────────────┘</code></pre> <hr> <h3>四、外设寄存器地址映射</h3> <h4>4.1 2K300 外设寄存器 (<code>ls2k300.h</code>)</h4> <pre><code class="language-c">// 芯片配置寄存器 #define LS2K300_GENERAL_CFG0 0x16000100 // 芯片配置0 #define LS2K300_GENERAL_CFG1 0x16000104 // 芯片配置1 #define LS2K300_GENERAL_CFG2 0x16000108 // 芯片配置2 #define LS2K300_GENERAL_CFG3 0x1600010c // 缓存一致性配置 #define LS2K300_GENERAL_CFG4 0x16000110 // SPI PAD 配置 #define LS2K300_GENERAL_CFG5 0x16000114 // 芯片配置5 #define LS2K300_SAMPLE_CFG0 0x16000120 // 采样配置0 #define LS2K300_CHIP_HPT_LO 0x16000130 // HPET 低32位 #define LS2K300_CHIP_HPT_HI 0x16000134 // HPET 高32位 // GPIO 寄存器 #define LS2K300_GPIO_MULTI_CFG 0x16000490 // GPIO 复用配置 #define LS2K300_GPIO_BASE 0x16104000 // GPIO 基址 #define LS2K300_GPIO_BIT_OEN 0x16104000 // GPIO 输出使能 #define LS2K300_GPIO_BIT_O 0x16104010 // GPIO 输出值 #define LS2K300_GPIO_BIT_I 0x16104020 // GPIO 输入值 // USB 控制器 #define LS2K300_OHCI_BASE 0x16040000 // OHCI USB 1.1 #define LS2K300_EHCI_BASE 0x16080000 // EHCI USB 2.0 // 显示控制器 #define LS2K300_DC_BASE 0x16090000 // DC 基址 // SPI 控制器 #define LS2K300_SPI0_BASE 0x16010000 // SPI0 #define LS2K300_SPI1_BASE 0x16018000 // SPI1 #define LS2K300_SPI2_BASE 0x1610c000 // SPI2 #define LS2K300_SPI3_BASE 0x1610e000 // SPI3 // UART 控制器 #define LS2K300_UART0_REG_BASE 0x16100000 // UART0 #define LS2K300_UART1_REG_BASE 0x16100400 // UART1 #define LS2K300_UART2_REG_BASE 0x16100800 // UART2 (调试串口) #define LS2K300_UART3_REG_BASE 0x16100c00 // UART3 #define LS2K300_UART4_REG_BASE 0x16101000 // UART4 #define LS2K300_UART5_REG_BASE 0x16101400 // UART5 #define LS2K300_UART6_REG_BASE 0x16101800 // UART6 #define LS2K300_UART7_REG_BASE 0x16101c00 // UART7 #define LS2K300_UART8_REG_BASE 0x16102000 // UART8 #define LS2K300_UART9_REG_BASE 0x16102400 // UART9 // I2C 控制器 #define LS2K300_I2C0_REG_BASE 0x16108000 // I2C0 #define LS2K300_I2C1_REG_BASE 0x16109000 // I2C1 // SDIO 控制器 #define LS2K300_SDIO0_BASE 0x16140000 // SDIO0 #define LS2K300_SDIO1_BASE 0x16148000 // SDIO1 // 定时器 #define LS2K300_HPET0_BASE 0x16120000 // HPET0 #define LS2K300_HPET0_PERIOD 0x16120004 // HPET0 周期 #define LS2K300_HPET0_CONF 0x16120010 // HPET0 配置 #define LS2K300_HPET0_MAIN 0x161200f0 // HPET0 主计数器 // RTC #define LS2K300_RTC_REG_BASE 0x16128000 // RTC 基址 #define LS2K300_TOY_READ0_REG 0x1612802c // TOY 读寄存器0 #define LS2K300_TOY_READ1_REG 0x16128030 // TOY 读寄存器1 #define LS2K300_RTC_CTRL_REG 0x16128040 // RTC 控制寄存器 // DMA #define LS2K300_DMA_ORDER0 0x1612c000 // DMA 通道0 // PLL 控制 #define CBUS_PLL_NODE 0x16000400 // Node PLL #define CBUS_PLL_DDR 0x16000408 // DDR PLL #define CBUS_PLL_PIX 0x16000410 // PIX PLL // 看门狗 #define LS2K300_WDT_BASE 0x16124000 // 看门狗基址 #define LS2K300_RST_CNT_REG 0x16124000 // 复位控制</code></pre> <h4>4.2 PCI 地址空间 (<code>bonito.h</code>)</h4> <pre><code class="language-c">// PCI 配置空间 #define BONITO_PCICFG0_BASE_VA 0xfe00000000 // PCI 配置空间0 #define BONITO_PCICFG1_BASE_VA 0xfe10000000 // PCI 配置空间1 // PCI 内存空间 #define BONITO_PCILO_BASE_VA 0x10000000 // PCI 低端内存 #define BONITO_PCILO_SIZE 0x0c000000 // 192MB #define BONITO_PCILO_TOP 0x1BFFFFFF // PCI I/O 空间 #define BONITO_PCIIO_BASE 0x1fd00000 // PCI I/O 基址 #define BONITO_PCIIO_BASE_VA 0x1fd00000 // PCI I/O 虚拟地址 #define BONITO_PCIIO_SIZE 0x00010000 // 64KB // LIO 内存窗口 #define LIO_MEM_BASE0 0x1a000000 // LIO 内存0 #define LIO_MEM_BASE1 0x1b000000 // LIO 内存1 #define LIO_MEM_SIZE 0x01000000 // 16MB // LPC 内存 #define LPC_MEM_BASE 0x1df00000 // LPC 内存基址 #define LPC_MEM_SIZE 0x01000000 // 16MB // SPI Flash 内存映射 #define SPI_MEM_BASE 0x18000000 // SPI 内存基址 #define SPI_MEM_SIZE 0x02000000 // 32MB</code></pre> <hr> <h3>五、虚拟内存映射 (<code>vmparam.h</code>, <code>vm_kern.h</code>)</h3> <h4>5.1 用户/内核地址划分</h4> <pre><code class="language-c">// vmparam.h #define USRTEXT 0x00400000 // 用户代码起始 #define USRSTACK 0x80000000 // 用户栈顶 #define VM_MAXUSER_ADDRESS 0x80000000 // 用户空间上限 #define KERNBASE 0x80000000 // 内核虚拟起始 #define VM_MIN_KERNEL_ADDRESS 0xC0000000 // 内核最小地址 #define VM_MAX_KERNEL_ADDRESS 0xFFFFC000 // 内核最大地址 // 内核特殊区域 #define UADDR 0xffffc000 // u-area 地址 #define KERNELSTACK (UADDR + UPAGES*NBPG) // 内核栈顶</code></pre> <h4>5.2 内核映射区 (<code>vm_kern.h</code>)</h4> <pre><code class="language-c">// 内核虚拟内存映射区 extern vm_map_t buffer_map; // 文件系统缓冲区映射 extern vm_map_t exec_map; // exec 参数/环境映射 extern vm_map_t kernel_map; // 内核核心映射 extern vm_map_t kmem_map; // malloc 内存映射 extern vm_map_t mb_map; // mbuf 集群映射 extern vm_map_t phys_map; // 物理内存映射</code></pre> <h4>5.3 内核映射区用途</h4> <p>| 映射区 | 用途 | 典型大小 |<br> |--------|------|----------|<br> | <code>kernel_map</code> | 内核代码、数据、页表 | 整个内核地址空间 |<br> | <code>kmem_map</code> | <code>malloc()</code> 动态分配 | VM_KMEM_SIZE |<br> | <code>mb_map</code> | 网络 mbuf 集群 | NMBCLUSTERS * MCLBYTES |<br> | <code>buffer_map</code> | 文件系统缓冲区 | nbuf * MAXBSIZE |<br> | <code>phys_map</code> | 设备 I/O 映射 | USRIOSIZE * PAGE_SIZE |</p> <hr> <h3>六、PMON 运行时地址空间布局</h3> <h4>6.1 PMON 代码段定位 (<code>start.S</code>)</h4> <pre><code class="language-assembly">// start.S 中的栈定义 stack = start + LOCK_CACHE_SIZE /* 栈在锁定缓存末尾 */ // 锁定缓存配置 #define LOCK_CACHE_BASE 0x90000000 // 256KB 锁定缓存 #define LOCK_CACHE_SIZE 0x40000 // 256KB</code></pre> <h4>6.2 PMON 运行时地址分布</h4> <pre><code>Scache (0x90000000 - 0x9003FFFF, 256KB) ┌─────────────────────────────────────────────────────────────────────────────┐ │ 0x90000000 ┌─────────────────────────────────────────────────────────────┐ │ │ │ .text (PMON 代码段) │ │ │ │ 入口: _start → cache_main → init_loongarch → dbginit → main│ │ │ │ ~ 100-150KB │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ .rodata (只读数据) │ │ │ │ - 字符串常量 │ │ │ │ - 命令表 │ │ │ │ - 设备表 │ │ │ │ ~ 10-20KB │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ .data (初始化数据) │ │ │ │ - 全局变量 (已初始化) │ │ │ │ - 设备结构 │ │ │ │ ~ 10-20KB │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ .bss (未初始化数据) │ │ │ │ - 全局变量 (未初始化) │ │ │ │ - 缓冲区 │ │ │ │ ~ 10-20KB │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 空闲区域 / 栈 (向下增长) │ │ │ 0x9003FFFF └─────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────────┘</code></pre> <h4>6.3 kmem 静态内存池 (<code>kern_misc.c</code>)</h4> <pre><code class="language-c">// vminit() - 从内存顶部预留内存池 void vminit() { memorysize = (memorysize - VM_KMEM_SIZE) &amp; ~PGOFSET; if (IS_CACHED_ADDR((u_int64_t)&amp;kmem)) { kmem = (u_char *)PHYS_TO_CACHED(memorysize); } else { kmem = (u_char *)PHYS_TO_UNCACHED(memorysize); } } // kmem_malloc - 从静态池分配 vm_offset_t kmem_malloc(vm_map_t map, vm_size_t size) { size = (size + PGOFSET) &amp; ~PGOFSET; // 预留 16MB 给上层 PMON 代码 if (kmem_offs + size &gt; VM_KMEM_SIZE - 0x01000000) { return 0; } p = (vm_offset_t) &amp;kmem[kmem_offs]; kmem_offs += size; return p; }</code></pre> <p><strong>kmem 内存池布局</strong>:</p> <pre><code>高地址 ┌─────────────────────────────────┐ │ 保留区域 (16MB) │ ← 给上层 PMON 代码 ├─────────────────────────────────┤ │ kmem 动态分配区 │ ← kmem_malloc 分配 │ (kmem_offs 递增) │ ├─────────────────────────────────┤ │ VM_KMEM_SIZE │ │ 内核内存池 │ 低地址 └─────────────────────────────────┘</code></pre> <hr> <h3>七、异常向量地址</h3> <pre><code class="language-c">// cpu.h #define TLB_MISS_EXC_VEC CACHED_MEMORY_ADDR // TLB 缺失 #define XTLB_MISS_EXC_VEC PHYS_TO_CACHED(0x80) // XTLB 缺失 #define CACHE_ERR_EXC_VEC CACHED_MEMORY_ADDR // 缓存错误 #define GEN_EXC_VEC PHYS_TO_CACHED(0xfe00000) // 通用异常向量 // start.S 中设置 #define GEN_EXC_VEC 0xfe00000 #define TLB_EXC_VEC 0x1c001000</code></pre> <hr> <h3>八、内存探测结果 (<code>tgt_machdep.c</code>)</h3> <pre><code class="language-c">void get_memorysize(unsigned long long tgt_memsz) { raw_memsz = tgt_memsz &gt;&gt; 9; mem_size = raw_memsz &amp; 0xff; mem_size = mem_size &lt;&lt; 29; // 转换为字节 mem_size = mem_size - 0x1000000; // 减去 16MB 保留 mem_size = mem_size &gt;&gt; 20; // 转换为 MB // 低端内存 (前 240MB) memorysize = mem_size &gt; 240 ? 240 &lt;&lt; 20 : mem_size &lt;&lt; 20; // 高端内存 (超过 240MB 的部分) memorysize_high = mem_size &gt; 240 ? (((unsigned long long)mem_size) - 240) &lt;&lt; 20 : 0; memorysize_total = ((memorysize + memorysize_high) &gt;&gt; 20) + 16; }</code></pre> <p><strong>1GB 内存布局示例</strong>:</p> <pre><code>物理地址 虚拟地址 (缓存) 0x0000_0000 ┌──────────────┐ 0x9000_0000_0000_0000 │ 保留 16MB │ 0x0100_0000 ├──────────────┤ │ 低端内存 │ │ (240MB) │ 0x1000_0000 ├──────────────┤ │ 高端内存 │ │ (784MB) │ 0x3FFF_FFFF └──────────────┘ 0x9000_0000_3FFF_FFFF</code></pre> <hr> <h3>九、地址空间分布总图</h3> <pre><code>┌─────────────────────────────────────────────────────────────────────────────┐ │ PMON 完整地址空间分布 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ 物理地址空间 (Physical Address) │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ 0x0000_0000 - 0x0FFF_FFFF: 系统内存 (低端) │ │ │ │ 0x1000_0000 - 0x1BFF_FFFF: 系统内存 (高端) │ │ │ │ 0x1C00_0000 - 0x1CFF_FFFF: SPI Flash (PMON 固件) │ │ │ │ 0x1E00_0000 - 0x1EFF_FFFF: LIO 内存窗口 │ │ │ │ 0x1FD0_0000 - 0x1FD0_FFFF: PCI I/O 空间 │ │ │ │ 0x1FE0_0000 - 0x1FEF_FFFF: SoC 内部寄存器 │ │ │ │ 0x1FF0_0000 - 0x1FFF_FFFF: 外设寄存器 │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ (VA_TO_PHYS / PHYS_TO_CACHED) │ │ 虚拟地址空间 (Virtual Address) │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ 0x0000_0000_0000_0000 ──────────────────────────────────────────── │ │ │ │ 用户态 (KUSEG) │ │ │ │ USRTEXT: 0x00400000 │ │ │ │ USRSTACK: 0x80000000 │ │ │ │ 0x7FFF_FFFF_FFFF_FFFF ──────────────────────────────────────────── │ │ │ │ 非缓存 (UNCACHED) │ │ │ │ 设备寄存器: 0x8000_0000_1600_0000 │ │ │ │ 0x8000_0000_1C00_0000: Flash (非缓存访问) │ │ │ │ 0x8FFF_FFFF_FFFF_FFFF ──────────────────────────────────────────── │ │ │ │ 缓存 (CACHED) │ │ │ │ 0x9000_0000_0000_0000: Scache 锁定 (256KB) │ │ │ │ 0x9000_0000_0000_0000: PMON 代码运行地址 │ │ │ │ 0x9000_0000_1000_0000: 系统内存 (缓存访问) │ │ │ │ 0x9FFF_FFFF_FFFF_FFFF ──────────────────────────────────────────── │ │ │ │ 内核地址空间 │ │ │ │ KERNBASE: 0x80000000 │ │ │ │ VM_MIN_KERNEL: 0xC0000000 │ │ │ │ UADDR: 0xFFFFC000 (u-area) │ │ │ │ 0xFFFF_FFFF_FFFF_FFFF ──────────────────────────────────────────── │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘</code></pre> <hr> <h3>十、地址空间关键常量汇总</h3> <p>| 常量 | 值 | 说明 |<br> |------|-----|------|<br> | <code>CACHED_MEMORY_ADDR</code> | 0x9000_0000_0000_0000 | 缓存内存基址 |<br> | <code>UNCACHED_MEMORY_ADDR</code> | 0x8000_0000_0000_0000 | 非缓存内存基址 |<br> | <code>USRTEXT</code> | 0x0040_0000 | 用户代码起始 |<br> | <code>USRSTACK</code> | 0x8000_0000 | 用户栈顶 |<br> | <code>KERNBASE</code> | 0x8000_0000 | 内核虚拟起始 |<br> | <code>UADDR</code> | 0xFFFF_C000 | u-area 地址 |<br> | <code>LOCK_CACHE_BASE</code> | 0x9000_0000 | Scache 锁定基址 |<br> | <code>LOCK_CACHE_SIZE</code> | 0x4_0000 (256KB) | Scache 锁定大小 |<br> | <code>BONITO_FLASH_BASE</code> | 0x1C00_0000 | Flash 基址 (物理) |<br> | <code>BONITO_PCIIO_BASE</code> | 0x1FD0_0000 | PCI I/O 基址 |<br> | <code>NVRAM_OFFS</code> | 0x000F_F000 | NVRAM 在 Flash 中的偏移 |<br> | <code>DTB_OFFS</code> | NVRAM_OFFS - DTB_SIZE | DTB 在 Flash 中的偏移 |<br> | <code>VM_KMEM_SIZE</code> | 编译时确定 | 内核内存池大小 |<br> | <code>NMBCLUSTERS</code> | 1024/2048 | mbuf 集群数量 |</p> <hr> <h3>十一、总结</h3> <p>PMON 的地址空间分布具有以下特点:</p> <ol style="list-style-type:decimal"><li><strong>64 位地址空间</strong>:利用 LoongArch 的高位区分缓存/非缓存访问</li> <li><strong>物理/虚拟地址转换</strong>:通过 <code>PHYS_TO_CACHED</code> 和 <code>PHYS_TO_UNCACHED</code> 宏统一管理</li> <li><strong>Scache 锁定</strong>:启动时在 0x90000000 锁定 256KB 缓存用于加速</li> <li><strong>Flash 布局</strong>:PMON 代码、DTB、NVRAM 在 Flash 中紧凑排列</li> <li><strong>设备寄存器映射</strong>:所有外设寄存器通过非缓存地址访问</li> <li><strong>内核映射区</strong>:多种专用映射区 (mbuf、buffer、kmem 等) 隔离不同用途</li> <li><strong>用户/内核隔离</strong>:用户空间 (0x00400000-0x80000000) 与内核空间分离</li></ol>

2026/6/24
阅读更多

GXDE 25.4.1 来了!Qt6 迁移与龙芯适配取得新进展了!

<p>经过我们这段时间的不断打磨,GXDE 25.4.1 正式发布了<br> GXDE OS 是一个基于 Debian 的 Linux 发行版,支持 amd64、arm64、loong64、riscv64 架构,以 deepin 15 时代的深度桌面环境为特色,持续优化桌面体验,致力于提供优雅、稳定、轻量化的开箱即用体验,减轻新手痛苦,节省老手时间</p> <p>GXDE 桌面环境 基于 深度桌面环境(DDE) 构建,组件依照上游原协议开源 (GPLV/LGPL)</p> <p><strong>💡注:GXDE 15 系列已停止维护,请尽快升级至 GXDE 25</strong></p> <p>官网: <a href="https://www.gxde.top/" rel="ugc noopener nofollow" target="_blank">https://www.gxde.top/</a></p> <p>开源地址:<a href="https://gitee.com/GXDE-OS/" rel="ugc noopener nofollow" target="_blank">https://gitee.com/GXDE-OS/</a><br> <a href="https://github.com/GXDE-OS/" rel="ugc noopener nofollow" target="_blank">https://github.com/GXDE-OS/</a></p> <p>QQ 交流群:881201853</p> <p>DistroWatch:<a href="https://distrowatch.com/table.php?distribution=gxde" rel="ugc noopener nofollow" target="_blank">https://distrowatch.com/table.php?distribution=gxde</a></p> <p><img src="https://imgproxy.citrusreader.com/G9BXodBekduTYOzF7E5UoVloDf3O2YqJXrOi_oMoPw4/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvZGVza3RvcC5qcGc" title alt="GXDE 25.4.1" referrerpolicy="no-referrer"></p> <h2>下载地址</h2> <p>教育网联合镜像(自动选择距离最近的教育网镜像站):<a href="https://mirrors.cernet.edu.cn/GXDE/ISO/" rel="ugc noopener nofollow" target="_blank">https://mirrors.cernet.edu.cn/GXDE/ISO/</a><br> 哈尔滨工业大学开源镜像站:<a href="https://mirrors.hit.edu.cn/GXDE/ISO/" rel="ugc noopener nofollow" target="_blank">https://mirrors.hit.edu.cn/GXDE/ISO/</a><br> 山东大学镜像站:<a href="https://mirrors.sdu.edu.cn/GXDE/ISO/" rel="ugc noopener nofollow" target="_blank">https://mirrors.sdu.edu.cn/GXDE/ISO/</a><br> Sourceforge:<a href="https://sourceforge.net/projects/gxde-os/" rel="ugc noopener nofollow" target="_blank">https://sourceforge.net/projects/gxde-os/</a><br> 源站:<a href="https://repo.gxde.top/ISO/" rel="ugc noopener nofollow" target="_blank">https://repo.gxde.top/ISO/</a><br> Android 版(小小电脑):<a href="https://repo.gxde.top/APK/" rel="ugc noopener nofollow" target="_blank">https://repo.gxde.top/APK/</a></p> <h1>更新日志</h1> <h2>Qt6 适配取得重大进展</h2> <p>在这段时间,dtk2 成功实现了对 Qt6 的初步适配并迁移了若干 GXDE 程序至 Qt6 版本的 dtk2,虽然目前仍处于测试阶段,但已经取得了显著的进展。我们将继续努力完善 Qt6 适配,争取在未来的版本中全面迁移至 Qt6。<br> GXDE OCR、GXDE 字体安装器、GXDE deb 安装器、GXDE 词典、GXDE 文件局域网共享、GXDE 日历、GXDE 文本编辑器、GXDE 取色器、GXDE 计时器等若干应用均已迁移至 Qt6 + dtk2。<br> 非常感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a> 在 dtk2 组件迁移等工作中做出的巨大贡献,极大推动了 GXDE Qt6 迁移的进程。<br> <img src="https://imgproxy.citrusreader.com/NH8K73HNBb7LtOCCH9MO-x4-rsYnh69jvoF1Pl7SzIY/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvZ3hkZS1xdDYuanBn" title alt="dtk2 Qt6 应用 lld" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/HP41JWfK3jQNPMAjg-lf7sgRJ8Fkrk07Cdho9vudxwI/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvZ3hkZS1kdGsyLmpwZw" title alt="dtk2 Qt6 应用展示" referrerpolicy="no-referrer"></p> <h2>更完善的 Loongarch 龙芯芯片支持</h2> <p>为降低迁移至 Debian14 Loongarch 支持的工作量与提升用户体验,从该版本起,lizhi 主线将正式支持 Loongarch 龙架构芯片,基于第三方的 Debian13 制作(<a href="https://loong13.debian.net/" rel="ugc noopener nofollow" target="_blank">https://loong13.debian.net/</a> )并与其它架构一样开启 Debian Backport 源<br> 推荐使用 Newer Kernel(6.18 内核),特殊情况可以使用 Old Kernel(6.6 内核)<br> 注:因该 Debian 源服务器在国外,可能下载、安装软件包速度较慢</p> <p><img src="https://imgproxy.citrusreader.com/KYMujicl7awNEOM0K50S76WezRIvTnvLu3lCEaQU8GQ/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvbG9vbmc2NC12ZXJzaW9uLmpwZw" title alt="GXDE25 Loongarch 主界面" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/nvo_TTAycjOSWkk4bMtkL_Yd9WqXEGjYg1fEBh--diA/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvbG9vbmc2NC1pbnN0YWxsZXIuanBn" title alt="GXDE25 Loongarch 安装程序" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/JvFctKgYengOg8upuossu8NRV-DGugdr14EHM_LuO2k/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvbG9vbmc2NC1zcGFyay1zdG9yZS5qcGc" title alt="GXDE25 Loongarch 星火应用商店" referrerpolicy="no-referrer"></p> <h2>内核、驱动新改进</h2> <p>25.4.1 版本内核成功升级到了 6.6.142、6.18.35 并修复了包括 CVE-2026-43494、CVE-2026-43284、CVE-2026-46331 等在内的若干高危漏洞。<br> 除此,新的内核亦同步了上游 NTFS Plus 驱动程序改动,修复问题若干。<br> 对于 Kmre,新增了 Kmre 内核模块对 7.0 内核的支持,在 7.0 内核下可以正常使用 Kmre 了。<br> 同时源内 Nvidia 驱动版本升级为 580.159.04,修复在 7.1 内核下 dkms 编译无法通过的问题。<br> 对于老 N 卡用户(需要使用 390 驱动的用户),GXDE 源内提供了修改后的驱动兼容 GXDE 当前的 6.6 与 6.18 驱动,包名为 <code>nvidia-legacy-390xx-driver</code>。注:因为 390 驱动属实较老,并非驱动所有功能正常,仅推荐有一定基础的用户使用,以及该 390 驱动推荐搭配 6.6 内核而非 6.18 内核使用,在后续 6.18 内核升级时可能导致 N 卡驱动异常。</p> <h2>Wayland 适配取得新进展</h2> <p>在这段时间,GXDE 在 Wayland 适配中取得了新进展,GXDE 桌面、窗口管理器、GXDE 文件管理器、GXDE 终端等组件的 Wayland 适配均取得了新的进展,虽然当前 GXDE Wayland 几乎处于不可用状态,但相比于完全不可用,已取得了极大的进步。</p> <p>非常感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a> 在组件适配移植、Wayland 故障修复等工作中做出的巨大贡献,极大推动了 GXDE Wayland 适配的进程</p> <h2>详细更新日志</h2> <ul><li>新增 GXDE 文件传输工具<br> <img src="https://imgproxy.citrusreader.com/ZbuK801ney_iHsOafVRx_qqDQWJhdbR4J4H3IXjlRlE/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvZ3hkZS1maWxldHJhbnNmZXIuanBn" title alt="新增 GXDE 文件传输工具" referrerpolicy="no-referrer"></li> <li>dtk2 DPushButton支持自定义按钮样式</li> <li>GXDE 控制中心不再外挂更新器<br> <img src="https://imgproxy.citrusreader.com/SXV6QISw8OhS474anfVHhAlY4fq6lO7x-3_72FIAE4E/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvZ3hkZS1jb250cm9sLWNlbnRlci11cGRhdGUuanBn" title alt="GXDE 控制中心不再外挂更新器" referrerpolicy="no-referrer"></li> <li>GXDE 更新器支持集中下载后安装</li> <li>GXDE 文件传输工具新增支持 SMB / SMBS / FTPS 协议</li> <li>GXDE 看图图片列表箭头样式优化</li> <li>GXDE 看图不再清除 mimecache</li> <li>更新 grub 版本至 2.12-1deepin18</li> <li>调整安装镜像 grub 文本</li> <li>修复 GXDE OCR 在 Debian13 arm64 无法构建的问题</li> <li>更新 GXDE OCR 内置 ncnn 版本</li> <li>GXDE OCR、GXDE 字体安装器、GXDE deb 安装器、GXDE 词典、GXDE 文件局域网共享、GXDE 日历、GXDE 文本编辑器、GXDE 取色器、GXDE 计时器迁移至 Qt6+dtk2 qt6版本与 cmake 构建系统</li> <li>修复内核高危提权漏洞 CVE-2026-46331</li> <li>新增 kylin-wayland-compositor、kylin wlroots 并针对 GXDE 进行专门调整(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>移植若干 DDE Shell 协议功能至 kylin-wayland-compositor(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复电源选项页启动系统监视器系统监视器 UI 异常的问题</li> <li>默认使用 kylin-wayland-compositor 窗口管理器而非 mutter</li> <li>更新 6.6.142、6.18.35 内核</li> <li>更新 NVIDIA 驱动版本至 580.159.04-0</li> <li>更新 6.6、6.18 内核 NTFSPLUS 驱动版本</li> <li>更新 ddm、treeland、deepin 终端、麒麟虚拟键盘、deepin 日志管理器、deepin face、deepin 截图录屏、玲珑、docparser、deepin 计算器、box64、deepin 系统监视器、deepin 跨端协调、deepin 相机版本</li> <li>deepin 计算器升级至 Qt6+dtk6 版本<br> <img src="https://imgproxy.citrusreader.com/Lab4cJ2Ku8CrkXQE9NNQ71xQZMEMoaW-MuXTp4egMpc/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvZGVlcGluLWNhbGN1bGF0b3IuanBn" title alt="deepin 计算器升级至 Qt6+dtk6 版本" referrerpolicy="no-referrer"></li> <li>Kylin 虚拟键盘、GXDE 预安装环境语言选择工具迁移至 Qt6</li> <li>新增依赖包 libqapt-qt6</li> <li>新增 dde-seatd</li> <li>新增 Debian13 loong64 支持与安装 ISO(<a href="https://loong13.debian.net/" rel="ugc noopener nofollow" target="_blank">https://loong13.debian.net/</a>)</li> <li>GXDE25 lizhi loong64 新增 qtwebengine5、qtwebengine6 支持</li> <li>新增 dtk2widget6、gxde-qt6-integration(Dtk2 for Qt6)(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>dtk2widget6 新增编译依赖 libdtk6gui</li> <li>修复修复其它应用使用 cmake find 引入 dtk2widget6 会错误引入 dtk5core 的问题</li> <li>修复 dtk2widget6 i386 构建问题</li> <li>移植 dtk2widget5 部分新控件至 dtk2widget6(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>更新 dtk5 版本至 6.7.43、dtk6 版本至 6.0.48</li> <li>修复 GXDE 终端在 Wayland 下窗口、设置与对话框出现双标题栏的问题(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>新增 GXDE 终端在 Treeland/Wlcom/Kwin Wayland 的模糊支持(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 Kmre APK 安装器出现双标题栏与拖动窗口异常的问题<br> <img src="https://imgproxy.citrusreader.com/22HwOHEAruJL2-wosoJgpmQpBaTUKRKnUtVz3GR6xwk/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEva21yZS1hcGstaW5zdGFsbGVyLmpwZw" title alt="修复 Kmre APK 安装器出现双标题栏与拖动窗口异常的问题" referrerpolicy="no-referrer"></li> <li>修复 xdg-desktop-protal-gxde 在 Wayland 下无法正常显示的问题</li> <li>新增 GXDE 文件管理器 Wayland 支持(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 GXDE 文件管理器在 Treeland 下无法正常获取文件图标、右键菜单出现标题栏与最小化/最大化/关闭按钮、文件管理器糊满屏幕拽不动也无法最小化的问题(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 GXDE 桌面 Treeland 下无法加载壁纸预览、点击壁纸后壁纸被提到其他窗口之上的问题(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 GXDE 文件管理器在小小电脑下崩溃的问题,恢复子项更新时的重复过滤逻辑(感谢 <a href="https://gitee.com/shenmo7192" rel="ugc noopener nofollow" target="_blank">@shenmo</a>)</li> <li>修复 GXDE 桌面 Treeland/Mutter 下壁纸设置无法持久化的问题(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 GXDE 桌面Wayland下壁纸选择器layer-shell不工作的问题(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 deepin-daemon Wayland会话下因为x.NewConn()闪退的问题(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 Kmre 窗口、GXDE 图片查看器、GXDE 内核管理器、GXDE 日历、GXDE OCR高分屏下图标模糊的问题(感谢 <a href="https://gitee.com/ocean123455" rel="ugc noopener nofollow" target="_blank">@zeqi</a>)</li> <li>调整 GXDE 任务栏音量调节滑块样式(感谢 <a href="https://gitee.com/ocean123455" rel="ugc noopener nofollow" target="_blank">@zeqi</a>)</li> <li>修复 GXDE 顶栏时间插件时间文本小的和问题时间插件不居中的问题(感谢 <a href="https://gitee.com/ocean123455" rel="ugc noopener nofollow" target="_blank">@zeqi</a>)<br> <img src="https://imgproxy.citrusreader.com/pCBYFwadD0YZ26VPzAuAiXmhteRRd1Ur6aezncwBM7g/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40LjEvdG9wLXBsdWdpbnMtdGltZS5qcGc" title alt="修复 GXDE 顶栏时间插件时间文本小的和问题时间插件不居中的问题" referrerpolicy="no-referrer"></li> <li>修复 GXDE 控制中心 VNC 密码输入框样式与其他设置项的输入框样式不统一的问题(感谢 <a href="https://gitee.com/ocean123455" rel="ugc noopener nofollow" target="_blank">@zeqi</a>)</li> <li>新增 GXDE 文件管理器 Qt6 支持(包名:<code>gxde-file-manager-neo</code>,需自行手动安装,与 Qt5 版本的文件管理器冲突)(感谢 <a href="https://gitee.com/MarcusP" rel="ugc noopener nofollow" target="_blank">@CharOfString</a>)</li> <li>修复 Kmre 内核模块在 7.0.4 内核无法编译通过的问题</li> <li>调整 GXDE 壁纸文件名</li> <li>修复右键菜单 Wayland 下模糊与定位有误的问题</li> <li>修复右键菜单 Treeland/Wlcom 下菜单错位的问题</li> <li>修复 deepin menu KWin blur 无法注册 callback 的问题</li> <li>初步为 DDesktopMenu 新增 blur</li></ul>

2026/6/22
阅读更多

3A5000 迷你电脑:安同无法启动

<p>LA UOSC 会员好,</p> <p>我最近买了一架迷你电脑基于龙芯 3A5000 处理器。<br> 这架电脑现在有Loongnix 20.6.sp1操作系统。<br> 我想用这个电脑试试新世界的操作系统。</p> <p>我选了安同 OS。</p> <p>我就下载了 aosc-os_installer_20260326_loongson3.iso。<br> sha256sum 是 ok。</p> <p>然后用了:<br> dd if=aosc-os_installer_20260326_loongson3.iso of=/dev/sdb bs=4M<br> 把安同 OS 复制到我的 16GB U盘。</p> <p>然后保证 U盘上的 OS 是 ok:<br> cmp aosc-os_installer_20260326_loongson3.iso /dev/sdb</p> <p>结果是:<br> cmp: EOF on aosc-os_installer_20260326_loongson3.iso</p> <p>BIOS 安全启动为“非使能”。</p> <p>电脑启动的时候,我选 U盘。<br> 我按 [Enter],没有任何反映。</p> <p>有人知道这个问题会有什么原因?</p> <p>迷你电脑信息:</p> <p>产品名称:大别山瘦客户机<br> 产品型号:LS5CT-C202<br> 制造商:龙芯中科(合肥)技术有限公司</p>

2026/6/20
阅读更多

GXDE 25.4 来了!内核更稳定了!

<p>经过我们几个月的不断打磨,GXDE 25.4 正式发布了<br> GXDE OS 是一个基于 Debian 的 Linux 发行版,支持 amd64、arm64 和 loong64 架构,以 deepin 15 时代的深度桌面环境为特色,持续优化桌面体验,致力于提供优雅、稳定、轻量化的开箱即用体验,减轻新手痛苦,节省老手时间</p> <p>GXDE 桌面环境 基于 深度桌面环境(DDE) 构建,组件依照上游原协议开源 (GPLV/LGPL)</p> <p><strong>💡注:GXDE 15 系列已停止维护,请尽快升级至 GXDE 25</strong></p> <p>官网: <a href="https://www.gxde.top/" rel="ugc noopener nofollow" target="_blank">https://www.gxde.top/</a></p> <p>开源地址:<a href="https://gitee.com/GXDE-OS/" rel="ugc noopener nofollow" target="_blank">https://gitee.com/GXDE-OS/</a><br> <a href="https://github.com/GXDE-OS/" rel="ugc noopener nofollow" target="_blank">https://github.com/GXDE-OS/</a></p> <p>QQ 交流群:881201853</p> <p>DistroWatch:<a href="https://distrowatch.com/table.php?distribution=gxde" rel="ugc noopener nofollow" target="_blank">https://distrowatch.com/table.php?distribution=gxde</a></p> <p><img src="https://imgproxy.citrusreader.com/d8rcVSlBZvssJSGE_Ah9VmsBtJ5lJNolentr75Y7-qU/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2Rlc2t0b3AuanBn" title alt="GXDE 25.4" referrerpolicy="no-referrer"></p> <h2>下载地址</h2> <p>教育网联合镜像(自动选择距离最近的教育网镜像站):<a href="https://mirrors.cernet.edu.cn/GXDE/ISO/" rel="ugc noopener nofollow" target="_blank">https://mirrors.cernet.edu.cn/GXDE/ISO/</a><br> 哈尔滨工业大学开源镜像站:<a href="https://mirrors.hit.edu.cn/GXDE/ISO/" rel="ugc noopener nofollow" target="_blank">https://mirrors.hit.edu.cn/GXDE/ISO/</a><br> 山东大学镜像站:<a href="https://mirrors.sdu.edu.cn/GXDE/ISO/" rel="ugc noopener nofollow" target="_blank">https://mirrors.sdu.edu.cn/GXDE/ISO/</a><br> Sourceforge:<a href="https://sourceforge.net/projects/gxde-os/" rel="ugc noopener nofollow" target="_blank">https://sourceforge.net/projects/gxde-os/</a><br> 源站:<a href="https://repo.gxde.top/ISO/" rel="ugc noopener nofollow" target="_blank">https://repo.gxde.top/ISO/</a><br> Android 版(小小电脑):<a href="https://repo.gxde.top/APK/" rel="ugc noopener nofollow" target="_blank">https://repo.gxde.top/APK/</a></p> <h1>更新日志</h1> <h2>更稳定的内核基线</h2> <p>从 25.4 开始,我们所有架构都使用 LTS 内核,均使用 6.18、6.6 的内核组合,不再跟随 Debian Backport 的内核更新,避免再出现更新内核后 dkms 炸了、虚拟机安卓模拟器显卡驱动炸了的情况<br> 对于飞腾 CPU 用户,使用 GXDE 也将会变得更加简单,无需再手动切换至飞腾专用的 6.6 内核,默认的 6.18 和 6.6 内核均内置了飞腾专用的驱动程序<br> 同时内核均修复了 CVE-2026-31431 漏洞,并集成了 NTFS PLUS 驱动程序(需自己启用)<br> 对于有新硬件或需要体验内核新特性的用户,如您依旧需要新版本的内核,输入命令 <code>sudo apt install linux-image-amd64 linux-headers-amd64</code> 即可安装 Debian Backport 的滚动内核,25.3.1 X86 升级上来的用户依旧是使用 Debian Backport 滚动内核<br> arm 用户不推荐使用 Debian Backport 滚动内核,可能会出现问题</p> <h2>驱动大更新</h2> <p>我们跟进了 Debian Sid 的部分新版本驱动,如N卡驱动(<code>sudo apt install nvidia-driver</code>)、博通驱动(<code>sudo apt install broadcom-sta-dkms</code>)<br> 注:建议搭配上文的 6.18/6.6 内核进行使用,使用 Debian Backport 的默认内核可能会因为内核 API 的变化导致驱动无法使用<br> 对于使用高通网卡的用户,我们也在 25.4 中内置了 <code>firmware-atheros</code> 固件包,修复了高通网卡无法联网的问题<br> 同时我们亦改善了硬件查看器的使用体验,能查看的信息更多了<br> 最后,系统自带的资源监视器支持查看 GPU 占用率,现在不需要第三方应用就知道我的显卡怎么样了<br> <img src="https://imgproxy.citrusreader.com/0KmmTnburAVIcDbN0Dv8344ZZ6_qR9z8auVc-RJloZU/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2RlZXBpbi1zeXN0ZW0tbW9uaXRvci5qcGc" title alt="更新 deepin 资源监视器版本至 6.5.41,新增 GPU 占用率查看功能" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/ztQTh_6GgF-3UiVUNIXN67lbmeo8gALAm5S61Lz53R8/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2RlZXBpbi1zeXN0ZW0tbW9uaXRvci1ncHUuanBn" title alt="更新 deepin 资源监视器版本至 6.5.41,新增 GPU 占用率查看功能" referrerpolicy="no-referrer"></p> <h2>内置应用大更新</h2> <p>内置的扫描管理器、日志管理器、相机、星火应用商店、玲珑等应用都跟随上游进行了更新,体验更佳<br> 同时我们引入了麒麟虚拟键盘替换原先的 onboard,UI 和体验都更佳<br> <img src="https://imgproxy.citrusreader.com/Vfk_rpFk0BBc7Ekc_OGj_ppYyMOdoUEK79iPM2joxxg/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2tleWJvYXJkLmpwZw" title alt="麒麟虚拟键盘" referrerpolicy="no-referrer"><br> 而 GXDE 的图库也进行了大更新,新增图片列表和图库功能,满足更多用户需求<br> <img src="https://imgproxy.citrusreader.com/wwgvLXqfrHNPfn4q8lyrC8JfwD6MqdRDem1tGEbvXS0/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2d4ZGUtaW1hZ2Utdmlld2VyLWxpc3QuanBn" title alt="GXDE 看图 新增图片列表" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/KsiWuMNipz7517yv-g1pT93n4JJElR4LTk3vWzhYt3A/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2d4ZGUtaW1hZ2Utdmlld2VyLXRpbWVsaW5lLmpwZw" title alt="GXDE 看图 新增图库功能" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/CwBynqQ5QzYFhCa7RygCbj9AH_dizZJpVKtSWUiFA84/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2d4ZGUtaW1hZ2Utdmlld2VyLWZhdm91cml0ZS5qcGc" title alt="GXDE 看图 新增图库功能 收藏功能" referrerpolicy="no-referrer"></p> <h2>详细更新日志</h2> <blockquote class="uncited"><div><p>具体更新日志可见:<a href="https://www.gxde.top/news/25.4" rel="ugc noopener nofollow" target="_blank">https://www.gxde.top/news/25.4</a></p></div></blockquote> <p>如果在更新后出现控制中心无法开启、桌面无法进入等问题,可以打开系统终端或切换至 tty 输入以下命令进行修复:</p> <pre><code>sudo apt install gxde-desktop -y</code></pre> <ul><li>更新 gl4es、box64、扫描管理器、日志管理器 版本</li> <li>修复使用任务栏回收站插件清空回收站功能导致任务栏崩溃的问题(感谢 @htmlx5 <a href="https://gitee.com/GXDE-OS/GXDE/issues/IDPHCP" rel="ugc noopener nofollow" target="_blank">https://gitee.com/GXDE-OS/GXDE/issues/IDPHCP</a> )</li> <li>修复设置资源监视插件导致任务栏崩溃的问题</li> <li>禁用控制中心 插入鼠标禁用触控板 功能</li> <li>源内新增 6.1 内核</li> <li>恢复 i386 构建</li> <li>修复部分 Intel 无线网卡网速慢的问题</li> <li>(<a href="https://gitee.com/GXDE-OS/GXDE/issues/IC8LIU" rel="ugc noopener nofollow" target="_blank">https://gitee.com/GXDE-OS/GXDE/issues/IC8LIU</a> )</li> <li>更新源内博通驱动以适配 6.18 内核</li> <li>GXDE 硬件查看器新增驱动更新功能<br> <img src="https://imgproxy.citrusreader.com/vPhutWdCp09eRo8X90VR6qjZfQvX2X-_V2g3c5Hp8ZU/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2RyaXZlci11cGRhdGUuanBn" title alt="GXDE 硬件查看器新增驱动更新功能" referrerpolicy="no-referrer"></li> <li>GXDE 任务栏支持图标不合并<br> <img src="https://imgproxy.citrusreader.com/-UpoTcqExDM0AY2fmkUyn906-SJ7ZZQycL6EBcFDblU/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2RvY2stdW5mb2xkLmpwZw" title alt="GXDE 任务栏支持图标不合并" referrerpolicy="no-referrer"></li> <li>修复 GXDE 番茄钟图标缺失的问题</li> <li>修改部分组件最低 cmake 版本要求</li> <li>新增深度相机<br> <img src="https://imgproxy.citrusreader.com/DbSd_cFn7K4RcGB3qUzSMM3tdCshYMopM-LuvcaT6HE/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2RlZXBpbi1jYW1lcmEuanBn" title alt="新增深度相机" referrerpolicy="no-referrer"></li> <li>更新 deepin scanner、dtk6 版本</li> <li>硬件查看器支持查看显卡显存大小、多显示器信息<br> <img src="https://imgproxy.citrusreader.com/87a_9NG5u0jknIoFOBLXvMAJ9vDiB_einV6sDZxLmQM/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L3ZpZXdlci1kaXNwbGF5LmpwZw" title alt="硬件查看器支持查看显卡显存大小、多显示器信息" referrerpolicy="no-referrer"></li> <li>GXDE 局域网共享支持自定义端口号、上传文件夹、开机自启动</li> <li>优化 GXDE 局域网共享网页 UI<br> <img src="https://imgproxy.citrusreader.com/rvmep8wNo09uT0hfA7BrwmAnoB6_BZcfRJAHs8G5WhA/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L3NlbmRieWxhbi1wb3J0LmpwZw" title alt="GXDE 局域网共享支持自定义端口号、上传文件夹、开机自启动" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/rZZM14DU6Ll9B5NDyj9-NtU-gnv_9sGvO4SFlW3PkK0/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L3NlbmRieWxhbi11aS5qcGc" title alt="优化 GXDE 局域网共享网页 UI" referrerpolicy="no-referrer"></li> <li>移除 gxde-default-settings /etc/binfmt.d/wine.conf,修复与 ukylin-wine 冲突的问题</li> <li>修复番茄钟无法自定义时间的问题 <a href="https://gitee.com/GXDE-OS/GXDE/issues/IDPQPD" rel="ugc noopener nofollow" target="_blank">https://gitee.com/GXDE-OS/GXDE/issues/IDPQPD</a></li> <li>修复 deepin 截图打开文件夹和保存到自定义位置功能无法使用的问题</li> <li>修改硬件查看器系统信息页面显示硬盘容量功能,修改为显示硬盘+容量以及其它程序 UI 变动</li> <li>修复局域网文件传输助手在 Python 3.13 无法上传文件的问题</li> <li>新增壁纸 TheSourceOfGXDE、TheSourceOfGXDEDark、枫叶<img src="https://imgproxy.citrusreader.com/u9r5VED8AU0Gn8QB2cijzmSIDe12HcSCoaCYjPP3Y0g/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L1RoZVNvdXJjZU9mR1hERS5qcGc" title alt="TheSourceOfGXDE" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/f4MJho-30TWTnm2CcKspK7b2B7oLXvX-Xrq32jjGlQQ/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L1RoZVNvdXJjZU9mR1hERURhcmsuanBn" title alt="TheSourceOfGXDEDark" referrerpolicy="no-referrer"><br> <img src="https://imgproxy.citrusreader.com/oos6rQsHEL8n__P0XnZS15MZu1R7tR4XoiCvNGn_JRU/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L0Zlbmd5ZS5qcGc" title alt="枫叶" referrerpolicy="no-referrer"></li> <li>移除壁纸 茶与酒之歌、海底古城</li> <li>更新星火商店至 5.0.1<br> <img src="https://imgproxy.citrusreader.com/2BIiChLHpKaw7Dm1tmltT7REIAFBndxCeFVNn2Wq3H4/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L3NwYXJrLXN0b3JlLmpwZw" title alt="更新星火商店至 5.0.1" referrerpolicy="no-referrer"></li> <li>新增依赖包 udisk2-qt6</li> <li>修复 nvidia-driver 驱动在 6.19 内核下 dkms 编译报错的问题</li> <li>修复启动器全屏显示时顶栏显示问题有误的问题</li> <li>更新 calamares 版本至 3.4.2-1,合并 calamares riscv64 支持 pr</li> <li>更新 deepin 资源监视器版本至 6.5.41,新增 GPU 占用率查看功能</li> <li>GXDE 文件管理器不再强制依赖 gxde-requ</li> <li>降低文本编辑器超大文件高亮的主线程占用,提升性能</li> <li>修复文件编辑器超大文件打开卡死、高亮卡顿问题</li> <li>文件编辑器新增 shebang 识别</li> <li>更新 uos ai 版本至 2.13.505</li> <li>新增 nvidia-graphics-drivers-legacy-390xx 驱动,兼容 GXDE 25 + 6.19 内核</li> <li>GXDE 硬件查看器新增自定义壁纸功能</li> <li>优化 GXDE 硬件查看器 UI,贴合系统 dtk2 应用风格</li> <li>新增:GXDE 硬件查看器在触摸屏上支持使用手指拖拽标题栏</li> <li>GXDE 硬件查看器优化获取显卡驱动功能<br> <img src="https://imgproxy.citrusreader.com/y0M5kYsQ23JdEmsKtVB1hJfVJHU9IE7b4K7bYBHgVIA/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2d4ZGUtaGFyZHdhcmUtdmlld2VyLmpwZw" title alt="GXDE 硬件查看器新增自定义壁纸功能" referrerpolicy="no-referrer"></li> <li>更新 deepin-systemassistant-knowledge(UOS AI 知识库)版本至 0.0.19</li> <li>更新 deepin-modelhub 版本至 0.0.34,支持调用 GPU cuda 和系统 vulkan 进行本地模型加速</li> <li>修复 GXDE 系统助手从工具箱打开的应用UI显示异常的问题</li> <li>更新 deepin-ai-daemon 版本至 1.1.31</li> <li>GXDE 任务栏虚拟键盘插件支持调用麒麟虚拟键盘</li> <li>GXDE 顶栏虚拟键盘插件支持调用麒麟虚拟键盘</li> <li>GXDE 任务栏高效模式支持直接显示电池剩余电量百分比<br> <img src="https://imgproxy.citrusreader.com/m8zpQYIO_VIcOTZ4aiZ3-DowobYGv-fiNt0on2rJO8k/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2JhdHRlcnkuanBn" title alt="GXDE 任务栏高效模式支持直接显示电池剩余电量百分比" referrerpolicy="no-referrer"></li> <li>GXDE 任务栏电源插件支持查看电池健康度</li> <li>Kmre APK 安装工具支持查看 apk 图标<br> <img src="https://imgproxy.citrusreader.com/QggKMPv0HVxT7cMi_6UOWxTriwkdwM3sRh1GzTGodo8/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2t5bGluLWttcmUtYXBrLWluc3RhbGxlci5qcGc" title alt="Kmre APK 安装工具支持查看 apk 图标" referrerpolicy="no-referrer"></li> <li>更新星火动态壁纸版本至 2.1.0-2</li> <li>修复 GXDE 顶栏点击有线网络图标但跳转到无线网络设置页的问题</li> <li>修复 GXDE 音乐歌曲信息页面不显示关闭按钮的问题</li> <li>修复 SparkWebAppRuntime 在设置 -G 0 后无法加载本地服务的问题</li> <li>SparkWebAppRuntime 默认使用 Qt6 构建</li> <li>更新 GXDE 下载器 AriaNg 版本至 1.3.13</li> <li>GXDE 下载器默认跟随系统主题<br> <img src="https://imgproxy.citrusreader.com/aVpalKZDhYWl_2MfIPi46EIw9n_1qM_8hc0QYq_Uc-c/raw:1/aHR0cHM6Ly93d3cuZ3hkZS50b3AvbmV3cy8yNS40L2d4ZGUtZG93bmxvYWRlci5qcGc" title alt="GXDE 下载器默认跟随系统主题" referrerpolicy="no-referrer"></li> <li>修复 GXDE 下载器在部分电脑花屏的问题(禁用 GPU 加速)</li> <li>移除 deepin anything dkms 避免内核崩溃</li> <li>修复 deepin 相机图片和视频不能预览的问题</li> <li>更换 gxde-dummyapps spk://store 为 spk://search 以兼容星火 5.0</li> <li>GXDE Icon 添加 ukui-virtual-keyboard-symbolic 图标</li> <li>更新 deepin face 版本至 2.0.11</li> <li>新增虚包 linux-kernel-gxde-loong64-4k-pagesize、linux-kernel-oldstable-gxde-loong64-4k-pagesize 以便方便安装 4k 分页的内核</li> <li>6.6、6.12、6.18 内核新增 NTFS Plus Driver</li> <li>将 linux-kernel-phytium-gxde-arm64 指向 linux-kernel-oldstable-gxde-arm64,不再单独维护 Phytium 内核</li> <li>GXDE ISO Builder 所有架构统一安装 linux-kernel-oldstable-gxde-xxx 和 linux-kernel-gxde-xxx 虚包,降低维护成本</li> <li>修复 dock 启动系统监视器双标题栏的问题</li> <li>GXDE 看图 新增图片列表</li> <li>GXDE 看图 新增图库功能</li> <li>调整 GXDE 控制中心 VNC 远程密码输入框样式与其他设置项的输入框样式一致</li> <li>KMRE APK 包安装器 使用 Qt6+cmake 构建</li> <li>更新玲珑版本至 1.12.3</li> <li>更新跨端协调版本为 1.2.4</li> <li>更新系统监视器版本为 6.5.41</li> <li>更新内核版本至 6.6.135、6.18.25,修复 CVE-2026-31431</li> <li>更新 i386 架构内核版本,统一内核基线(6.1.162=&gt;6.6.135、6.18.25)</li></ul>

2026/5/17
阅读更多

推荐订阅

| NBA | 足球 | 电竞 | 综合 | | --- | ----- | -------- | ------ | | nba | zuqiu | dianjing | zonghe |