Logo 操作系统如何与LoongArch交互
v1.1.0
  • 1. 准备工作
    • 1.1. 前言
      • 1.1.1. 仓库地址
      • 1.1.2. 维护说明
      • 1.1.3. 更新说明
    • 1.2. 工具链说明
      • 1.2.1. GCC
      • 1.2.2. LLVM
      • 1.2.3. Rust
    • 1.3. 模拟器
      • 1.3.1. QEMU
      • 1.3.2. LA_EMU
    • 1.4. 操作系统编译
      • 1.4.1. LoongNix
      • 1.4.2. Deepin
      • 1.4.3. AOSC(安同)
      • 1.4.4. Linux kernel
    • 1.5. LICENSE说明
      • 1.5.1. 声明
  • 2. 工具链
    • 2.1. GCC
      • 2.1.1. GCC的相关概念
        • 2.1.1.1. GCC的基本定义与起源
        • 2.1.1.2. GCC支持的语言与平台
        • 2.1.1.3. GCC的核心功能与特点
        • 2.1.1.4. GCC的最新进展
        • 2.1.1.5. GCC的应用场景
      • 2.1.2. 交叉编译器
      • 2.1.3. 常见的类别组合
      • 2.1.4. 如何编译交叉编译器
        • 2.1.4.1. 如何编译loongarch64-linux-gnu[sf]
        • 2.1.4.2. 如何编译loongarch64-linux-musl[sf]
        • 2.1.4.3. crtn, crti, crtbegin, crtend有什么区别
      • 2.1.5. 常用的参数与选项
        • 2.1.5.1. GCC常见的参数
        • 2.1.5.2. PIC与PIE的区别是什么
        • 2.1.5.3. 与LoongArch相关的选项说明
        • 2.1.5.4. C/C++ 预处理器内嵌的宏定义
    • 2.2. Binutils
      • 2.2.1. GNU Binutils的相关说明
        • 2.2.1.1. 核心定位与背景
        • 2.2.1.2. 重要组成部分与功能
        • 2.2.1.3. 应用场景
      • 2.2.2. ld链接器
        • 2.2.2.1. LD的参数说明
      • 2.2.3. 如何正确的使用readelf
        • 2.2.3.1. 基础用法与核心选项
        • 2.2.3.2. 二、高级用法
        • 2.2.3.3. 三、实战示例
        • 2.2.3.4. 四、与其他工具对比
      • 2.2.4. objdump
        • 2.2.4.1. 一、基础用法与核心选项
        • 2.2.4.2. 二、高级用法
        • 2.2.4.3. 三、典型应用场景
        • 2.2.4.4. 四、与其他工具对比
        • 2.2.4.5. 五、注意事项
        • 2.2.4.6. 六、实战示例
      • 2.2.5. objcopy
        • 2.2.5.1. 一、基础用法与核心选项
        • 2.2.5.2. 二、高级功能
        • 2.2.5.3. 三、参数详解
        • 2.2.5.4. 四、典型应用场景
        • 2.2.5.5. 五、常见问题与解决
        • 2.2.5.6. 六、与其他工具对比
        • 2.2.5.7. 七、总结
    • 2.3. Rust
      • 2.3.1. Rust的概念
        • 2.3.1.1. Rust的起源与发展
        • 2.3.1.2. Rust的核心特性
        • 2.3.1.3. Rust的应用场景
        • 2.3.1.4. Rust的最新进展
        • 2.3.1.5. Rust的优缺点
      • 2.3.2. LoongArch支持的target有哪些
      • 2.3.3. 与LoongArch相关的具体参数那些
      • 2.3.4. 简单的例子说明如何编译成LA架构的EXE文件
    • 2.4. 内嵌的函数与指令包装
      • 2.4.1. GCC
      • 2.4.2. LLVM
      • 2.4.3. Rust
        • 2.4.3.1. LoongArch包的相关内容
    • 2.5. 汇编代码与链接脚本
      • 2.5.1. 与LoongArch相关的汇编指令
        • 2.5.1.1. 伪汇编指令
        • 2.5.1.2. 地址加载指令
        • 2.5.1.3. 内嵌汇编
        • 2.5.1.4. 参考阅读
      • 2.5.2. 链接脚本
        • 2.5.2.1. 一、基础语法结构
        • 2.5.2.2. 二、核心命令与操作
        • 2.5.2.3. 三、高级功能
        • 2.5.2.4. 四、典型应用场景
        • 2.5.2.5. 五、实战示例
        • 2.5.2.6. 六、调试与验证
        • 2.5.2.7. 七、总结
        • 2.5.2.8. 以LoongArch为例说明链接脚本
    • 2.6. 一些常用的库函数
      • 2.6.1. GLIBC
        • 2.6.1.1. 一、核心功能与作用
        • 2.6.1.2. 二、架构与实现细节
        • 2.6.1.3. 三、版本演进与升级风险
        • 2.6.1.4. 四、与其他运行库的对比
        • 2.6.1.5. 五、开发与调试工具
      • 2.6.2. MUSL
        • 2.6.2.1. Musl C 库详解
        • 2.6.2.2. 总结
      • 2.6.3. memcpy
      • 2.6.4. memmove
      • 2.6.5. memset
  • 3. 特权态指令
    • 3.1. CSR寄存器
    • 3.2. CSR指令
      • 3.2.1. CSRRD指令
      • 3.2.2. CSRWR指令
      • 3.2.3. CSRXCHG指令
    • 3.3. IOCSR指令
      • 3.3.1. IOCSRRD指令
      • 3.3.2. IOCSRWR指令
    • 3.4. CPUCFG 指令
    • 3.5. CACOP 指令
    • 3.6. TLB 与页表指令
      • 3.6.1. TLB 相关指令
        • 3.6.1.1. TLBSRCH
        • 3.6.1.2. TLBRD
        • 3.6.1.3. TLBWR
        • 3.6.1.4. TLBFILL
        • 3.6.1.5. TLBCLR
        • 3.6.1.6. TLBFLUSH
        • 3.6.1.7. INVTLB
      • 3.6.2. 页表查找指令
        • 3.6.2.1. LDDIR
        • 3.6.2.2. LDPTE
      • 3.6.3. 应用示例
    • 3.7. ERTN指令
    • 3.8. IDLE指令
    • 3.9. SysCALL指令
  • 4. 内存管理
    • 4.1. LoongArch的地址管理
      • 4.1.1. 直接地址翻译模式
      • 4.1.2. 映射地址翻译模式
      • 4.1.3. 存储访问的类型
    • 4.2. LoongArch的TLB结构
      • 4.2.1. 逻辑组织结构
      • 4.2.2. TLB的表项(以CPU的视觉)
    • 4.3. TLB的管理
      • 4.3.1. TLB的一些概念区分
      • 4.3.2. TLB相关的指令
      • 4.3.3. TLB相关的CSR
      • 4.3.4. TLB相关的例外
      • 4.3.5. CPU内部TLB查找流程示例
    • 4.4. 直接映射翻译模式
      • 4.4.1. CSR.DMW[0-3]
      • 4.4.2. 操作系统中如何使用
        • 4.4.2.1. DMW的优点
        • 4.4.2.2. DMW的缺点
        • 4.4.2.3. 代码示例如何在内核中使用
    • 4.5. 多级页表结构
      • 4.5.1. 设计背景与必要性
        • 4.5.1.1. 多级页表的结构与层级
        • 4.5.1.2. 地址转换流程
        • 4.5.1.3. 多级页表的优势
        • 4.5.1.4. 优化机制
        • 4.5.1.5. 对比不同架构的页表设计
      • 4.5.2. LoongArch的多级页表结构
        • 4.5.2.1. Kernel如何初始化设置多级页表结构
        • 4.5.2.2. 二级页表,4KB页大小
        • 4.5.2.3. 二级页表,16KB页大小
        • 4.5.2.4. 三级页表,4KB页大小
        • 4.5.2.5. 三级页表,16KB页大小
        • 4.5.2.6. 四级页表,4KB页大小
        • 4.5.2.7. 四级页表,16KB页大小
      • 4.5.3. 内存中的页表表项(Kernel视角)
        • 4.5.3.1. 基本页表(叶子节点)
        • 4.5.3.2. 大页页表(叶子节点)
        • 4.5.3.3. 中间指向下一级目录的地址的页表(非叶子节点页表)
      • 4.5.4. 页表的遍历
        • 4.5.4.1. 以一个例子4K页为例说明:
        • 4.5.4.2. 以一个例子2M页为例说明:
    • 4.6. 从内存中的页表表项到CPU中的TLB
      • 4.6.1. TLBRefill (Softeware PTW)
        • 4.6.1.1. 相关的CSR寄存器
        • 4.6.1.2. 重填示例代码
        • 4.6.1.3. 两级页表的示例代码
        • 4.6.1.4. 三级页表的示例代码
        • 4.6.1.5. 四级页表的示例代码
      • 4.6.2. Hardware PTW
      • 4.6.3. 页表的刷新
        • 4.6.3.1. 页表为什么需要刷新
        • 4.6.3.2. 页表刷新的指令
        • 4.6.3.3. 页表刷新的例子
    • 4.7. Kernel与MMU
      • 4.7.1. 地址翻译相关的初始化
      • 4.7.2. 如何从直接地址翻译模式到映射地址翻译模式
      • 4.7.3. 如何建立虚拟地址到物理地址的映射关系
      • 4.7.4. 页表的遍历页表
      • 4.7.5. 情况1. 如果TLB中没有映射
      • 4.7.6. 情况2. 如果页表项的V=0
      • 4.7.7. 情况3. 如果写操作页表项D=0
      • 4.7.8. 情况4. 如果权限不合法
      • 4.7.9. 如果使能硬件PTW
  • 5. 中断与异常系统
    • 5.1. 中断
      • 5.1.1. 线中断
        • 5.1.1.1. 核间中断IPI
        • 5.1.1.2. 定时器中断
        • 5.1.1.3. 性能计数器中断
        • 5.1.1.4. 外部硬中断
        • 5.1.1.5. 内部软中断
        • 5.1.1.6. 中断号
      • 5.1.2. 消息中断
      • 5.1.3. 中断的优先级
        • 5.1.3.1. 线中断的优先级
        • 5.1.3.2. 消息中断的优先级
      • 5.1.4. 中断的打开与关闭
      • 5.1.5. 中断的入口地址
      • 5.1.6. 中断的处理流程
    • 5.2. 例外
      • 5.2.1. 例外的优先级
      • 5.2.2. 例外的入口地址
      • 5.2.3. 例外的处理过程
        • 5.2.3.1. 普通例外的处理过程
        • 5.2.3.2. TLB 重填例外硬件处理过程
        • 5.2.3.3. 机器错误例外硬件处理过程
    • 5.3. Kernel与异常
      • 5.3.1. 异常的入口地址选择
        • 5.3.1.1. “统一式”的入口地址
        • 5.3.1.2. “分离式”的入口地址
      • 5.3.2. 异常的初始化
        • 5.3.2.1. 统一式的初始化
        • 5.3.2.2. 分离式的初始化
      • 5.3.3. 异常发生时,CPU做了什么
    • 5.4. 特殊异常的处理
      • 5.4.1. 定时器中断
      • 5.4.2. 系统调用
      • 5.4.3. 非对齐访问
  • 6. SMP多核系统
    • 6.1. SMP对称多核处理器
      • 6.1.1. SMP多核处理器概述
      • 6.1.2. SMP的核心特征
      • 6.1.3. SMP的技术原理
        • 6.1.3.1. 硬件要求
        • 6.1.3.2. 操作系统支持
      • 6.1.4. SMP的优缺点
        • 6.1.4.1. 优点
        • 6.1.4.2. 缺点
      • 6.1.5. SMP的应用场景
      • 6.1.6. SMP与其他架构的对比
      • 6.1.7. SMP的发展趋势
      • 6.1.8. 总结
    • 6.2. SMP与LoongArch
    • 6.3. IPI中断
      • 6.3.1. 按地址访问模式(MMIO)
      • 6.3.2. 按配置寄存器指令模式(IOCSR)
      • 6.3.3. 多核中断处理流程
    • 6.4. IOCSR指令与多核通信
    • 6.5. SMP的初始化
      • 6.5.1. CPU-0的初始化
    • 6.6. Linux中SMP的处理(与架构相关)
      • 6.6.1. 多核的同步
      • 6.6.2. 多核的页表处理
  • 7. 程序二进制接口
    • 7.1. 旧世界
    • 7.2. 新旧世界的区分
      • 7.2.1. 新世界与旧世界的区别
    • 7.3. 新旧世界的底层差异
      • 7.3.1. 导言
      • 7.3.2. 内核
        • 7.3.2.1. 引导协议
        • 7.3.2.2. 系统调用
      • 7.3.3. 用户态
        • 7.3.3.1. ELF 文件格式
        • 7.3.3.2. 程序解释器 {#program-interpreter}
        • 7.3.3.3. 过程调用约定
        • 7.3.3.4. 用户态兼容性概述
        • 7.3.3.5. glibc 符号版本 {#glibc-symbol-versioning}
        • 7.3.3.6. glibc 库列表
        • 7.3.3.7. 具体函数的行为区别
    • 7.4. 寄存器使用约定
      • 7.4.1. 使用说明
    • 7.5. 函数调用规约
    • 7.6. C语言与机器类型
      • 7.6.1. 数据类型
      • 7.6.2. 栈帧的排布
        • 7.6.2.1. 示例代码
      • 7.6.3. 优化对栈帧的影响
      • 7.6.4. longjump和setjump
        • 7.6.4.1. 工作机制
        • 7.6.4.2. 核心用途
        • 7.6.4.3. 关键特性与限制
    • 7.7. ELF头 (Header)
    • 7.8. ELF 可重定位
      • 7.8.1. 可重定位类型(Relocation Type)
      • 7.8.2. 动态链接(dynamic link)
      • 7.8.3. 静态链接(static link)
    • 7.9. 代码模型(Code Model)
    • 7.10. 程序如何加载-扩展阅读
  • 8. 调试方法与技巧
    • 8.1. LoongArch最小debug环境搭建
      • 8.1.1. 制作 Linux RamDisk
      • 8.1.2. QEMU 参数说明
      • 8.1.3. QEMU 调试教程
        • 8.1.3.1. 串口输出重定向
        • 8.1.3.2. GDB 调试
        • 8.1.3.3. QEMU Monitor
        • 8.1.3.4. 日志工具
        • 8.1.3.5. 常见问题
    • 8.2. GDB使用
      • 8.2.1. 交叉编译环境中的GDB
      • 8.2.2. 常见的GDB命令示例
        • 8.2.2.1. 设置与管理断点
        • 8.2.2.2. 设置与管理观察点
        • 8.2.2.3. 打印变量
        • 8.2.2.4. 打印寄存器信息
        • 8.2.2.5. 查看内存数值
        • 8.2.2.6. 查看堆栈信息
        • 8.2.2.7. 单步执行
        • 8.2.2.8. 设置变量数值
        • 8.2.2.9. 退出正在调试的函数
        • 8.2.2.10. 打印函数堆栈帧信息
        • 8.2.2.11. 配置 GDB 脚本
        • 8.2.2.12. 图形化界面
      • 8.2.3. 调试指令常见失效状况
    • 8.3. 裸机运行环境搭建
      • 8.3.1. 运行环境与开发工具
      • 8.3.2. 基于picolibc库的运行环境
        • 8.3.2.1. 获取和编译picolibc库
  • 9. 平台相关
    • 9.1. QEMU
      • 9.1.1. Virt
      • 9.1.2. 设备
    • 9.2. 3A5000芯片
      • 9.2.1. 芯片参数
      • 9.2.2. 芯片架构
      • 9.2.3. 地址空间
        • 9.2.3.1. 结点间物理地址空间
        • 9.2.3.2. 结点内物理地址空间
    • 9.3. 3A6000芯片
      • 9.3.1. 芯片参数
      • 9.3.2. 芯片架构
    • 9.4. 2k3000芯片
      • 9.4.1. 芯片参数
    • 9.5. 2k1000LA芯片
      • 9.5.1. 芯片参数
      • 9.5.2. 芯片架构
      • 9.5.3. 芯片功能
      • 9.5.4. 地址空间
    • 9.6. 2k0500芯片
      • 9.6.1. 芯片架构
      • 9.6.2. 芯片架构
      • 9.6.3. 芯片架构
      • 9.6.4. 芯片功能
      • 9.6.5. 地址空间
      • 9.6.6. 中断配置
    • 9.7. 2k0300芯片
      • 9.7.1. 芯片参数
      • 9.7.2. 芯片架构
      • 9.7.3. 芯片功能
      • 9.7.4. 地址空间
      • 9.7.5. 中断配置及路由
  • 10. 高级应用:SMID与向量指令
    • 10.1. TODO
  • 11. 高级应用:LVZ与虚拟化扩展
    • 11.1. TODO
  • 12. FAQ
    • 12.1. FAQ-25
操作系统如何与LoongArch交互
  • Search


© Copyright 2022-2026, 龙芯中科技术股份有限公司. Last updated on Apr 29, 2026 7:56:46 AM.