- 博客(34)
- 收藏
- 关注
原创 CS143 assignment PA2
我在做这次的assignment之前,首先看了《flex&bison》的第一章和第二章,对flex有了初步的理解之后,理解题意,参考答案,以及做题,都有很大的提升。
2023-03-29 21:59:11
415
原创 HW7:xv6 locking
要求我们用一句话说明,上述的代码出现的问题。答:由于在第一次之后,并未就进行了操作,导致第二次的会永远获取不到锁,即死锁。在xv6的代码中,函数会通过指令,屏蔽中断;函数通过指令,将中断打开。但是,如果在的函数中,我们在函数的后面加上指令,而在函数的前面加上指令,并重新编译内核,那么xv6就有可能boot失败,请找出原因。答:从下图中可以看出,xv6在的地方被。在中,依次查找中的值,就可以查出调用栈了,调用栈为: -> -> -> ->-> -> -> -> ->从调用栈中可以
2022-12-05 21:11:07
372
原创 HW5: xv6 CPU alarm
这个HW的主要任务就是在进程使用CPU的时候,定期向其发送alert。添加这个功能的意义在于,一是可以限制进程占用CPU的时间,二是可以当进程想要执行定时任务的时候,可以利用这个alert。添加一个新的alarm(interval,handler)系统调用。如果应用程序调用alarm(n,fn),那么在程序消耗每个n“ticks”的CPU时间之后,内核将调用应用程序函数fn。当fn返回时,应用程序将从中断处继续。tick是xv6中相当随意的时间单位,由硬件定时器产生中断的频率决定。
2022-11-20 19:08:09
427
原创 x86的DPL,RPL,CPL
此时JMP和CALL指令对此的处理是不同的:对于nonconforming code segment,调用CALL指令时,如果CPL >= DPL, 就会发生控制转移;而调用JMP指令时,必须CPL == DPL才会发生控制转移。对于conforming code segment,调用CALL指令和JMP指令时,如果CPL >= DPL就会发生控制转移。
2022-09-30 21:53:05
2339
1
原创 Mit6.828 HW2 Shell
文章前面的简介中,已经向我们提供了大部分的代码,但是一些功能需要我们进行补充。因此我这边先简要梳理下的主要逻辑。通过gecmd获取命令,获取用户从界面输入的命令,最大为100个字节。parsecmd函数解析命令系统调用fork创建新的进程,来执行命令。
2022-09-23 07:56:27
415
原创 Lab 2: Memory Management
本次实验所有的工作都是为了完善mem_init函数,实现虚拟地址物理地址的映射。为了实现这个映射,需要搭配一些功能。首先是内存分配,boot_alloc,page_init,page_alloc,page_free,每次分配4096字节的数据,空闲链表进行分配。其次,进行虚拟地址到物理地址的映射,pgdir_walk,,等函数,最后虚拟地址批量映射到物理地址。
2022-09-12 23:58:21
276
原创 MESI缓存协议简述
参考《深入理解计算机系统》。早期计算机系统的存储器层次结构只有三层:CPU寄存器,主DRAM存储器和磁盘存储设备。不过,随着CPU和主存之间逐渐增大的差距,系统设计者被迫在CPU寄存器和主存之间插入缓存。
2022-09-10 00:19:00
475
原创 读写锁排查思路
表示没有线程持有读锁,也没有线程持有写锁,但是读写锁的值却异常了。只有两种可能,一是未初始化,二是内存被改写。走查代码,发现两个构造函数中,只有一个构造函数初始化了读写锁。从读写锁的逻辑看出,如果在读锁加锁的时候,不为0,那么就会阻塞读锁。
2022-09-02 09:18:50
260
原创 C++中实参形参的传递问题
自从写了上一篇文章之后,了解了C++返回对象时所做的动作之后,对于形参的操作,我这边也做一些简要的介绍,主要是参考了下面这个连接中的内容你自从写了上一篇文章之后,了解了C++返回对象时所做的动作之后,对于形参的操作,我这边也做一些简要的介绍,主要是参考了下面这个连接中的内容。
2022-08-24 11:38:21
874
原创 ld脚本简述
当链接器将可重定位文件通过重定位等操作生成可执行程序的时候,链接脚本可以控制输入文件中的各个段在生成文件中的位置,并且可以规定生成的可执行文件加载入内存之后的空间布局。链接器ld默认使用其内部的连接脚本,因此在一般情况下,我们都不需要对其进行修改。在使用ld的时候,通过-T选项,可以使用自己写的链接脚本完成链接过程,否则会使用默认的链接脚本。
2022-08-22 00:08:08
1406
原创 C++返回值拷贝以及std::move
我将以下面的类为例子,说明C++在RVO的情况下以及关闭RVO情况下,其函数返回值是如何返回给调用者的,并给出其汇编代码的说明。环境是Ubuntu Linux,编译器为GCC7.5.0。public:Obj() { // 构造函数}}Obj(const Obj &obj) { // 拷贝构造函数}Obj(const Obj &&obj) { // 移动构造函数}Obj &operator=(const Obj &obj) { // 赋值构造函数}...
2022-08-15 22:43:37
1777
1
原创 snprintf和strcpy和strncpy的区别
snprintf,strcpy,strncpy这几个函数的功能都是将原字符串拷贝到目的字符串中。但是在细节部分还是存在着一些细微的差别。主要参考man说明。snprintf。
2022-08-12 22:34:30
822
原创 静态链接和动态链接简述
由于对静态链接和动态链接的概念已经动作有所不了解,因此特意写了这篇文章进行初步的梳理。主要参考《深入理解计算机系统》这本书。静态链接以一组可重定位的目标文件为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节组成。为了创建可执行文件,链接器必须完成两个主要任务:符号解析和重定位。链接器解析符号表.symtab,将每个符号引用和符号定义联系起来。静态库是一系列可重定位目标文件的集合,在Linux系统下,通过工具将其打包为一个文件。静态库出现的原因
2022-08-07 23:24:15
839
原创 TCP各个连接状态的含义以及listen的backlog的含义
线上大量CLOSE_WAIT的原因深入分析浅谈CLOSE_WAIT1 工具查看TCP各个状态的连接数量netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'LISTEN 5TIME_WAIT 3ESTABLISHED 5perf火焰图如果对业务代码不熟悉,可以直接使用perf把所有的调用关系使用火焰图给绘制出来。2 TCP各个阶段的状态CLOSED 表示socket连接没被使用。LIST
2022-03-29 22:07:44
712
原创 C++强制类型转换
C++提供了四种类型转换方法,分别为static_cast<类型说明符>(表达式)dynamic_cast<类型说明符>(表达式)const_cast<类型说明符>(表达式)reinterpret_cast<类型说明符>(表达式)按照适用范围从窄到宽的顺序介绍,先从使用频率比较低的reinterpret_cast开始,然后依次是const_cast,dynamic_cast,最后介绍static_cast。reinterpret_castin
2022-03-14 22:44:03
4634
1
原创 KMP算法【笔记】
1、构造函数声明为explicit,防止隐式转换。(与它相对应的另外一个关键字是implicit,类构造函数默认的情况下即声明为implicit)。// 在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。// 如果构造函数声明为explicit时,这种转换就会报错。// 对多个参数不起作用,对多个参数中有默认值的起作用。class CxString // 使用关键字explicit的类声明, 显示转换 { public
2022-03-02 21:40:38
129
原创 《Vim实用技巧》笔记
一、vim命令每个模式下记下常用的命令即可。 命令 等效命令 命令效果 正常模式 >G 之后的每行右移 C c$ 删除光标到结尾的数据,并插入 s cl 删除当前字符,并插入。相当于xi S
2022-02-28 22:58:31
1382
原创 【x86汇编语言:从实模式到保护模式笔记】第十五章 任务切换
概述操作系统负责什么时候切换到另一个任务,以及切换到哪一个任务执行;处理器只负责具体的切换过程,包括保护前一个任务的现场。操作系统只执行了一个call/jmp/iret的指令,但是处理就完成了任务的切换。协同式任务切换方式从一个任务切换到另一个任务,需要当前任务主动地请求暂时放弃执行权,或者在通过调用门请求操作系统服务时,由操作系统“乘机”将控制转移到另一个任务。抢占式任务切换方式在这种方式下,可以安装一个定时器中断,并在中断服务程序中实施任务切换。硬件中断信号总会定时出现,不管处理器当时在做
2022-02-28 22:29:03
208
原创 【x86汇编语言:从实模式到保护模式笔记】第十四章 任务和特权级保护
本章目标1、通过演示如何创建一个任务,并使之投入运行来学习任务的概念及组成要素,包括任务的全局空间和局部空间、TSS、LDT、特权级等。2、必须了解特权级不是指任务的特权级,而是组成任务的各个部分的特权级。比如:任务的全局部分一般是0、1和2特权级别的,任务的私有部分一般是3特权级别的。3、必须清楚CPL、DPL和RPL的含义,以及不同特权级别之间的控制转移规则。4、熟悉调用门的用法。5、掌握一些在Bochs下调试程序的新手段。6、学习一些新的x86处理器命令,包括lldt、ltr、pushf/
2022-02-28 22:28:48
915
原创 【x86汇编语言:从实模式到保护模式笔记】第十三章 程序的动态加载和执行
本章目标1、了解保护模式是为操作系统提供的技术,并没有给普通应用程序的编程带来负担。2、学习操作系统在保护模式下加载和重定位应用程序的一般原理,学习简单的内存动态分配,了解应用程序接口API的简单原理,学习字符串的比较算法。3、学习若干x86处理器的新指令,包括bswap,cpuid,cmovcc,sgdt,movzx,movsx,cmpsb,cmpsw,cmpsd和xlat等。13.1 代码清单13.2 内核的结构,功能和加载13.2.1 内核的结构内核代码分为4个部分,分别是初始化代码,内
2022-02-27 11:00:40
291
原创 【x86汇编语言:从实模式到保护模式笔记】第十二章 存储器的保护
本章目标1、通过实例来认识处理器是如何进行存储器的保护的。2、了解别名段的意义和作用。3、以一个字符串排序过程为例子,演示保护模式下的内存数据访问,体验一下它们与在实模式下访问数据段的不同。同时,在这个过程中学习汇编语言实现冒泡排序算法,以及一条新的x86指令xchg。本章的内容就是说明,保护模式如何保护数据的,数据读取、代码执行时是否超出了界限(代码段的保护,栈段的保护,数据段的保护)。...
2022-02-27 10:57:08
197
原创 【x86汇编语言:从实模式到保护模式笔记】第十一章 进入保护模式
本章目标:1、了解x86处理器的保护模式需要先定义全局描述符表GDT,认识段描述符的各个组成部分以及它们的含义和作用。2、认识32位处理器的全局描述符表寄存器GDTR、段寄存器(由段选择器和描述符高速缓存器组成)、控制器CR0和段选择子。3、了解进入32位保护模式的方法和步骤。4、学习保护模式下的一些程序调试技术,如查看全局描述符表GDT、段寄存器和控制寄存器等。5、学习lgdt指令11.1 代码清单11.2 全局描述符段描述符:保存段的相关信息,包括段基地址以及段界限,8个字节。全局描
2022-02-27 10:55:34
964
原创 【x86汇编语言:从实模式到保护模式笔记】第十章 32位x86处理器编程架构
Intel32位处理器架构,简称IA-32(Intel Architect,32-bi时Intel32位处理器架构,简称IA-32(Intel Architect,32-bi)。所谓处理器架构,或者处理器编程架构,是指一整套的硬件架构,以及与之相适应的工作状态。其中的灵魂部分就是一种设计理念,决定了处理器的应用环境和工作模式,也决定了软件开发人员如何在这种模式下解决实际问题。32位处理器除了扩展数据线和地址线,还增加了高速缓存,流水线,浮点数处理,多处理器(核)管理,多媒体扩展,乱序执行,分支预测,虚
2022-02-27 10:49:05
249
原创 【x86汇编语言:从实模式到保护模式笔记】8-1和8-2代码的一些稍微的解释
1、8-1代码中,需要确定代码在硬盘的哪个位置,以及在内存的哪个地方加载在内存的哪个地方加载:phy_base dd 0x10000确定代码在硬盘的哪个位置:其实逻辑扇区在寄存器SI中,而SI是由程序直接写的,写成100。然后将逻辑扇区中的代码存放到0x0000开始的内存地址...
2022-02-27 10:46:29
168
原创 【x86汇编语言:从实模式到保护模式笔记】第八章 硬盘和显卡的访问与控制
本章目标:模拟操作系统加载应用程序的过程,演示段的重定位方法,彻底理解8086处理器的分段内存管理机制学习x86处理器过程调用的程序执行机制了解x86处理器访问外围硬件设备的方法总结JMP和CALL指令的全部格式认识更多的x86处理器指令,如in,out,shl,shr,rol,ror,jmp,call,ret等8.1本章代码清单8-1,主引导扇区程序加载器8-2,被加载的应用程序8.2 用户程序的结构8.2.1 分段、段的汇编地址和段内汇编地址1.SECTION、SEGMENT段
2022-02-27 10:45:09
1066
原创 【x86汇编语言:从实模式到保护模式笔记】第七章 比高斯更快的计算
本章目标:学习栈,了解处理器为了访问栈提供了怎样的支持总结INTEL8086处理器的寻址方式学习新的指令,or、and、push和pop学习bochs调试程序时查看栈的方法7.2 代码清单asm-7-1.pdf7.3 显示字符串解读10-28行代码,即显示message字符串的功能7.4 1到100的累计和解读31到37行的代码,即通过CX和jns指令来循环执行,获取累计和7.5 累加和各个数位的分解和显示7.5.1 栈和栈段的初始化栈也是一个内存段,叫栈段(Stack Se
2022-02-27 10:40:02
183
原创 【x86汇编语言:从实模式到保护模式笔记】第六章 相同的功能,不同的代码
采用不同的方法来实现和上一章相同的采用不同的方法来实现和实现和上一章相章相同的同功能用一种不同的分段方法,从不同角度理解处理器的分段内存访问机制学习循环和条件转移新指令,movsb、movsw、inc、dec、cld、std、div、neg、cbw、cwd、sub、idiv、jcxz、cmp等INTEL8086标志寄存器FLAGS的各个标志位计算机中的负数Bochs调试的更多技巧学习6.2 跳过非指令的数据区处理指令与非处理指令的数据之间夹杂,利用“jmp”来跳过数据区6.3 在数据声
2022-02-27 10:36:46
302
原创 【x86汇编语言:从实模式到保护模式笔记】第五章 编写主引导扇区代码
5.1 欢迎来到主引导扇区主引导扇区位置(MBR):0面0道1扇区主引导扇区有512字节,一个有效的主引导扇区的最后两字节为0x55和0xAAROM-BIOS程序将它加载到逻辑地址0x0000:0x7c00处,也就是物理地址0x7c00,然后判断它是否有效5.3 注释注释必须以英文“;”开始5.4 在屏幕上显示文字5.4.1 显卡和显存显卡为显示器提供内容,并控制显示器的显示模式和状态显存存储着每个像素的特性,现在流行24个bit对应一个像素屏幕上的每个字符对应着显存中的两个连
2022-02-27 10:31:41
400
原创 【x86汇编语言:从实模式到保护模式笔记】第一章 十六进制计数法
第一章 十六进制计数法第二章 处理器内存和指令2.1 寄存器和算术逻辑部件总线:一些用于输入和输出数据的引脚和线路寄存器:对于输入的电信号需要将其锁住,因此引入了寄存器的概念算术逻辑部件:ALU模块2.2 内存储器内存储器,即内存,存放数据的作用。内存中的每个字节对应着一个地址。2.4 指令和指令集指令事实上也是一堆的数字,但是这堆数字是由芯片规定好的低端字节序:高字节位于高地址,低字节位于低地址立即数:这个数已经在指令中给出,不需要再次访问内存。相反,如果指令中给出的是地址,真
2022-02-27 10:23:53
220
转载 linux下阅读源代码的工具
最近刚刚安装了Ubuntu,打开源码之后,突然发现阅读代码有些不习惯,故上网搜一下linux的源码阅读工具,做一个记录。一下内容来自https://www.cnblogs.com/lidabo/p/4957908.html。下面的文章并没有看完,我这边还是打算用ctag + vim来看代码==============================================inux源代码分析和阅读工具比较Windows下的源码阅读工具Souce Insight 凭 借着其易用性和多种编程语言的
2020-11-05 23:29:30
2982
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人