risc-v指令架构基础
RISC-V指令基础RV32RV32I
RV32M
RV32F & RV32D
RV32A
RV32C
RV32V
RV64RV64I
RV64M & RV64A
RV64F & RV64D
RV64C
RiscV中断
分类在Riscv中中断的类型分为3种
software interrupt——软件中断
timer interrupt——时钟中断
external interrupt——外部中断
mstatus(Machine Status),维护各种状态,如全局中断使能状态。
mip(Machine Interrupt Pending),记录当前的中断请求。
mie(Machine Interrupt Enable),维护处理器的中断使能状态。
mcause(Machine Exception Cause),指示发生了何种异常。
mtvec(Machine Trap Vector),存放发生异常时处理器跳转的地址。
mtval(Machine Trap Value),存 ...
C语言内联汇编
ASM
此处的ASM指的是C语言中的asm关键字
asm关键字可以用于内联汇编代码,即在C文件中声明一部分汇编代码,最后在编译器的作用下,实现一部分C语言无法实现的功能。
概念C语言的编译过程
我们知道C语言
1.会汇编为assembly(汇编语言)
2.汇编语言会在汇编器(as)的作用下变为object文件。
3.最后通过会linker链接为elf/exe文件。
为什么需要asm
前面其实有说过asm是C语言中的一个关键字
这个关键字的功能就是使用assembly去实现一部分功能。
这里有一个问题☝️
C语言会有无法实现的功能需要assembly去实现?
有吗?没有吗?
肯定是有的
其实有很多。
我们C语言所有的能力都是基于汇编的。
如果没有汇编,那么就C语言什么都做不了。
所有的C语言特性都是基于assembly去实现的。
那么问题来了?C语言的语言特性能完成所有事情吗?
并不能,不然系统调用,系统注册,操控寄存器,控制屏幕。
这部分内容assembly能实现吗?
太能了,assembly虽然怪难写的,但是人家是正经的,所有的功 ...
Xv6 Makefile解析
Xv6 Makefile解析
XV6构建过程,概览
写在前面的话
本文主要是对xv6-riscv的Makefile进行分析
“只有读懂了Makefile才能更好理解项目的结构”
Makefile可以理解为是make的配置文件,类似的有docker的Dockerfile
分析
严格按照文件从上到下分析
变量声明
模块声明
声明了两个路径,kernel & user路径
推测这两个路径分别对应的是——“系统内核和用户程序”
12K=kernelU=user
输出文件定义,乍一看全是kernel模块的文件
(可能会疑惑为啥叫OBJS呢,因为.c文件的编译文件就是.o即object)
12345678910111213141516171819202122232425262728OBJS = \ $K/entry.o \ $K/start.o \ $K/console.o \ $K/printf.o \ $K/uart.o \ $K/kalloc.o \ $K/spinlock.o \ $K/string.o \ $K/main.o \ ...
面纱读书心得
起因
这本书我是在24/1/8凌晨读完的。
但是在此之前其实已经在我书架放了好几个月
23/10/8日是这本书加入我书架的时候
起因是由于无意间在QQ看点刷到了一条视频,讲解了这本书。
当时我记得讲的是这本书的狗血剧情——“你纵使深情也抵不过那句——死去的是那条狗“
(这里讲述的是男主卑微的婚姻)(在我看完以后发现和解说解释的完全不一样)
具体链接我已经找不到了
既然看了当时的视频讲解,我为什么要看这本书呢?
因为当时我被故事的背景吸引了,我所见的以中国为背景的小说太少了。
故事的内容也是新奇。所以它很不意外地就出现在我书架上了。
感悟为什么书名叫《面纱》
我想封面已经透露了——
“以爱情为名的面纱,遮住了生活的全部”
当然我从网上也搜集了一部分资料有如下观点
1.来源于雪莱的一首诗
别揭开那些活着的人们用来形容生活的彩色面纱,尽管这上面都是些不真实的假象,它只是用随意涂抹的色彩,模拟着我们能够相信的一切事物,在它后面隐藏着恐惧与希望,交织着不同的命运
讲述人性的扭曲,虚伪
2.来源于剧情需要
剧情中女主角一直和她的 ...
xv6内核构建
xv6内核构建概念
xv6
Xv6是由麻省理工学院(MIT)为操作系统工程的课程(代号6.828),开发的一个教学目的的操作系统。
——百度文库
准备设备:Win11
环境:WSL2
WSL 版本: 2.0.14.0内核版本: 5.15.133.1-1WSLg 版本: 1.0.59MSRDC 版本: 1.2.4677Direct3D 版本: 1.611.1-81528511DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hypWindows 版本: 10.0.22631.2861
Linux:Debian
Linux foolish-pc 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 GNU/Linux
源码:XV6
环境配置
Note: WSL环境配置略
源代码下载
本文主要是对RISC-V架构的xv6)项目进行构建
Risc-V工具链下载
源代码下载
1git clone https:/ ...
动态链接过程分析
动态链接执行过程动态链接的执行分两类
首次会从plt表跳got.plt表,最后通过链接器写入got.plt,调用实际函数
之后访问会直接从plt表跳转到实际函数
概念 & 基础分析
GOT
GOT全称 Global Offset Table 全局偏移表
GOT包含两部分
.got (存放全局变量)
.got.plt (存放函数引用地址)
plt
.plt 主要用于懒惰绑定,执行时负责解析函数地址并填充 .got.plt。
plt.got
.plt.got 是一个结合了 .plt 和 .got 的 section。
它包含了 .plt 中的包装器,并在执行时填充 .got.plt 和 .got。这样,第一次调用时,函数地址被填充到 .got.plt 和 .got,后续调用直接跳转到 .got 中的地址。——ChatGPT
关于plt.got & plt差别可见StackOverflow
The difference between .plt and .plt.got is that .plt uses lazy binding and . ...
ELF文件格式基础介绍
ELF文件全称为(Executable and Linkable Format)
概念ELF文件本质上是一种数据结构,数据的载体。
于ELF相关的几个概念:
Section
组成ELF内容的最基本单元。
具体的可见上图.dynsym,.dynstr,.hash,.bss,.txt,……
每一个都是一个section
Segment
执行过程中的加载映射的最小单元,一个Segment即是多个Section的集合。
Linkable View
ELF 未被加载到内存执行前,以 section 为单位的数据组织形式
Executable View
ELF 被加载到内存后,以 segment 为单位的数据组织形式
看到这可以会有一个问题——“关于为什么有Section,Segment,Linkable View,Executable View“
其实很简单,ELF被切分成两个大的过程 编译,执行
Section & Linkable View是编译过程的数据呈现形式
Segment & Executable View是运行过程中的数据呈现 ...
2023
简介
“这一年比前几年有意思“
这里的“意思“不是指学到了啥,从利己的角度来看,今年并无什么特殊之处。
(一样的枯燥无聊)
更多是一些体验,去过一些地方,做过一些事,见过一些人。
学习
读了一些书
很好算半个读书人了。(我也不知道以后能不能坚持)
那些年我们一起刷过的题
个人链接
“那是一段黑暗的时光,没有任何光亮。“
LC好像没有年度汇总,如果有我之后补一个。
但是比起前年还是懈怠了(只是苦了我花钱买的VIP,老贵了)
写过写过一些blog(不太硬核,主打的就是菜)
工作
同事对我的评价是——
“a good guy who is talented at writing docs”
他真的是程序员?(不是)
TODO
增强技术深度
技术沉淀,突破技术壁垒,打通垂直领域(上班导致的)
多学点基础技术,一个懂操作系统,编译原理,汇编,计算机网络,数据结构,算法…的程序员真的“很帅“
多写点项目(前提是有足够的能力)
有的时候其实是有想法的,但是受限于能力,真的写不出来。(说白了就是菜)
实践是提升能力的最好手段(我说的) ...
glibc
认识Glibc概念
Glibc
glibc是linux下面c标准库的实现,即GNU C Library
和java的jdk,kotlin的stdlib类似。
查看我们所用的glibc版本
123➜ glibc getconf GNU_LIBC_VERSION# 输出glibc 2.31
关于陌生
我们其实对Glibc特别特别陌生,主要是当我们点开一些C语言的基础调用的时候,我们是看不了具体的源代码的。
所以就这样Glibc在我们心里越来越模糊,黑盒化
编译Glibc
认识Glibc的最好的方法就是编译它。打一个包,如果可以还可以装到Linux系统上自己用。
官方文档
下载下载地址
为了可玩性,笔者下载了最新版的Glibc
glibc-2.38.tar.gz
1234567891011# 下载➜ glibc curl -O https://mirror.koddos.net/gnu/libc/glibc-2.38.tar.gz# 解压➜ glibc tar -xvf glibc-2.38.tar.gz# check下是否安装完成➜ glibc lltot ...
WSL Mirrored NetworkMode
WSL镜像网络背景
在做一个安全试验的过程中:
需要将本机作为一个服务器与外部网络进行交互。
WSL默认是NAT的模式,无法实现于外网交互的逻辑。
Vmware作为虚拟机可以配置网络的状态为bridge,作为虚拟机的WSL是否也可以呢?
配置
修改.wslconfig文件
1234networkingMode=mirroreddnsTunneling=truefirewall=trueautoProxy=true
关闭wsl
1wsl --shutdown
重新进入wsl
参考链接知乎
WSL官网