操作系统如何与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
Please activate JavaScript to enable the search functionality.