<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_50271250的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_50271250</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_50271250]]></copyright><item><title><![CDATA[八股文：计算机网络]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124738311</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124738311</guid><author>qq_50271250</author><pubDate>Tue, 17 May 2022 23:27:56 +0800</pubDate><description><![CDATA[前言
先写到这里，后面再补充
OSI网络模型

应用层、表示层、会话层、运输层、网络层、链路层、物理层

TCP/IP模型

应用层、运输层、网络层、链路层、物理层

MTU

链路层的最大传输单元

MAC地址

指物理地址，确定网络设备的地址

ARP协议

提供IPV4和各种网络技术使用的硬件地址之间的映射。

为啥有IP地址还需要MAC地址？为啥有MAC地址还需要IP地址

首先是有交换机用来寻找地址的，交换机中是根据MAC地址来寻址的，但是随着电脑越来越多，不够交换机去分配，于是有了路由器，路由器]]></description><category></category></item><item><title><![CDATA[八股文：C++]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124665693</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124665693</guid><author>qq_50271250</author><pubDate>Thu, 12 May 2022 19:31:32 +0800</pubDate><description><![CDATA[面向对象三大特性：封装、继承、多态
类的访问权限：private、protected、public

在类的内部，无论成员被声明成什么，都可以彼此访问。
在类的外部、只能通过对象访问成员、其中public代表从外部可以访问到该关键字修饰的成员、而private则不能访问、protected则只能允许其类的派生类访问。

类的拷贝控制操作

对于类的拷贝控制操作有5种、其中分为拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数、析构函数
拷贝构造函数：如果一个构造函数的第一个参数是其本身、且额外参数都有其]]></description><category></category></item><item><title><![CDATA[图(C++版本）]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124549737</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124549737</guid><author>qq_50271250</author><pubDate>Tue, 03 May 2022 02:39:10 +0800</pubDate><description><![CDATA[前言
关于图，我主要讲一下拓扑排序和迪加特斯拉算法
TopSort
基本算法思路就是每次寻找入度为0的点，然后将其加入到集合中，然后需要把其相邻的点的入度减1，（毕竟加入了集合，那就不需要连接在一起了，也就减少了入度了）。
代码
#include&lt;bits/stdc++.h&gt;

using namespace std;
const int N=100010;
vector&lt;vector&lt;int&gt;&gt;edges;//邻接表存储图
int indges[N];//每个点的入度
]]></description><category></category></item><item><title><![CDATA[模拟堆(C++版本)]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124500546</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124500546</guid><author>qq_50271250</author><pubDate>Fri, 29 Apr 2022 17:26:52 +0800</pubDate><description><![CDATA[前言
用数组来模拟堆
对于堆来说是一个满二叉树，其中根节点小于左孩子和右孩子（对于小根堆来说),所以可以利用数组来模拟
其元素序号从1开始，这样的话，对于序号为x的元素来说，则2*x为其左孩子，2*x+1为其右孩子
对于堆的模拟主要使用up和down操作来模拟
up:即此节点与父节点来比较，如果比父节点小则与其父节点交换
down:即此节点与其左右孩子中的最小值来比较，如果比其大则与左右孩子中较小的那个孩子交换
代码
#include&lt;iostream&gt;

using namespace std]]></description><category></category></item><item><title><![CDATA[(core dumped)中core文件解决]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124464149</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124464149</guid><author>qq_50271250</author><pubDate>Thu, 28 Apr 2022 00:36:20 +0800</pubDate><description><![CDATA[前言
写c/c++特别容易出现这个错误，此时就需要利用gdb来调试更加好，按照自己查博客来说只要ulimit -c ulimited即可，这代表开启了core文件的大小不限，但是即便如此却依旧没有core文件生成，后来查博客是说有个脚本把core文件弄到别的地方去了，所以还需要执行下一步
sudo bash -c "echo core &gt; /proc/sys/kernel/core_pattern "

例子：
#include&lt;stdio.h&gt;
int main(){
	int*ptr=]]></description><category></category></item><item><title><![CDATA[CSAPP实验5：malloc lab]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124457088</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124457088</guid><author>qq_50271250</author><pubDate>Wed, 27 Apr 2022 18:05:08 +0800</pubDate><description><![CDATA[前言
这个实验想法还是十分清晰的，但是我写了几次都直接错误了，然后bug也不知道到底是哪里出现了问题，最后就只好参考别人的了。
参考博客：实验5：malloc lab
代码


#include "mm.h"
#include "memlib.h"

team_t team = {
     /* Team name */
    "XXXXXX",
    /* First member's full name */
    "yzf",
    /* First member's email addre]]></description><category></category></item><item><title><![CDATA[AVL树(C++版本）]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124371904</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124371904</guid><author>qq_50271250</author><pubDate>Sat, 23 Apr 2022 22:51:34 +0800</pubDate><description><![CDATA[前言
AVL是一个高度平衡的二叉搜索树，主要是为了减少查找的次数而降低树的高度。
关于二叉搜索树主要是关于二叉树的左旋和右旋以及无法平衡的四种状态
左旋：主要是右子树的高度过高了，所以要左旋，就是根节点与其右孩子交换一下，此时右孩子当作了根节点了，而之间的根节点就作为右孩子的左孩子，但是之前的右孩子是可能存在它的左子树的，这时就可以把这左子树连接之前根节点的右边作为根节点的右子树
右旋与左旋是对称的，就不再赘述
不平衡的四种状态
LL:即在根节点的左孩子的左子树上添加导致不平衡了，此时需要根节点右旋即可。
]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第10章：输入输出系统]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124218123</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124218123</guid><author>qq_50271250</author><pubDate>Sat, 16 Apr 2022 18:47:54 +0800</pubDate><description><![CDATA[同步机制-----锁
这里是利用信号量来作为同步机制的，其中down操作来获取锁，up操作来释放锁，对于锁主要是为了同步那些具有竞争关系的进程或者线程。
代码
sync.h
#ifndef __THREAD_SYNC_H
#define __THREAD_SYNC_H
#include "../lib/kernel/list.h"
#include "../lib/stdint.h"
#include "thread.h"

/* 信号量结构 */
struct semaphore {
   uint8_t]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第9章：线程]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124203502</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124203502</guid><author>qq_50271250</author><pubDate>Sat, 16 Apr 2022 00:53:59 +0800</pubDate><description><![CDATA[实现内核线程
线程是啥，线程就是执行流，线程也好，进程也好，都是执行流，所谓执行流，就是正在执行的那些指令。线程依附于进程，因为线程没有自己的地址空间，线程是与进程共享对应进程的地址空间的。
线程的实现方式有两个，一个是用户线程，一个是内核线程，其中用户线程是用户进程自自己通过某种调度算法实现的线程，其内所有的线程共享用户进程的时间片，内核不知道这些线程，如果有一个线程被阻塞的话，就相当于阻塞了整个进程。内核线程则是在内核实现的线程，其由内核调度，其是会被单独分配时间片的。其与进程一起被内核调度器一起调度。]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第8章：内存管理系统]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124079681</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124079681</guid><author>qq_50271250</author><pubDate>Sun, 10 Apr 2022 20:53:41 +0800</pubDate><description><![CDATA[8.1makefile简介
虽则代码模块越来越多，靠自己一个个编译代码和链接文件无疑是一件十分不讨好的事情，于是有了makefile来帮助我们
其基本规则如下
xxx.bin:xxx.o
	gcc xxxx -o xxxx

意思是当xxx.o文件更新时间比xxx.bin更快就执行下面的命令，在:左边的称为目标文件，其右边的称为依赖文件。同时还可以设置变量,如下：
args=xxx.c

xxx.bin:xxx.o
	gcc $(args) -o xxxx

$@代表目标文件的集合，$^代表依赖文件的集合，]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第7章：中断]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/124030803</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/124030803</guid><author>qq_50271250</author><pubDate>Fri, 08 Apr 2022 03:23:59 +0800</pubDate><description><![CDATA[前言
这一章挺琐碎的，看了好几遍，好好捋一捋这一章干的事情。
这一章主要就是利用可编程中断控制器8259A来设置中断处理程序，其中32个中断是计算机自己有的（从0开始数），这一章目前只开启了时钟中断，所以这里设置的中断向量号从32开始，然后有个中断描述符表（IDT),类似与全局描述符表（GDT),中断向量号就类似与索引，从IDT中找到中断描述符，中断描述符中包括选择子（毕竟最终要找到中断处理程序，而中断处理程序肯定是在某个内存地址上的），属性，以及偏移地址，其中选择子在GDT中找到段描述符，段描述中存储着虚]]></description><category></category></item><item><title><![CDATA[csapp实验4：shell lab]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/123961041</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/123961041</guid><author>qq_50271250</author><pubDate>Mon, 04 Apr 2022 21:58:13 +0800</pubDate><description><![CDATA[前言
我之前不是做不下去吗，关于这个shell lab,这次再尝试后发现也没这么没头绪了，虽然不是自己独立做出来的，但是确实真正看懂了，所以千万不要急躁，不要焦虑啊，认认真真去搞就够了,之后我再做一个malloc lab以及补上实验3的lab就不做了，主要是自己也对cache lab以及buffer lab不太感兴趣。至于proxy lab是与网络编程相关的，就不做了。
实验
该实验就是写几个函数，补上一个简单的shell
可通过make rtestxx来知道正确答案，通过make testxx来测试自己，]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第6章：完善内核]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/123887221</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/123887221</guid><author>qq_50271250</author><pubDate>Fri, 01 Apr 2022 00:10:22 +0800</pubDate><description><![CDATA[前言
这一章没啥可讲的，主要就是实现一个类似putchar()的函数，当然是使用纯汇编的，书上已经讲的很详细了，我主要加上了一些我自己的注释
代码
print.S
;--------步骤---------------------------
;1.备份寄存器现场
;2.获取光标坐标值，光标坐标值时下一个可打印字符的位置
;3.获取待打印的字符
;4.判断字符是否为控制字符，若是回车符，换行符，退格符三种控制字符之一，则进入
;相应流程，否则，其余字符否被粗暴的认为是可见字符，进入输出流程处理
;5.判断是否]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第5章：保护模式进阶，向内核进阶]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/123785031</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/123785031</guid><author>qq_50271250</author><pubDate>Thu, 31 Mar 2022 01:48:40 +0800</pubDate><description><![CDATA[前言
由于涉及到马上要搞实习的事情，搞得我十分的浮躁，自己也是频繁失眠，想来还是自己太过懒了，没控制住自己，自己也在这一个多月没搞好，尤其是本来想花几天时间来写一个高性能服务器，也把游双大佬的linux 高性能服务器编程大概看完了，然后自己也跟着视频写了写，但总是感觉自己没有真的懂，然后自己在github上下来的项目也总是感觉不好下手，然后我自己又想去搞csapp的实验了，结果前几个实验还好，但是在做那个shell lab的时候总感觉自己没有很好的搞懂，遂又放弃，然后自己又迷上了原神，又是荒废了十几天，这一]]></description><category></category></item><item><title><![CDATA[CSAPP实验3：attacklab]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/123172546</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/123172546</guid><author>qq_50271250</author><pubDate>Thu, 03 Mar 2022 20:20:14 +0800</pubDate><description><![CDATA[前言
这个实验只做前三个，后几个不太想做了
实验
phase1
与上一个实验，相同，首先利用objdump -d ctarget ctarget.txt生成其纯汇编文件，方便观察
void test() {
    int val;
    val = getbuf();
    printf("NO explit. Getbuf returned 0x%x\n", val);
}
void touch1() {
    vlevel = 1;
    printf("Touch!: You called ]]></description><category></category></item><item><title><![CDATA[CSAPP实验2：bomblab]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/123079804</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/123079804</guid><author>qq_50271250</author><pubDate>Wed, 23 Feb 2022 02:31:07 +0800</pubDate><description><![CDATA[前言
花了一天多的时间，也终于是完成了bomblab,这些实验还是十分有难度的啊，也不知道cmu这些顶尖大学学生大一就能够完成是多么的强啊。
关于这个实验一些关键地方提示一下，对于一个函数的参数我们从书中可以知道的是，如果函数参数少于6个，是以寄存器的方式来存储的，而多于6个则是通过栈来存储。
而我要扩展一下的是这6个寄存器先后分别是 %rdi %rsi %rdx %rcx %r8 %r9。
实验
利用指令 objdump -d bomb &gt; bomb.txt得到bomb的反汇编文本，然后就可以通过这]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第4章：保护模式入门]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/122795398</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/122795398</guid><author>qq_50271250</author><pubDate>Sun, 06 Feb 2022 04:02:41 +0800</pubDate><description><![CDATA[前言
妈的还是没控制住自己，玩了几天，我自己就有一个很臭的毛病，如果玩的话就会一直玩下去，既然如此我直接不玩了，妈的我发誓绝逼不玩了
还好没出现什么BUG，也算是完成了。
关于这一章，我觉得比较重要的是对于全局描述符的设置，在书中我们可以知道，实模式下用户程序可以直接访问内存，这无疑是及其不安全的，并且用户程序与操作系统是同一地位的，这也意味着用户程序可以随意进入操作系统内核，这些都是及其不安全的，所以就有了保护模式，其中由于对段的约束，描述比较多，于是就用8字节的内存区域来描述段，这也就是段描述符，段描述]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第3章：完善MBR]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/122735413</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/122735413</guid><author>qq_50271250</author><pubDate>Fri, 28 Jan 2022 20:23:56 +0800</pubDate><description><![CDATA[前言
这次我出现了一些BUG，导致我忙活了一阵子，还好的是解决了
老规矩还是把整个流程过一遍，当MBR忙活完后，就需要把自己手中的棒交给loader了，MBR的作用就是从硬盘中的内核加载器移动到内存中，然后跳转到内核加载器的地址去让内核加载器运行，在这方面需要对硬件需要一些了解特别是in out指令,还有个各个端口访问（端口就是寄存器），因为需要通过这些端口读取数据



实验
书中也说了需要对rd_disk_m_16函数要比较了解，所以我给出我的一些注释
mbr.S
%include "boot.inc"]]></description><category></category></item><item><title><![CDATA[操作系统真象还原第2章：编写MBR主引导记录]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/122658614</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/122658614</guid><author>qq_50271250</author><pubDate>Sun, 23 Jan 2022 23:12:13 +0800</pubDate><description><![CDATA[前言
这章的内容挺少的，也很简单，如果环境没配置错的话是没啥问题的。但是这章也很精彩，把引导的过程给说了出来，我也是看了几遍把这个过程给大致看懂了。
首先计算机一开机这个时cpu会自动把cs:ip指针赋值成0xf000:0xfff0,根据实模式下的寻址关系可以知道此时正好是指向地址为0xffff0,而这个地址距离最高地址0xfffff之间正好是16字节的地址空间，这肯定是不够BIOS来执行各种硬件初始化以及各种硬件检查和中断向量表的建立等等，所以这里实际上存的跳转的地址，跳转到足够的地址后就会去执行这些，当]]></description><category></category></item><item><title><![CDATA[CSAPP实验1：datalab]]></title><link>https://blog.youkuaiyun.com/qq_50271250/article/details/122632090</link><guid>https://blog.youkuaiyun.com/qq_50271250/article/details/122632090</guid><author>qq_50271250</author><pubDate>Sat, 22 Jan 2022 01:43:05 +0800</pubDate><description><![CDATA[前言
CSAPP上的实验还是十分有趣的，尤其是其自动评分系统。做完了实验之后自己也确实对知识的理解更加深入了。有关CSAPP的知识以后或许我会再写博客，现在则先把实验写写博客吧
百度网盘下载实验文档
提取码：kdx4

实验
题1-2
//1
/* 
 * bitXor - x^y using only ~ and &amp; 
 *   Example: bitXor(4, 5) = 1
 *   Legal ops: ~ &amp;
 *   Max ops: 14
 *   Rating: 1
 */]]></description><category></category></item></channel></rss>