基于x86架构的简单内核实现-3-全局段描述符表
6.添加全局段描述符表6.1保护模式保护模式需要对内存段的性质和允许的操作给出定义,以实 现对特定内存段的访问检测和数据保护
80386中原先的 AX,BX,CX,DX,SI,DI,SP,BP从16位扩展(Extend)到了32位,并改名EAX,EBX, ECX,EDX,ESI,EDI,ESP,EBP,E就是Extend的意思。
8036保护模式下的分段
8036 虽然采用分段的方式进行寻址,但是 只是分了一个段
即段基址为0x00000000, 短长为0xFFFFFFFF(4GB)
32位的保护模式下,对一个内存段的描述需要8个字节 — 段描述符 (8字节 = 64位)
段描述符又分为:数据段描述符,指令段描述符和系统段描述符三种
描述符表:在内存中存放在描述符的集合
intel 直接设置了一个48位的全局描述符表寄存器(GDTR)来保存描述符表的信息
16位来表示表的长度,那么2的16次方就是65536字节,除以每一个描述符的8字 节,那么最多能创建8192个描述符
现代操作系统不在使用分段,而是直接使用分页技术
分页只是保护模式下的一种内存管 ...
基于x86架构的简单内核实现-2
5.库函数 和 调试打印函数基础部分在前四章已经介绍完了。
5.1 c语言字符串处理函数在内核中无法使用 处于用户态的c语言库函数 所以需要自己实现相关函数
include/string.h
123456789101112131415161718192021222324252627#ifndef INCLUDE_STRING_H_#define INCLUDE_STRING_H_#include "typers.h"// 函数声明// 将 src 指向的内存区域的前 len 个字节复制到 dest 指向的内存区域。void memcpy(uint8_t *dest, const uint8_t *src, uint32_t len);// 将 dest 指向的内存区域的前 len 个字节设置为 val 指定的值。void memset(void *dest, uint8_t val, uint32_t len);// 将 dest 指向的内存区域的前 len 个字节清零(等同于调用 memset(dest, 0, len))void bzero(vo ...
基于x86架构的简单内核实现
1.基础-环境配置与开发工具
本机环境:Ubuntu22.04
需要的开发工具
编译器:gcc
链接器:ld
汇编编译器:nasm
虚拟机:qemu
参考:
hurley25/hurlex-doc: hurlex 小内核分章节代码和文档 (github.com)
1.1qemuqemu安装:我之前安装了qemu8.0.0 故就不重新安装了
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
这个意思是后面直接可以用qemu代替 qemu-system-i386,会方便一些 但我觉得没有必要
1.2 Makefile 文件
给出详细的注释,项目基本上以这个Makefile为主
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 ...
ysyx-预学习阶段
1.预学习主要参考:
搭建verilator仿真环境 | 官方文档 (oscc.cc)
Verilog基本语法: — GPT4.0
Verilog 语言是一种用于电子设计自动化和硬件描述的硬件描述语言(HDL)。它使设计者能够以文本形式描述复杂的电子系统。Verilog 的基本语法元素包括:
1. 模块 (Modules)
模块是 Verilog 中的基本结构单元,用于封装硬件设计的各个部分。一个模块可以表示一个简单的门电路,一个复杂的微处理器,或者任何中间规模的组件。
123verilogCopy codemodule moduleName(input input1, output output1); // 模块体endmodule
2. 数据类型
网线 (wire): 用于连接模块内部的组件,或模块间的连接。它代表一个物理连接,可以携带一个信号。
寄存器 (reg): 用于在模块内部存储值。与 wire 不同,reg 可以保持其值,直到被新的值更新。
12verilogCopy codewire w; // 声明一个 wire 类型的变量reg r; // 声明一个 ...
基于qemu-riscv构建嵌入式系统
1.引言-板卡环境搭建1.1 qemu 环境搭建主要参考文章:
基于qemu-riscv从0开始构建嵌入式linux系统ch2. 添加qemu仿真板——Quard-Star板 — 主页 (quard-star-tutorial.readthedocs.io)
1.新建quard-star开发板 | TimerのBlog (yanglianoo.github.io)
【RISC-V】risc-v架构学习笔记(架构初学)_riscv mtvec-CSDN博客
‘virt’ 通用虚拟平台 (virt) — QEMU 文档
写这个 blog 主要记录一下学习过程,再次感谢!!
硬件架构图:
本机环境Ubuntu22.04 + qemu8.0.0
qemu 环境配置:新建 build.sh 文件,用于qemu的编译,
1234567cd qemu-8.0.0if [ ! -d "$SHELL_FOLDER/output/qemu" ]; then ./configure --prefix=$SHELL_FOLDER/output/qemu --target-list= ...
对缝融合特征提取
一、引言出发点:
在对缝的间隙和阶差的测量过程,对缝结构的正确,完整提取是非常重要的。
实际的点云采集过程中,易受到环境光照条件,以及被测量物体的表面反光条件的影响,点云的密度分布是不规律的,会收到光环境的影响,不再是传统意义上的在边界部分,或者拐角部分的密度大,密度差异不一致 —— 对缝结构采取 密度差异提取不可行。
融合曲率与边界特征提取,能极大的提高特征提取算法的鲁棒性。
如下图:点云的密度分布不均匀,采用密度分割 无法将特征提取。
因此提出曲率边界融合特征提取:
点云的曲率特征能够很大程度上的保留关键特征信息
点云的边界特征能够保留轮廓的信息
二、实现曲率估计
PCL中的曲率有两个 一个是 NormalEstimation中的曲率 ,另一个是PrincipalCurvaturesEstimation .
前者表示是表面曲率,即表示表面的起伏程度;
后者见下图,曲率估计出来有两个值,一个最大,一个最小曲率—>即可求平均曲率
123456789101112131415161718192021 // 计算pcl::PrincipalCurvatures ...
wsl2配置PCL并可视化
1.引言
之前在 win10 上安装了wsl2,基于Ubuntu20.04的系统,就想着能不能在 wsl2 配置 PCL 并实现可视化。
目前实现了在Ubuntu20.04 上 安装了 PCL1.12.0,并且实现了可视化。
就此记录一下,参考很多教程,再次表示感谢!!!
2.wsl2的安装
win10的版本必须是2004以上!!!
具体的参考了win10配置wsl2 - 知乎 (zhihu.com),这里不做赘述。
3.wsl2的GUI
最新的更新 wsl2 已经支持了Linux 的GUI
具体实现方式见:使用 WSL 运行 Linux GUI 应用 | Microsoft Learn
之前安装了 使用wsl --update更新就好,也可以安装其他的一些GUI的工具
4.PCL的安装
具体的思路就跟在平时安装一样,但需要注意几个点。
可以参照ubuntu20.04下安装pcl_ubuntu20.04安装pcl-CSDN博客这篇博客的安装方法
在安装过程中可能存在的问题:
VTK的安装过程中 缺QT的依赖,直接进行安装就行,解决方案:解决Cmake的一个小问题及QT4与 ...
CSAPP-6-cachelab
1.cachelab 引言参考:
csapp-cachelab 详解 - 知乎 (zhihu.com)
csapp实验5-cachelab实验详解-CSDN博客
CSAPP(CMU 15-213):Lab4 Cachelab详解-CSDN博客
非常感谢!!!
描述:part a 是实现cache的模拟器,part b 将针对缓存性能进行优化,写一个矩阵转置函数
2. Part A规则:
模拟器必须对任意的s,E和b正确工作,意味着必须使用malloc函数作为函数模拟器的数据结构体分配空间
本实验只对数据缓存性能感兴趣,因此应该忽略所有指令缓存访问,valgrind 总是将 i 放在第一位,将M(modify) L(load) S(store) 放在第二列。
为了获得分数,必须在主函数末尾调用printSummary(hit_count, miss_count, eviction_count);
对于本实验,应该假设内存访问已经正确对齐,因此单个内存访问永远不会越界。
思路:
缓存结构:
cache地址中包含标记tag,组索引s和块偏移b
首先会根据组索引在cache中找到组
然 ...
CSAPP-3-attacklab
1.attack lab 引言参考:
【精选】CSAPP-Lab03 Attack Lab 详细解析-CSDN博客
【精选】CSAPP–ATTACKLAB实验_attack lab-CSDN博客
目的:理解缓冲区溢出错误
文件解析:
ctarget一个易受到code-injection攻击的可执行程序
rtarget一个人易受到return-oriented-programming攻击的可执行程序
cookie一个8位的十六进制编码,唯一标识符用于身份验证
farm目标gadget-farm的源代码,产生return-oriented programming的时候会用到
hex2raw一个生成攻击字符串的程序
函数运行:
当运行./ctarget报错Running on an illegal host [DESKTOP-7HBMUNV]
则需要运行./ctarget -q不参与在线评分系统
实验阶段:
2.code-injection-attacks利用字符串攻击ctarget
2.1 lever 1
不需要注入新代码,输入字符串需要指引程序去执行一个已经存在的函数。
...
CSAPP-3-bomblab
3.bomb lab参考:
深入理解计算机系统-bomblab详解_独小雪的博客-CSDN博客
Lab2 CSAPP: BombLab环境+思路+全注释 - 知乎 (zhihu.com)
手把手教你拆解 CSAPP 的 炸弹实验室 BombLab - 知乎 (zhihu.com)
3.1基本指令
必须反汇编对炸弹进行拆除
objdump -d bomb > bomb.s生成bomb的汇编文件
objdump -d bomb > bomb.t生成bomb的符号表
gdb bombgdb调试bomb程序
(gdb) b 0x0000设置断点
(gdb) x/wx 0x0000 指令x:查看内存指令、w:四字节 x:16进制显示
所有的字符串都是通过%rdi寄存器传入的,在 bomb.s中搜索 phase_1,可以得到如下的代码:
12345400e32: e8 67 06 00 00 callq 40149e <read_line> # 读取命令行的字符串,%rax是 readline 的返回值也就是输入的string400e37: 48 8 ...