<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[FirMoonLight的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/FirMoonLight</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; FirMoonLight]]></copyright><item><title><![CDATA[CS143 assignment PA2]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/129846536</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/129846536</guid><author>FirMoonLight</author><pubDate>Wed, 29 Mar 2023 21:59:11 +0800</pubDate><description><![CDATA[我在做这次的assignment之前，首先看了《flex&bison》的第一章和第二章，对flex有了初步的理解之后，理解题意，参考答案，以及做题，都有很大的提升。]]></description><category></category></item><item><title><![CDATA[Clion使用技巧 -- 持续更新]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/128193653</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/128193653</guid><author>FirMoonLight</author><pubDate>Mon, 05 Dec 2022 21:32:12 +0800</pubDate><description><![CDATA[clion使用cmake进行构建，如果cmake失败的话，一些语法分析就会不完全，导致使用上很不方便]]></description><category></category></item><item><title><![CDATA[HW7:xv6 locking]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/128193383</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/128193383</guid><author>FirMoonLight</author><pubDate>Mon, 05 Dec 2022 21:11:07 +0800</pubDate><description><![CDATA[要求我们用一句话说明，上述的代码出现的问题。
答：由于在第一次之后，并未就进行了操作，导致第二次的会永远获取不到锁，即死锁。在xv6的代码中，函数会通过指令，屏蔽中断；函数通过指令，将中断打开。但是，如果在的函数中，我们在函数的后面加上指令，而在函数的前面加上指令，并重新编译内核，那么xv6就有可能boot失败，请找出原因。
答：

从下图中可以看出，xv6在的地方被。



在中，依次查找中的值，就可以查出调用栈了，调用栈为：
 ->  -> ->  ->-> ->  ->  ->  ->
从调用栈中可以]]></description><category></category></item><item><title><![CDATA[HW6：Threads and Locking]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/128089640</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/128089640</guid><author>FirMoonLight</author><pubDate>Mon, 28 Nov 2022 23:43:43 +0800</pubDate><description><![CDATA[ph.c。]]></description><category></category></item><item><title><![CDATA[HW5: xv6 CPU alarm]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/127952525</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/127952525</guid><author>FirMoonLight</author><pubDate>Sun, 20 Nov 2022 19:08:09 +0800</pubDate><description><![CDATA[这个HW的主要任务就是在进程使用CPU的时候，定期向其发送alert。添加这个功能的意义在于，一是可以限制进程占用CPU的时间，二是可以当进程想要执行定时任务的时候，可以利用这个alert。添加一个新的alarm(interval，handler）系统调用。如果应用程序调用alarm（n，fn），那么在程序消耗每个n“ticks”的CPU时间之后，内核将调用应用程序函数fn。当fn返回时，应用程序将从中断处继续。tick是xv6中相当随意的时间单位，由硬件定时器产生中断的频率决定。]]></description><category></category></item><item><title><![CDATA[x86的DPL,RPL,CPL]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/127129493</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/127129493</guid><author>FirMoonLight</author><pubDate>Fri, 30 Sep 2022 21:53:05 +0800</pubDate><description><![CDATA[此时JMP和CALL指令对此的处理是不同的：对于nonconforming code segment，调用CALL指令时，如果CPL >= DPL， 就会发生控制转移；而调用JMP指令时，必须CPL == DPL才会发生控制转移。对于conforming code segment，调用CALL指令和JMP指令时，如果CPL >= DPL就会发生控制转移。]]></description><category></category></item><item><title><![CDATA[Mit6.828 HW2 Shell]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/127003319</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/127003319</guid><author>FirMoonLight</author><pubDate>Fri, 23 Sep 2022 07:56:27 +0800</pubDate><description><![CDATA[文章前面的简介中，已经向我们提供了大部分的代码，但是一些功能需要我们进行补充。因此我这边先简要梳理下的主要逻辑。通过gecmd获取命令，获取用户从界面输入的命令，最大为100个字节。parsecmd函数解析命令系统调用fork创建新的进程，来执行命令。]]></description><category></category></item><item><title><![CDATA[Lab 2: Memory Management]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126825000</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126825000</guid><author>FirMoonLight</author><pubDate>Mon, 12 Sep 2022 23:58:21 +0800</pubDate><description><![CDATA[本次实验所有的工作都是为了完善mem_init函数，实现虚拟地址物理地址的映射。为了实现这个映射，需要搭配一些功能。首先是内存分配，boot_alloc，page_init，page_alloc，page_free，每次分配4096字节的数据，空闲链表进行分配。其次，进行虚拟地址到物理地址的映射，pgdir_walk，，等函数，最后虚拟地址批量映射到物理地址。]]></description><category></category></item><item><title><![CDATA[Lab 1: Booting a PC]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126824610</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126824610</guid><author>FirMoonLight</author><pubDate>Mon, 12 Sep 2022 23:22:12 +0800</pubDate><description><![CDATA[介绍了如何安装qemu以及如同通过qemu来模拟操作系统的启动。]]></description><category></category></item><item><title><![CDATA[MESI缓存协议简述]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126791514</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126791514</guid><author>FirMoonLight</author><pubDate>Sat, 10 Sep 2022 00:19:00 +0800</pubDate><description><![CDATA[参考《深入理解计算机系统》。早期计算机系统的存储器层次结构只有三层：CPU寄存器，主DRAM存储器和磁盘存储设备。不过，随着CPU和主存之间逐渐增大的差距，系统设计者被迫在CPU寄存器和主存之间插入缓存。]]></description><category></category></item><item><title><![CDATA[读写锁排查思路]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126655482</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126655482</guid><author>FirMoonLight</author><pubDate>Fri, 02 Sep 2022 09:18:50 +0800</pubDate><description><![CDATA[表示没有线程持有读锁，也没有线程持有写锁，但是读写锁的值却异常了。只有两种可能，一是未初始化，二是内存被改写。走查代码，发现两个构造函数中，只有一个构造函数初始化了读写锁。从读写锁的逻辑看出，如果在读锁加锁的时候，不为0，那么就会阻塞读锁。]]></description><category></category></item><item><title><![CDATA[__x86.get_pc_thunk.bx对GDB打印局部变量的影响]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126551014</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126551014</guid><author>FirMoonLight</author><pubDate>Fri, 26 Aug 2022 22:13:25 +0800</pubDate><description><![CDATA[MIT6.828]]></description><category></category></item><item><title><![CDATA[C++中实参形参的传递问题]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126501413</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126501413</guid><author>FirMoonLight</author><pubDate>Wed, 24 Aug 2022 11:38:21 +0800</pubDate><description><![CDATA[自从写了上一篇文章之后，了解了C++返回对象时所做的动作之后，对于形参的操作，我这边也做一些简要的介绍，主要是参考了下面这个连接中的内容你自从写了上一篇文章之后，了解了C++返回对象时所做的动作之后，对于形参的操作，我这边也做一些简要的介绍，主要是参考了下面这个连接中的内容。]]></description><category></category></item><item><title><![CDATA[ld脚本简述]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126457651</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126457651</guid><author>FirMoonLight</author><pubDate>Mon, 22 Aug 2022 00:08:08 +0800</pubDate><description><![CDATA[当链接器将可重定位文件通过重定位等操作生成可执行程序的时候，链接脚本可以控制输入文件中的各个段在生成文件中的位置，并且可以规定生成的可执行文件加载入内存之后的空间布局。链接器ld默认使用其内部的连接脚本，因此在一般情况下，我们都不需要对其进行修改。在使用ld的时候，通过-T选项，可以使用自己写的链接脚本完成链接过程，否则会使用默认的链接脚本。]]></description><category></category></item><item><title><![CDATA[C++返回值拷贝以及std::move]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126356232</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126356232</guid><author>FirMoonLight</author><pubDate>Mon, 15 Aug 2022 22:43:37 +0800</pubDate><description><![CDATA[我将以下面的类为例子，说明C++在RVO的情况下以及关闭RVO情况下，其函数返回值是如何返回给调用者的，并给出其汇编代码的说明。环境是Ubuntu Linux，编译器为GCC7.5.0。public:Obj() { // 构造函数}}Obj(const Obj &obj) { // 拷贝构造函数}Obj(const Obj &&obj) { // 移动构造函数}Obj &operator=(const Obj &obj) { // 赋值构造函数}...]]></description><category></category></item><item><title><![CDATA[snprintf和strcpy和strncpy的区别]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126312445</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126312445</guid><author>FirMoonLight</author><pubDate>Fri, 12 Aug 2022 22:34:30 +0800</pubDate><description><![CDATA[snprintf，strcpy，strncpy这几个函数的功能都是将原字符串拷贝到目的字符串中。但是在细节部分还是存在着一些细微的差别。主要参考man说明。snprintf。]]></description><category></category></item><item><title><![CDATA[静态链接和动态链接简述]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/126219039</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/126219039</guid><author>FirMoonLight</author><pubDate>Sun, 07 Aug 2022 23:24:15 +0800</pubDate><description><![CDATA[由于对静态链接和动态链接的概念已经动作有所不了解，因此特意写了这篇文章进行初步的梳理。主要参考《深入理解计算机系统》这本书。静态链接以一组可重定位的目标文件为输入，生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节组成。
为了创建可执行文件，链接器必须完成两个主要任务：符号解析和重定位。链接器解析符号表.symtab，将每个符号引用和符号定义联系起来。静态库是一系列可重定位目标文件的集合，在Linux系统下，通过工具将其打包为一个文件。
静态库出现的原因]]></description><category></category></item><item><title><![CDATA[TCP各个连接状态的含义以及listen的backlog的含义]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/123833528</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/123833528</guid><author>FirMoonLight</author><pubDate>Tue, 29 Mar 2022 22:07:44 +0800</pubDate><description><![CDATA[线上大量CLOSE_WAIT的原因深入分析
浅谈CLOSE_WAIT
1 工具

查看TCP各个状态的连接数量

netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
LISTEN 5
TIME_WAIT 3
ESTABLISHED 5


perf火焰图
如果对业务代码不熟悉，可以直接使用perf把所有的调用关系使用火焰图给绘制出来。


2 TCP各个阶段的状态

CLOSED 表示socket连接没被使用。
LIST]]></description><category></category></item><item><title><![CDATA[C++强制类型转换]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/123490769</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/123490769</guid><author>FirMoonLight</author><pubDate>Mon, 14 Mar 2022 22:44:03 +0800</pubDate><description><![CDATA[C++提供了四种类型转换方法，分别为

static_cast&lt;类型说明符&gt;(表达式）
dynamic_cast&lt;类型说明符&gt;(表达式）
const_cast&lt;类型说明符&gt;(表达式）
reinterpret_cast&lt;类型说明符&gt;(表达式）

按照适用范围从窄到宽的顺序介绍，先从使用频率比较低的reinterpret_cast开始，然后依次是const_cast，dynamic_cast，最后介绍static_cast。
reinterpret_cast
in]]></description><category></category></item><item><title><![CDATA[KMP算法【笔记】]]></title><link>https://blog.youkuaiyun.com/FirMoonLight/article/details/123194571</link><guid>https://blog.youkuaiyun.com/FirMoonLight/article/details/123194571</guid><author>FirMoonLight</author><pubDate>Wed, 02 Mar 2022 21:40:38 +0800</pubDate><description><![CDATA[1、构造函数声明为explicit，防止隐式转换。(与它相对应的另外一个关键字是implicit，类构造函数默认的情况下即声明为implicit）。// 在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。// 如果构造函数声明为explicit时，这种转换就会报错。// 对多个参数不起作用，对多个参数中有默认值的起作用。class CxString  // 使用关键字explicit的类声明, 显示转换  {  public]]></description><category></category></item></channel></rss>