自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 十. 内核线程

实现线程函数观察一下这段c语言代码void threadFunc(void *arg){ printf("thread function\n");}int main(){ printf("main function\n"); _beginthread(threadFunc, 0, NULL); return 0;}这里只是举个简单的例子,没有考虑错误处理和资源回收。在

2018-04-30 00:00:58 269

原创 八. 内存池规划

bitmap简介计算机中一些资源的数量非常庞大,比如内存容量和硬盘容量。为了使用这些资源,必须涉及到一套管理这些资源的方法,而方法中必须要构建数据结构来存储管理数据,这些数据本身也是需要占用内存的计算机中最小的单位是位,那么用一组二进制位串来管理其他单位大小的资源是很自然的,这组二进制位中的每一位与其他资源的数据单位是一一对应的关系,这实际是一种映射关系,于是这组二进制位便有了一个名字—-位图位图与

2018-04-27 19:34:15 266

原创 九. 内核的内存分配

前面已经准备好了内存池,这里就要正式实现内存的分配了。因为到目前为止,还没有用户进程,所以这里只实现内核中的动态内存分配。内存分配的过程如下: 1. 在虚拟内存池中申请n个虚拟页 2. 在物理内存池中分配物理页 3. 在页表中添加虚拟地址与物理地址的映射关系接下来就是一步步完成这三步申请虚拟页// 在虚拟内存池中申请pg_cnt个虚拟页static void *vaddr_get(enum

2018-04-27 19:33:05 385

原创 六. 函数调用约定与系统调用

函数调用约定调用约定从字面上理解,他是调用函数的一套约定。主要体现在一下三个方面 1. 参数的传递方式,参数是存放在寄存器中还是栈中 2. 参数的传递顺序,是从左到右传递还是从右到左传递 3. 是调用者保存寄存器环境还是被调用者保存在进行函数调用的时候,函数所需要传递的参数往往是不固定的。在计算机中并没有专门储存参数的硬件,因为参数的不确定性,该硬件的容量并不好确定,而且如果传递参数的过程中,

2018-04-23 15:52:14 439

原创 七. 中断

简介中断是指CPU获知了计算机中发生的某些事,CPU暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完了之后,CPU继续执行刚才的程序。通过中断可以极大的提高CPU的执行效率,如果没有中断,在处理器与外部设备通信时,他必须在向该设备发送指令后进入忙等待,反复轮询该设备是否就绪,这样就浪费了大量处理器的执行周期。引入中断之后,当处理器发出设备请求后就可以立即返回处理其他任务,而当设备动作

2018-04-23 15:50:53 362

原创 五. 开启分页机制

为什么有进行内存分页目前我们的小kernel还一直在分段机制下工作,因为还只有一个loader在内存中跑,所以不会出现内存不足的问题。假如说此时未开启分页功能,而物理内存空间又不足了,如下图此时进程C想要执行,但是内存空间已经不足。要么就等待进程A或者进程B执行完成,这样就有连续的内存空间了。要么就讲进程A的A3段或者进程B的B1段换到硬盘上,腾出一部分空间,同样可以容纳进程C执行等待是极其不好的用

2018-04-23 15:49:40 481

原创 四. 获取内存容量

前言在前面一篇文章中介绍了进入保护模式的方法: 1. 打开A20 2. 加载gdt 3. 将控制寄存器cr0的pe位置1 通过这三步成功的进入到保护模式下,但是在进入保护模式之前,还需要对进行内存的检测工作,启动分页机制等等,最后还要将内核加载到内存当中。这些是之前没有完成的,接下来就要完成这些进入到保护模式之前的准备工作获取物理内存大小在linux中,获取内存容量的方法有很多种,比如det

2018-04-23 15:40:13 726

原创 三. 保护模式

实模式与保护模式下的分段机制程序想要在计算机上运行,就必须将源代码编译链接成二进制的可执行文件之后才可能被操作系统加载执行。如果在加载的过程中,程序的地址都是绝对的物理地址,那么程序就必须放在一个固定的地方,那么拥有两个相同地址的程序就只能运行一个了。于是,分段机制就产生了。让CPU通过 段基址:段内偏移 来访问任意内存,这样程序就可以实现重定位。也就是说,段内偏移相对于段基址是不变的。无论段基址是

