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官网
bhook
BHooK基础使用概念BHookBHook是一个PLT hook框架
PLT hookPLT hook即Procedure Linkage Table Hook,即利用ELF文件链接过程的特性,修改PLT链接的函数地址。
实现对指定函数进行hook的效果
Quick Start具体可见官网教程
具体步骤
导入依赖
Java/Kotlin依赖导入
Cpp依赖导入
初始化
Hook
Hook API
在讲解API以前,需要说明一点,BHook是一个PLT Hook框架。
PLT是一种Native Hook技术,也就是说Hook的是C/C++代码
Caller调用方
函数调用中主动调用函数的一方
Callee被调用方
函数调用中被调用的一方
如下:
其中functionA是Caller
functionB是Callee
12345678void functionA() { // invoke functionB();}void functionB() { // do some}
by ...
JNI基础
基础概念JNI是什么
JNI是Java的一种功能接口,全称叫Java Native Interface
为什么需要 JNI
Java 运行是借助 JVM 的,但是 JVM 其实只是一个 C/C++的”应用“(JVM 也需要在计算机上跑)
有时候我们可能需要比较底层的调用,比如涉及到 OS 的相关操作,JVM 其实是无法实现的,所以需要 JNI对接 C/C++
Demo编程语言中都流行 Hello World,JNI 的 Hello World 是?
笔者是一个 Android/Kotlin 开发者,所以具体 Demo 使用 Kotlin
Kotlin
12345678910111213141516171819202122232425class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { ...