自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++: multiple and virtual inheritance under the hood

前两天跑llvm的时候遇到了有关RTTI的链接报错,借此重新回来看下C++的多继承相关的东西。希望通过本文能够把多继承和虚继承的机制解释明白。以及以下的C++术语本文的内容主要基于,建议大概阅读一遍之后再继续看下面的内容。

2022-11-14 19:55:39 727 1

原创 opt: undefined symbol when load

跟着教程写第一个llvm pass的时候,在opt load动态库的时候遇到了下面的报错报错的原因是动态链接器没有找到这个类的定义。为了理解这个类,我们需要一些背景。

2022-11-12 11:03:23 636

原创 vscode快捷键设置

vscode快捷键设置

2022-09-18 14:32:07 810

原创 linux内核的reciprocal_value结构体

本篇分析linux内核中的struct reciprocal_value和struct reciprocal_value_adv背后的数学原理,参考论文Division by Invariant Integers using Multiplication

2022-09-11 17:54:34 296

原创 从crc32到linux内核实现

本文主要讨论软件方法计算crc32的算法以及linux内核中的实现。

2022-09-10 16:08:17 1288

原创 opensbi firmware源码分析(3)

整个firmware的工作可以总结为初始化各类M态的寄存器和自己相关的数据结构,为后面服务S态软件的各种请求做好准备。可以发现,目前riscv体系结构还是有很多问题的。时钟中断的处理:目前的riscv只定义了M态的时钟中断,每次时钟中断都需要陷入opensbi,由opensbi设置mip寄存器把时钟中断转发给S态。随后S态的软件又需要通过调用再次陷入opensbi,设置下次时钟中断的时间。不过前不久提出了,希望能够增加stimecmp寄存器来减少时钟中断的开销,貌似目前这个还没有加入到spec中。.....

2022-08-12 18:23:14 1437 9

原创 opensbi firmware源码分析(2)

接,这次我们从sbi_init源码开始分析。

2022-08-11 17:35:00 1208

原创 opensbi firmware源码分析(1)

这个系列主要分析generic平台下fw_jump.elf这个文件对应的源码(主要我觉得相比于fw_payload和fw_dynamic,这个最简单),基于版本0.8(因为qemu5.2.0默认使用的这个版本作为bios,并且能够boot最新版的riscv-linux).........

2022-08-05 19:42:20 1750 2

原创 shell通配符与glob

shell的通配符的具体语法可以查看。下面明确使用通配符的几个可能出现的误区。答:由shell进行匹配路径下的所有文件名(*和?不匹配以开头的字符串,也不匹配),展开完成后由命令行参数传递给执行程序。例如当前路径下有这四个文件,那么展开后的命令为。答:可以通过反斜杠脱逃的方法,亦或者通过单引号或者双引号把字符串括起来的方法让shell不要特殊处理通配符。例如表示列出文件(这里和shell变量的区别在于,shell变量在双引号下是会被替换的,但是在单引号下不会被替换)答:在以前的unix中,如果shell没有

2022-07-05 17:27:24 243

原创 编译GCC遇到的“pthread.h” not found问题

在LFS的第五章从源码编译freestanding的GCC时遇到如下报错书上给的参考配置指令为我首先尝试了一下删除上述的一堆disable,使用了如下的配置指令(主要是好奇configure会不会自动推断出来一些库和feature没办法支持,比如threads)然后果不其然,我得到了如下报错于是我尝试了,然后使用书上的配置指令重新configure。不解的是,仍然得到了上面的的报错(预期由于移除了线程支持,应该不再依赖pthread.h头文件)。发现使用把build目录全部删除后再重新configu

2022-06-28 14:09:02 3198

原创 python QR分解求解线性方程组和矩阵本征值和本征向量

下面的代码提供了两个函数注:

2022-06-24 21:17:10 1682

原创 动手调试C库-2 --musl-c的动态链接器

0. 序本篇承接上一篇的动手调试C库-1 ,主要讨论musl-c的动态链接器。3. overviewmusl-c的动态链接器代码主要位于ldso/dlstart.c, ldso/dynlink.c。musl-c的动态链接器重定位主要分为三个阶段,第一阶段是_dlstart_c函数,第二阶段是__dls2和__dls2b函数,第三个阶段是__dls3函数。描述动态库的数据结构是dso, 在dynlink.c中维护了四个重要的全局链表。第一个链表是关于动态库的全局加载序。static dso* he

2022-04-20 14:49:05 2391

原创 动手调试C库-1 程序员的自我修养第11章笔记

0. 序在我的观感上来说吧,这11章写得真是灾难。灾难体现在两个地方,一个讲的实现机制比较古老了,比如.ctor段这些gcc早已经不再使用了。另一个是glibc和windows的MSVC混着讲,看着挺不舒服的(也许是因为我把前面讲windows的地方都跳过了)。为了更实际地看看C库与C编译器是如何配合,完成C代码的初始化与运行的,尝试编译一个带调试信息的C库,手动调试是一个不错的选择。1. 从源码编译C库比较了几种C库的实现,最终选择了riscv-musl,选riscv主要是因为这个体系结构比较新,

2022-04-04 20:25:26 4621

原创 动态链接5 程序员的自我修养第八章笔记

0.序本文承接上一篇动态链接4,这应该是关于动态链接笔记的最后一篇了。略去了书上关于符号版本的讨论。10. linux下的动态库管理通常linux下动态库遵循命名规则libname.so.x.y.z,该动态库对应的SONAME是libname.so.x,链接时使用-lname, 比如我机器上的/usr/lib/libpcap.so.1.10.1,它的SONAME则是libpcap.so.1。链接时使用参数-lpcap。因此根据上述规则,主版本号不同的动态库对应的 SONAME也不同。这主要是因为主版本

2022-03-29 20:39:13 6163

原创 动态链接4 程序员的自我修养第八章笔记

0. 序本文承接上一篇动态链接36. .dynamic section.dynamic节是为动态链接器提供必要的链接信息(例如在RELRO中提到的DT_FLAGS指示动态链接器进行立即重定位),具体.dynmaic节的格式可以参考dynamic section。下面列出一些接下来讨论动态库搜索时会用到的一些.dynamic节的表项。DT_SONAME项,仅在动态库中出现,内容是一个数字表示在.dynstr中的偏移,表示该动态库的SONAME(接下来会解释这个的作用)DT_NEEDED项,内容是一

2022-03-29 13:19:07 5695

原创 动态链接3 程序员的自我修养第七章笔记

0. 序本篇文章承接上一篇动态链接25. Relocation Read-Only (RELRO)细心的读者如果自己尝试编译一下,会发现一个奇怪的现象,可执行文件中并没有.got.plt节,只有一个.got节。而且可执行文件中的重定位条目不会延迟绑定。一个stackoverflow的帖子讨论了这个原因。基本的出发点在于,.got.plt表存放函数的跳转地址,而且是可写的,这件事十分的危险,因此引入了Relocation Read-Only机制来保证.got.plt, .got表的只读性质。具体来说

2022-03-12 18:41:44 423

原创 动态链接2 程序员的自我修养第七章笔记

0. 序本篇文章承接上一篇动态链接13. 全局符号介入单靠上面的解释, 读者可能会有疑惑,既然数据a, p和printf语句在模块内部的相对地址是不变的,为什么不直接用相对pc的寻址方式拿到a, p地址呢,而非要借助.got表来绕一下弯子呢?这其实涉及到一个全局符号介入(global symbol interpose)的问题。在静态链接中,我们不允许符号冲突。但是在动态链接中,默认是允许的(也可以修改链接参数改变链接器这一行为)。以之前的weakref.c文件为基础,再引入下面的havea.c文件

2022-03-12 18:17:13 4419

原创 动态链接1 程序员的自我修养第七章笔记

