学习笔记
文章平均质量分 91
Last_Time_Lord
未入门菜鸡
展开
-
一个简单http_server的实现(1)
我的博客:startcraft.cn最近在学习网络编程的知识,所以准备实现一个http服务器,写博客来记录一下学习的过程RIORIO是csapp中提到的一个健壮的I/O包,为什么要使用这个来进行文件的读写,是因为接下来的socket编程中不适合使用c标准I/O先贴出Rio包的实现#ifndef __RIO_H__#define __RIO_H__#include <http_server.h> #define RIO_BUFSIZE 8192//缓冲区的大小struct ri原创 2020-06-10 00:29:15 · 266 阅读 · 0 评论 -
从零实现一个操作系统-day14
我的博客:startcraft虚拟内存管理startcraft虚拟内存就是对每一个进程而言,对它来说它认为它独占所有4G内存,进程内的地址就是以这4G的虚拟内存来表示的,当要执行时,cpu通过分段机制和分页机制将虚拟地址转换成物理内存地址进行访问。同时一个进程也不是所有的页都在内存中,只有部分在内存中,当需要的页不在内存时产生一个缺页中断,然后进行调度,将需要的页调入内存仿照linux的设计,对于一个进程的4G虚拟空间3G-4G的空间给系统内核,0-3G给用户程序,现在要将内核映射到虚拟地址空间的3原创 2020-05-28 19:33:43 · 499 阅读 · 0 评论 -
从零实现一个操作系统-day13
我的博客startcraft物理内存管理由于之前采用了平坦模式,也就是整个内存一段,所以这里就不用管段的处理了。分页参考:https://www.cnblogs.com/peterYong/p/6556619.html#_label8分页就是将主存,程序执行的线性地址空间,还有外存都在逻辑上划分位固定大小的块,这样的好处是降低内存碎片的影响,每一页的大小不能太大,也不能太小,x86采用的是一页4KB,4GB的主存就可以分为2^20个页对存储空间进行逻辑划分之后,寻址时就要由相应的映射,对于每一个原创 2020-05-16 01:20:50 · 356 阅读 · 0 评论 -
从零实现一个操作系统-day12
我的博客:startcraft中断控制芯片的初始化参考:https://blog.csdn.net/longintchar/article/details/79439466中断控制芯片8259A由主从两个芯片级联而成从片的输出接在主片的IRQ2上,所以一共可以接受15个设备的中断信号,中断控制芯片的作用就是管理外接设备的中断首先要对芯片进行初始化,初始化该芯片就是初始化一组寄存器ICW寄存器当地址线的A0=0时主片的端口的0x20,从片的端口是0xA0ICW1首先设置ICW1,ICW1寄原创 2020-05-13 01:25:58 · 598 阅读 · 0 评论 -
从零实现一个操作系统-day11
我的博客startcraftIDT昨天弄完了GDT,今天来弄IDT,IDT就是中断描述符表。和GDT类似。中断就是一个电信号,它可以打断cpu当前的操作,让cpu执行你指定的中断处理函数,等执行完,cpu会回去继续执行它之前的操作,就像你移动鼠标,就是产生了一个中断,让cpu先帮你移动鼠标。既然打断cpu让他执行你指定的中断处理函数,那么中断就是有编号的,让cpu知道应该执行哪一个中断处理函数,intel的处理器支持256个中断,也就是有0-255个中断编号和GDT一样,有中断描述符,大小为8字节原创 2020-05-09 01:52:50 · 224 阅读 · 0 评论 -
从零实现一个操作系统-day10
我的博客:startcraft保护模式保护模式是从80386时代引入的,之前的8086只有实模式,实模式有1MB的寻址空间(2 ^ 20),而保护模式有4GB的寻址空间,且支持分页等操作保护模式对内存段的访问做了限制,对于内存段的性质和允许的操作给出了定义,所以每一个段有一个段描述符,占8个字节,段描述符有很多,只能放在内存里,其中最重要的全局段描述符表(GDT),GDT的相关信息存在cpu...原创 2020-05-07 01:30:59 · 128 阅读 · 0 评论 -
从零实现一个操作系统-day9
我的博客startcraft调试配置昨天写完printk函数后很有可能遇到bug,当遇到bug的时候怎样来调试呢,现在就来配置一下gdb调试qemu可以以调试模式启动配合gdb来进行调试,当然cgdb更加好用一些qemu的调试模式命令是qemu -S -s -fda floppy.img -boot a-S是让qemu不要继续运行,等待gdb的运行指令,-s是开启1234端口等待g...原创 2020-04-30 02:19:41 · 285 阅读 · 0 评论 -
从零实现一个操作系统-day8
我的博客startcraft实现简易版的printf函数屏幕的输入输出函数主要的功能还是dubug,我们模仿标准库来实现,标准库的printf基于vsprintfint vsprintf(const char *format, va_list arg)先看看printk的内容void printk(const char *format, ...){ // 避免频繁创建临时变量,内...原创 2020-04-29 01:44:59 · 197 阅读 · 0 评论 -
从零实现一个操作系统-day7
我的博客startcraft字符串函数因为在内核中,大部分的c标准库函数无法使用,字符串操作的函数又比较常用,所有自己实现一些include/string.h#ifndef INCLUDE_STRING_H_#define INCLUDE_STRING_H_#include "types.h"void memcpy(uint8_t *dest, const uint8_t *sr...原创 2020-04-25 01:46:15 · 118 阅读 · 0 评论 -
从零实现一个操作系统-day6
我的博客startcraft昨天写的内核在屏幕上没有我们输出的东西,今天就来想办法显示点什么文字的显示要显示东西就涉及到显卡了,显卡有两种模式,文本模式和图形模式,现在基本都是图形模式用得多,但是我们这个就用文本模式了,毕竟不涉及ui啥的文本的显示规则显卡通电后就自动初始化了80\ * 25分辨率的文本模式,即一屏25行,一行80个字符之前说过内存地址空间不是全部映射到主存的,有一部分...原创 2020-04-23 02:06:57 · 270 阅读 · 0 评论 -
从零实现一个操作系统-day3
我的博客 startcraft.cn链接器脚本第一天的链接器脚本我们没有看懂,今天就来把它弄清楚吧,先把脚本代码弄过来/** kernel.ld −− 针对 kernel 格式所写的链接脚本*/ENTRY(start)SECTIONS{ /* 段起始位置 */ . = 0x100000; .text : { *(.text) . = ALIGN(4096);...原创 2020-04-19 02:47:16 · 160 阅读 · 0 评论 -
从零实现一个操作系统-day2
我的博客: startcraft.cnkeywords: 操作系统今天主要是对操作系统的启动进行学习,因为都是理论的部分,这篇博客就当学习的笔记了计算机的启动过程BIOS首先在按下电源键后计算机首先读取写在ROM中的BIOS(Basic Input/Output System 基本输入输出系统)它保存着计算机最重要的基本输入输出的程序,其主要功能是为计算机提供最底层的、最直接的硬件设...原创 2020-04-18 00:50:43 · 189 阅读 · 0 评论 -
从零实现一个操作系统-day1
我的博客: startcraft.cn目的从这次春招中的碰壁和各种感悟,深刻体会到自己基础知识的不足,从零实现一个操作系统可以帮助自己更好得了解操作系统的知识。自己很早之前就开始有写一个微型操作系统的想法,之前也实践过,但弄了几天就放弃了,发现自己的毅力太差了,其实就是太懒了,写blog的目的也有敦促自己,不要懈怠。资料感谢前辈们无私提供的各种教程,这系列blog(希望是系列)跟着hurl...原创 2020-04-17 01:44:45 · 348 阅读 · 0 评论 -
最小生成树——prime算法
最小生成树的prime算法是以点为核心来进行计算.原理:从一个点开始遍历它到其他所有点的距离,无法直接到达的距离为INF,记录为mindis数组如:一共有四个点ABCD 五条边A——B 2; A——C 1; A——D 3; B——C 4; C——D 2;选取A为第一个点,那么mindis数组中的值为0,2,1,3;...原创 2018-04-24 20:36:43 · 1055 阅读 · 0 评论 -
存图方法——链式前向星
常见的存图的方法有邻接矩阵但是如果数据过大的话二维数组开不下,这就需要换一种存图的方法,这里介绍链式前向星链式前向星的结构由两部分组成第一部分 是一个结构体typedef struct{ int the_end;//边的结尾(默认为0,若边从0开始则需要初始化为-1) int w;//边的权值 int next;//下一条边在edge数组中的下标}E...原创 2018-04-23 22:21:58 · 339 阅读 · 0 评论 -
Dinic 最大流
我的博客地址: https://startcraft.cn概述dinic算法是网络流中的一种算法,这里拿来求最大流所谓最大流就是一个网络中的最大流量,如下面这个图片其中A称作源点,B称为汇点,边上的数字代表这条边最多能容纳多大的流量,所以上图的最大流量为12dinic算法就是求最大流算法的一种反向边概念大部分网络流的算法都会在建边是建立一条反向边,初始权值为0,可以理解为给算法后...原创 2019-03-06 21:53:03 · 556 阅读 · 1 评论 -
二分图匹配(匈牙利算法)
二分图的性质和一些名词二分图的定义:一个图中的点可以分成两个不相交的集合\(A,B\),并且图中所有的边都是从一个集合连向另一个集合,即同一个集合中的点之间没有边,如图1就是一个二分图{% qnimg Hungarian Algorithm1.png %} 图1 匹配:图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点,如图2中红色的边就是一个匹配{% ...原创 2019-03-27 22:25:00 · 158 阅读 · 0 评论 -
ST表详解
本蒟蒻的blog:https://startcraft.cnST表概述ST是解决区间RMQ(区间最值)问题的一种数据结构,它不支持在线修改,预处理\(O(nlogn)\),查询\(O(1)\)实现以区间最小值为例子预处理\(ans[i][j]\)表示区间\([i,i+2^{j}-1]\)的最小值,同时它可以表示成前半个区间的最小值和后半个区间的最小值前半个区间是\([i,i+2{j-...原创 2019-04-25 21:42:58 · 408 阅读 · 0 评论 -
线段树
本博客同步更新至 https://startcraft.cn介绍线段树的应用场景在区间修改和区间查询上,修改和查询的时间复杂度都为O(log n)线段树如它的名字一样将区间分成一段一段的,如123456789这一串数字,以区间求和为例{% qnimg seg_tree1.png %}上图就是构建的线段树,其中结点里的值是该结点表示的区间的和,中括号里的数字代表表示的区间实现(以区间求...原创 2019-04-21 22:06:17 · 142 阅读 · 0 评论 -
线段树扫描线
我的博客:http://startcraft.cn矩形面积并如图,考虑求图中矩形的面积并这个问题可以转换成求下图中这写部分的面积就是从下网上扫一遍,遇到矩形的下边就加入,然后统计当前的线段长度,当然重叠部分的线段只算一次长度,遇到上边就删除,然后每种颜色的矩形面积就是 当前线段长度(将要加入的线段的高度-上一条加入的线段的高度)*然后这些累加起来就是矩形的面积并现在的问题就是如何...原创 2019-05-29 15:14:19 · 127 阅读 · 0 评论 -
AC自动机
概述AC自动机的目的是实现多模式串的匹配,即在一个主串中查询多个模式串AC自动机是在trie(字典树)树的基础上实现的对于一个主串,将这个各个模式串插入字典树,然后进行fail指针的生成fail指针的生成是AC自动机的关键fail指针顾名思义就是在匹配失败时使用的,在匹配失败时下一步就是去fail指针指向的结点,避免了多次匹配造成的时间浪费构建字典树struct NODE{ in...原创 2019-03-06 21:26:55 · 158 阅读 · 0 评论