保护模式下的80386及其编程04:中断及异常 目录1 概述1.1 什么是中断和异常1.2 中断和异常处理时机1.3 中断向量1.4 中断和异常的屏蔽简介2 中断2.1 INTR中断2.2 NMI中断3 异常3.1 异常分类3.1.1 故障(Fault)3.1.2 陷阱(Trap)3.1.3 终止(Abort)3.2 异常小结3.2.1 异常0:除法出错3.2.2 异常1:排错异常3.2.3 异常3:单字节INT33.2.4 异常4:溢出3.2.5 异常5:边界检查3.2.6
保护模式下的80386及其编程03:保护虚拟地址方式 目录1 内存管理机制1.1 概述1.2 地址转换1.2.1 转换什么地址?1.2.2 段机制和分页机制1.2.3 地址转换信息表1.3 虚拟内存的概念1.3.1 虚拟地址空间 / 线性地址空间 / 物理地址空间的大小1.3.2 虚拟内存的实现机制1.4 内存保护1.4.1 隔离:任务间的保护1.4.2 特权级:任务内的保护1.4.3 组合保护与操作系统保护的实现2 段机制2.1 概述2.1.1 段的参数与映射2.1.2 段机制使用流程2
保护模式下的80386及其编程02:机器状态和存储寻址 目录1 寄存器1.1 通用寄存器1.2 处理器控制寄存器1.2.1 指令指针寄存器EIP1.2.2 处理器状态和控制标志寄存器EFLAGS1.3 段寄存器2 内存寻址机制2.1 基于段的内存寻址2.2 段地址的构成2.2.1 概述2.2.2 隐式与默认引用2.2.3 显式指定2.3 偏移地址的构成2.3.1 基地址2.3.2 变址2.3.3 比例因子2.3.4 偏移量2.4 程序栈2.4.1 栈的基本操作2.4.2 子程序与栈
保护模式下的80386及其编程01:数据类型 目录1 Intel微处理器发展简介2 80386数据类型2.1 数据存储2.1.1 内存组织2.1.2 存储字节序2.2 整数2.3 字符串2.4 位串2.4.1 位串布局2.4.2 位串索引2.5 BCD码3 80387浮点数据格式简介3.1 实数与浮点数的关系3.2 浮点数构成3.3 数据格式4 为什么要学习数据类型?1 Intel微处理器发展简介1. Intel的第一代微处理器是4位的4004和8位的8008(1971年),他
ARMv8体系结构基础05:比较和跳转指令 目录1 比较与测试指令详解1.1 CMP指令1.1.1 概述1.1.2 指令编码分析1.2 CMN指令1.2.1 概述1.2.2 指令编码分析1.3 TST指令1.3.1 概述1.3.2 指令编码分析1.4 比较与测试指令实验1.4.1 实验要求1.4.2 实验代码1.4.3 调试分析2 条件执行指令综述2.1 A64指令集中的条件执行2.2 A64指令集中会设置标志位的指令2.2.1 算术运算指令2.2.2 逻辑运算指令2.2
ARMv8体系结构基础04:算术和移位指令 目录1 数据处理指令概述2 加法指令详解2.1 ADD指令2.1.1 ADD(extended register)指令编码分析2.1.2 ADD(extended register)指令编码验证2.1.3 ADD(immediate)指令编码分析2.1.4 ADD(immediate)指令编码验证2.1.5 ADD(shifted register)指令编码分析2.1.6 ADD(shifted register)指令编码验证2.2 ADDS指令2.2.1 概述
编程高手必学的内存知识02:深入理解栈 目录1 函数与栈帧1.1 概述1.2 从指令角度理解栈1.3 递归与栈1.3.1 示例程序1.3.2 反汇编分析1.3.3 栈状态分析1.3.4 GDB调试验证1.3.5 栈溢出2 缓冲区溢出攻击2.1 缓冲区溢出攻击示例2.2 缓冲区溢出攻击原理分析2.2.1 反汇编分析2.2.2 栈状态分析2.3 解决方案2.3.1 参数检查2.3.2 使用GCC自带的栈保护机制2.4 GCC -fstack-protector机制验证与分析2
庖丁解牛Linux内核分析01:操作系统工作原理基础 目录1 存储程序计算机工作模型2 IA-32汇编基础2.1 寄存器概述2.1.1 通用寄存器2.1.2 段寄存器2.1.3 标志寄存器2.2 数据格式2.3 寻址方式2.3.1 立即数寻址2.3.2 寄存器寻址2.3.3 存储器引用寻址2.4 内嵌汇编概述2.4.1 内嵌汇编简单语法2.4.2 内嵌汇编示例3 深入理解函数调用栈3.1 相关寄存器3.2 相关指令3.2.1 pushl & popl指令3.2.2 call &
Linux 0.11内核分析04:多进程视图 目录1 进程概念的引入1.1 使用CPU的直观想法1.2 直观用法的缺点1.3 直观用法的改进1.4 进程的概念1.4.1 保存程序执行状态1.4.2 进程与PCB1.5 Linux 0.11 PCB实例2 多进程视图2.1 用户视角2.2 操作系统视角2.3 Linux 0.11多进程视图实例2.3.1 0号进程2.3.2 1号进程2.3.3 2号进程3 多进程的组织与管理3.1 进程状态3.1.1 进程状态概述3.1.2 Lin
ARMv8体系结构基础03:加载和存储指令 目录1 A64指令集概述1.1 A64指令集特征1.1.1 指令定长1.1.2 可使用64位指针1.1.3 使用一致的编码结构(consistent encoding scheme)1.1.4 指令中可使用更大范围的常数1.1.5 数据类型更简单1.1.6 指令中可使用更大的偏移量(long offset)1.2 寄存器在指令中的编码1.3 A64指令集的2种形式1.4 条件执行1.5 其他内容2 Load / Store指令详解2.1 概述2.2
CMake快速入门01:CMake简介与安装 1 CMake简介1. CMake是一个开源的跨平台工具2. CMake可以用于构建、测试以及打包软件3. CMake并不直接构建出最终的程序,而是产生标准的构建脚本(e.g. Linux中的Makefile),之后再以一般的构建方式使用(e.g. Linux中的make)2 CMake安装CMake官网:https://cmake.org/1. CMake以源码以及二进制文件的方式发布,可以根据需求与不同平台选择适合的版本2. 对于Ubuntu操作系统,可以使用...
玩转Git三剑客01:Git基础 1 版本管理演变VCS(Version Control System):版本控制系统,是一种记录一个或若干个文件内容变化,以便将来查阅特定修订情况的系统1.1 VCS出现之前1. 使用目录拷贝区分不同版本2. 开发过程中,公共文件容易被覆盖3. 成员沟通成本高,代码集成效率低下1.2 集中式VCS1. 具有集中的版本管理服务器2. 具备文件版本管理和分支管理能力3. 集成效率明显提高4. 因为客户端不具备完整的版本历史,因此客户端需要时刻和服...
现代操作系统原理与实践04:实验1:机器启动 目录1 实验环境使用说明1.1 环境部署1.2 源码下载1.3 代码编译1.4 qemu运行1.5 qemu调试1.5.1 启动GDB Server1.5.2 连接GDB Server1.5.3 调试环境改进2 编译后结果分析2.1 磁盘中的Section2.2 加载到内存中的Segment2.2.1 Segment 0分析2.2.2 Segment 1分析3 实验代码分析3.1 代码布局3.2 重要编译配置文件3.2.1 script
现代操作系统原理与实践03:操作系统结构 1 操作系统的目标1. 用户目标:方便使用、容易学习、可靠、不易出错、高效等2. 系统目标:易于实现与维护、灵活、可靠、不易出错、高效等说明:复杂系统的构建必须考虑内部结构① 不同目标之间往往存在冲突② 不同需求之间需要进行权衡③ 在操作系统的发展历史中,曾多次出现因过于强调各种极致性能而导致设计结构不合理并最终失败的案例(e.g. Windows VISTA)2 操作系统的机制与策略操作系统乃至计算机系统中控制复杂度的一个重要原则就是将机制与策略相分离1. 策略..
编程高手必学的内存知识01:深入理解虚拟内存 目录1 物理内存1.1 物理内存概述1.2 直接使用物理内存的问题1.2.1 多进程地址布局困难1.2.2 进程地址空间小1.2.3 程序链接不统一2 虚拟内存2.1 引入虚拟内存的目的2.2 局部性原理与虚拟内存2.3 虚拟内存到物理内存的映射2.3.1 概述2.3.2 页面分配与映射2.4 页表结构2.4.1 概述2.4.2 页表2.4.3 页目录表2.4.4 虚拟地址翻译过程3 页面换入换出4 内存的段式管理与页式管理4.
九章基础算法04:二叉搜索树与哈希表 1. 什么是二叉搜索树1.1 二叉搜索树结构满足以下条件的二叉树,称为二叉搜索树(Binary Search Tree,BST)1. 对于每个节点,他的左子树的所有节点都比他小2. 对于每个节点,他的右子树的所有节点都比他大说明1:以上是严格的说法,不允许BST中有重复节点,但是实际算法中可以允许重复说明2:二叉搜索树也是递归的数据结构,他的左右子树也是二叉搜索树说明3:上述二叉搜索树的特性换一种说法,① 对于每个节点,左子树中的最大值小于该节点...
数据结构与算法基础02:线性表 目录1. 线性表抽象数据类型1.1 概述1.2 抽象数据类型2. 线性表的顺序表示和实现2.1 概述2.1.1 存储方式2.1.2 逻辑关系表示2.1.3 操作特性2.2 实现2.2.1 顺序表类型定义2.2.2 InitList & DestroyList实现2.2.3 ClearList实现2.2.4 ListEmpty实现2.2.5 ListLength实现2.2.6 GetElem实现2.2.7 LocateElem实现2.
ARMv8体系结构基础02:搭建实验环境 1 实验环境概述1.1 实验环境种类《奔跑吧Linux第3季》课程共提供2种实验环境1. 使用qemu模拟树莓派4b的实验环境2. 实际基于树莓派4b的实验环境1.2 树莓派4b简介我们的软硬件实验环境均基于树莓派4b,此处进行简要介绍1. 使用BCM2711作为主芯片2. 内置4核Cortex-A723. 内置GICv2中断控制器4. 支持丰富的外设接口说明:树莓派4b address map介绍树莓派4b的address map主要是为了...
现代操作系统原理与实践02:硬件结构 1 冯.诺依曼结构从宏观上看,现在主流的计算机依然采用冯.诺依曼结构1.1 中央处理单元1. 中央处理单元(Central Processing Unit,CPU)主要负责运算和逻辑控制2. CPU中包括处理单元和控制单元1.2 存储器1. 存储器(memory unit)负责存储程序指令和数据,以及保存程序执行的中间结果和最终结果2. 在现代计算机中,存储器通常包括寄存器、CPU缓存、内存等存储层次1.3 输入输出输入输出(Input and Output,I/..
ARMv8体系结构基础01:ARMv8体系结构简介 目录1 ARMv8体系结构特性2 ARMv8体系结构基本概念2.1 处理机(Processing Element, PE)2.2 异常等级(Exception Level)2.2.1 异常等级概述2.2.2 安全状态(security state)2.2.3 异常等级切换2.3 执行状态(Execution State)2.3.1 执行状态概述2.3.2 AArch64执行状态2.3.3 AArch32执行状态2.3.4 执行状态切换3 AArch64中的