0. 序预计这篇文章会很长,折腾了挺长时间才差不多捋清楚,主要书上一些地方和现在的实现有一点出入。1. 概览与动态链接有关系的节大概有这样一些,.interp, .dynamic, .gnu.hash, .rela.dyn, .rela.plt, .plt, .plt.got, .got, .got.plt。其中.rela.dyn和.rela.plt也可能替换为.rel.dyn, .rel.plt,取决于具体重定位类型的选择。其中.interp, .dynamic提供动态链接的一些初始信息。 .gn

2022-03-12 16:18:31 546

原创 弱符号与弱引用 -> 程序员的自我修养 第3,4章笔记

1. 在程序中声明并使用节名先看下面一段有意思的程序#include <stdio.h>__attribute__((section("abcd"))) int sss = 3;static int y = 1;extern int abcd;int add(int a, int b){ return a + b;}int main(){ printf("%d\n", add(sss, y)); printf("abcd %p, sss %p\n", &abc

2022-03-08 17:24:30 304

原创 vscode调试container中的程序

在写cmu14-445的project时,我希望在本地vscode编辑代码,然后在docker中编译和测试代码。但是如果测试出了问题,直接在本地调试就变得麻烦了。所以希望利用vscode进行远程调试。参考官方文档,利用ssh + pipeTransport来完成,下面是我的launch.json和tasks.json最后的样子。{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptio

2022-03-04 00:38:10 1167

原创 cmu14-445 环境搭建

0. 序记录自己在克隆bustub时的踩坑经历。1. gtest无法正常运行虽然bustub的仓库中建立一个私人仓库,然后给出了详细的命令行步骤,但我这个懒人不太想专门去建个仓库,于是就顺手直接把仓库克隆了下来。git clone https://github.com/cmu-db/bustub然后build里面的dockerfile搭建镜像,然后尝试在docker里面运行。结果运行构建好的测试,什么输出都没有。。。大概类似于下面这样$./test/lru_replacer_test #没有任

2022-03-03 13:04:52 8344

原创 6.824 2020春 论文阅读 FaRM

0. PreludeThis article is relevant to lecture 14. Although this paper take a lot of space to talk about fault recovery, .1. OverviewFaRMis distributed in-memory database , which consists of many machines in one datacenter(including clients) and leverag

2022-02-24 23:29:31 210

原创 6.824 2020春 论文阅读 spanner

0. prelude写了两篇之后我发现自己的懒癌又犯了,尝试接下来的博客用英语来记录的课程内容,算是对一种对继续写的激励吧…orz1. Overview designSpanner is a semi-relational and globally distributed database with strong consistency and support of distributed transaction.Figure 1 is a deployment instance of Spann

2022-02-24 12:08:06 117

原创 6.824 2020春 材料阅读 6.033 chapter9

0. 序本节内容对应lecture12, 感觉核心是讨论distributed transaction.1. two phase lock一种加锁的基本方法,针对9.5.2中的simple locking的优化,保证concurrent transaction is serializable,遵循两个原则:在读或写任何object前都先加锁直到完成所有object的读写后才能释放锁(一个小优化:在获取所有锁之后,且在完成所有object读写前,如果某个object是只读的,并且以后再也不需要读

2022-02-20 23:36:31 247

原创 6.824 2020春 论文阅读 Frangipani

0. 序尝试回想了一下这门课之前读的论文,发现除了核心的一个想法,其它论文中讨论的细节都忘得差不多了。现在读到Frangipani,觉得写一下笔记还是十分有必要的吧。1. 总体结构Frangipani是基于一个叫做Petal的分布式virtual disk,Petal本身具体fault tolerance, replication之类的性质,对上提供了一个单个磁盘的抽象。另外独立的一块就是具体fault tolerance属性的lock server,向Frangipani提供分布式读写锁的服务。

2022-02-19 01:07:35 106

原创 6.824 lab3

延迟过高,原因是leader提交太慢bug:raft总是有可能提交重复的日志(比如client提交日志给A,A复制到B,然后因为某些原因,B变成了新的leader,A返回提交失败给client,client此时再提交该日志给B,原来的日志还没有提交,新的重复日志来了,没有办法判重)outstandingReq的处理,判断是否是leader与加入outstandingReq应该是原子操作,此时要求同时持有server锁和raft锁...

2022-02-16 21:28:06 1135

原创 vscode,配置launch.json运行go的单元测试

在写6.824的lab3A,debug的时候,发现单个测试很难报错(点击vscode编辑器中的debug test),而在跑脚本统一测试所有情况时错误又暴露出来了。我希望能够在vscode中一口气跑许多测试,这样能够在错误暴露时暂停程序从而找到问题所在。具体来说,我参考了这俩文档microsoft-vscodevscode-go然后得到了下面的launch.json文件{ "configurations": [ { "name": "Launch t

2022-02-14 18:49:31 2388 2

原创 6.824 raft算法与lab2

0. 序继续回来填6.824的坑。1. 关于raft算法不认可处理removed server来捣乱的方法(好像确实可以,论文中的做法是server会丢掉requestVote,并且不更新term,如果server在minimun election timeout的时间内收到了leader的消息。我之前想到partition网络恢复时也许这个会造成问题,但是如果上面的限制只是针对follower来做的话就没问题了。),不能理解如何实现linearizable semantics(对于read on

2022-01-09 19:25:08 683

原创 go time.Ticker与time.Timer使用

一篇速记1. time.Ticker的正确使用方法copy from go examplefunc main() { // Calling NewTicker method Ticker := time.NewTicker(2 * time.Second) // Creating channel using make // keyword mychannel := make(chan bool) // Go function g

2021-12-27 21:46:29 454

原创 C++11的initializer_list

0. 序今天写一道OJ的时候,发现死活超时,后来对比答案发现是因为我用了初始化列表导致超时了。因此写一篇博客记录一下。1. 花括号统一初始化一个容易混淆的概念,花括号初始化与initializer_list类。在effective modern C++中item 7详细阐述了这一点。之前一个郁闷的报错是Widget w(); Widget w{};希望初始化一个没有参数的构造函数时,第一种初始化方法会报错,因为gcc会认为这是在声明一个函数。通常在花括号初始化对象时,并不代表一定会产生相应

2021-12-25 19:09:16 720

原创 OJ 山区建小学

解题链接这个题有一步思维角度的转换,直观上看是一个m个点选n个点的问题,如果这样去想,可能会得到一个三维的递推方程:在第i个村庄到第j个村庄间建k个小学,求最短距离(复杂性在于确定了n个小学的位置后,还需要判断具体每个村庄到底去哪上小学)。但是换一个角度思考,其实是m个村庄划分为n堆的问题,在同一堆的村庄上同一个小学,这个小学自然会建在一堆村庄的中间,一个简单的递推方程就出来了。...

2021-12-20 21:42:49 178

原创 6.S081 net lab

0. 序算是填了一个坑吧。1 qemu参数的解释ifeq ($(LAB),net)QEMUOPTS += -netdev user,id=net0,hostfwd=udp::$(FWDPORT)-:2000 -object filter-dump,id=net0,netdev=net0,file=packets.pcapQEMUOPTS += -device e1000,netdev=net0,bus=pcie.0endif查看qemu的手册,在设备模拟上,有一个Device Front E

2021-12-18 12:34:43 902

原创 关于go的interface机制

一篇速记1. 基本实现照例先贴两个链接吧(好的,我就是粘贴怪了)Go Data Structures: Interfacesgolang的interface剖析可以先看第一篇,再看第二篇。总结一下两篇文章的大意吧interface结构占16个字节(64位机器),前8位是一个tab指针,指向全局的itable(hash表)的一个tab表项(具体的结构体定义可以参考第二篇链接)。后8位是一般是一个数据指针,指向实际存放的数据。映射关系:(interface接口,实际的数据类型) -> t

2021-11-30 11:54:14 174

原创 go的slice 与 导入本地package方法

一篇速记1. go中的slice特性首先知道slice是[指向数组的指针,len, cap]这个三元组构成的,然后看下面的两个例子。package mainimport "fmt"func main() { s := []int{2, 3, 5, 7, 11, 13} printSlice(s) // 截取切片使其长度为 0 y := s[:1] printSlice(y) y[0] = 100 printSlice(s) y = append(y, 101) printS

2021-11-29 23:04:56 262

原创 计算机网络相关拓展材料

下面是一些课程要求读的,但是我目前还没时间读的一些材料,打算先放到这里,有时间了再回来读吧,以免后来找不到了。tcp,ip协议族安全性讨论1tcp,ip协议族安全性讨论2下面两篇主要是介绍多媒体网络homepagesigcomm2013 tutorial下面两篇与cellular network相关5G tutorialLTE tutorial一个失效链接。...

2021-10-30 22:09:48 794

原创 从一个riscv的模拟器说起

0. 序

2021-10-15 21:08:01 1047

原创 6.824 lab1 go的serialization

0. 序lab1前前后后做了两三天,终于写完了。其实lab本身思路还是蛮清晰的,主要是对go不怎么熟悉,在调试上绕了很久。1. go语言中数据的序列化方法写的时候面临的第一个问题是map_worker产生的keyValue切片以什么样的形式保存到临时文件中。脑海里首先想到的是像C一样直接把产生的二进制数据保存到文件里面就可以了。但是没有办法从手上的切片句柄中直接拿到指向底层数组的指针,究其根本,go是否允许像C一样对数据进行任意地转换类型然后处理?搜索了一下,查到了unsafe包中的uintptr

2021-09-17 17:45:41 539 1

原创 一点关于golang闭包机制的思考

0. 序在MIT的6.824的第二节课中,一段展示并发golang爬虫代码很有意思,查阅了一些关于闭包的资料,结合自己的调试结果,记录一下。1. 缘由type fetchState struct { mu sync.Mutex fetched map[string]bool}func ConcurrentMutex(url string, fetcher Fetcher, f *fetchState) { f.mu.Lock() already := f.fetched[ur

2021-09-11 22:07:08 116

原创 VM虚拟机下安装vulkan的踩坑

mesa-vulkan-driversvulkan-utilslibglm-devlibxcb-keysyms1-devlibxcb-dri3-devg++-multiliblibmirclient-devlibwayland-devlibxcb-randr0-devlibxcb-ewmh-devlibx11-xcb-devliblz4-devlibzstd-dev

2021-09-02 00:42:34 4820 1

原创 GAMES101 lecture6 笔记

0. 序第6课涉及到一些信号与系统相关的知识,参考了很多网上的博客,记录一下1. 傅里叶变换,卷积,滤波首先参考了这篇知乎的文章。https://zhuanlan.zhihu.com/p/28478034以下的东西需要了解(文章后面滤波和卷积的部分放在2中):什么是时域,什么是频域,傅里叶变换则作为两者之间转换的桥梁(好吧,我以前对傅里叶变换的理解就只知道一个变换公式)。卷积定理:时域函数的卷积结果对应于频域函数的乘法,反之亦然。时域中函数值变化剧烈的部分对应频域中的高频信号2. 图像

2021-08-13 17:04:27 161

shor算法详细分析.pdf

这个pdf是我用latex写的暑期课程的结课论文,主要是介绍了基本的量子逻辑门,并在此基础上详细分析了两种量子算法(shor算法(你要是能找到比我写的shor算法更细致的中文分析就算我输了),Deutsch-Jozsa算法)的算法流程和原理。对量子算法感兴趣并且学过线性代数并且有一点数论基础和对量子逻辑门有基本了解的朋友可以下载,如果对pdf中任何地方有疑问的话也欢迎留言交流

2020-07-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除