2018-04-23 15:38:54 1021

原创 二. 编写mbr,让机器启动起来

mbr简介大家都知道,在我们按下电脑电源的时候,首先启动的BIOS(基本输入输出系统),那么BIOS又是如何被启动的呢,谁来唤醒他呢,它又在何处运行呢。要了解这些的话,首先得介绍一下我们实模式的内存布局实模式的内存布局图中的内容我们现在只需要关注红色框出来的地方,可以看到BIOS的入口地址处只有16BYTE的空间,很显然,这一小块空间肯定存放的不是数据,只能是指令了,图中也写的很明显了jmp f0

2018-04-23 15:36:48 2121

原创 一. bochs环境部署

配置要求一台linux操作系统的机器即可,最好是32位的。因为我们实现的小kernel是32位的,在64的机器上进行编译和链接可能会出现某些问题。笔者这里使用的是Ubuntu16.4环境配置bochs安装与配置安装我们自制的操作系统也是运行在一个虚拟机中的,这里我们用的是bochs,bochs本身也是基于x86架构的,这也是我之前说我们的小kernel也是32位的原因 bochs下载地址 点击链接

2018-04-23 15:34:31 523

原创 从零开始,打造自己的STL(五、deque)

deque简介deque是双向开口的连续线性空间,支持内部元素的随机访问。看到这个概念,相信大家一定会想起vector,vector是单向开口的连续线性空间,内部元素也是可以随机访问的。deque的元素类似这样那么deque像比于vector的差异在哪里deque的头部插入是vector没有的,虽然从技术角度来讲,vector实现头部插入也不是很难,但是效率太低,不值得且没必要除了一些极端情况下

2018-04-23 15:29:09 258

原创 从零开始,打造自己的STL(四、list)

简述在前面我们看了vector的实现之后相信对容器有了一定的认识。容器即为存放物件之所,它代表着一块空间。想要直观的了解一个容器,那么看懂他的空间分配策略是一个非常有效的入手方式。接下来我们就来看看STL中的list又是如何实现的吧。list的结构list就是我们常说的链表,说到链表相信大家就很熟悉了。非连续空间、通过指针来连接每一个小空间、插入和删除都是O(1)操作,元素访问效率较低等等。。。

2018-04-23 15:27:49 354

原创 从零开始,打造自己的STL(三、alloc)

简述在stl中,所有的内存分配与释放都是交由allocator来实现的。在大部分情况下,我们都接触不到这里面的内容,因为它一直是隐藏在幕后悄悄的工作。 当然如果对于内存分配有特殊的要求的话,STL也提供了接口供我们使用自己的分配器 比如在vector的定义上template <typename _Tp, typename _Alloc = alloc >class vector : prote

2018-04-23 15:26:24 719

原创 从零开始,打造自己的STL(二、vector)

vector的内存布局以及操作方式与array非常的类似,都是一段连续的内存空间。两者之间唯一的差距就是空间运用的灵活性。array的空间在配置好了之后就无法更改,它所存放的数据量是固定的,一但空间不够用之后需要重新配置一块更大的空间。vector则不然,它的内存空间会随着元素的加入自动扩充新的空间供给使用,这样使用起来就不需要担心空间是否够用了。vector的内存结构vector采用了连续内存空间

2018-04-23 15:24:45 390

原创 一. 简述

简介对于每一个热爱c++的人来说,STL都是他们日常撸码、高效工作的必定会使用到的标准模板库。STL取用范型的思想,通过模板元编程,去掉了不同型别所带来的差异性,极大的提高了代码的复用性。既然STL如此强大与方便,我们当然要好好的学习它啊。仅仅停留在使用层面是是远远不够的,我们必须深入到代码内部,详细的了解它内部的工作原理。了解他不只是因为我们作为底层开发者不搞懂原理誓不罢休的精神,更是因为要更好的

2018-04-23 15:22:41 370

c++经典面试100题

包含100道经典的c++面试题, 准备面试的同学自取.233333

2018-10-09

空空如也

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

TA关注的人

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