05 2022 档案
摘要:本节先解决内存的划分方式和内存页的表示、组织问题,设计好数据结构 ###分段还是分页 从内存管理角度,分析分段和分页的优缺点: 第一点 从表示方式和状态确定角度考虑。 段的长度大小不一,用什么数据结构表示一个段,如何确定一个段已经分配还是空闲呢?而页的大小固定,我们只需用位图就能表示页的分配与释放。
阅读全文
摘要:本节树立启动的整体流程,重点解读Linux上GRUB是怎样启动,以及内核里的“实权人物”-- vmlinuz内核文件是如何产生和运转的。 ###全局流程 在机器加电后,BIOS会进行自检,然后由BIOS加载引导设备中引导扇区。在安装有Linux操作系统的情况下,在引导扇区里,通常是安装的GRUB的一
阅读全文
摘要:前面我们为调用Cosmos 的第一个C函数hal_start做了大量的工作,本节要让操作系统Cosmos里的第一个C语言真正跑起来。 继续在hal_start函数里,首先执行板级初始化,其实就是hal层(硬件抽象层,下同)初始化,其中执行了平台初始化、hal层的内存初始化、中断初始化,最后进入到内核
阅读全文
摘要:上一节讲道二级引导器不做具体的加载任务,而是主要解析内核文件、收集机器环境信息,那具体做些什么事呢? 在二级引导器中,要检查CPU是否支持64位的工作模式、收集内存布局信息,查看是不是符合我们操作系统的最低运行要求,还要设置操作系统需要的MMU页表、设置显卡模式、释放中文字体文件等。 ###检查与收
阅读全文
摘要:###抛转引玉 在上节建造了我们自己的“计算机”,并且在上面安装了GRUB,GRUB不是已经把我们的操作系统加载到了内存中了吗?为什么还需要二级引导器这个东西呢? 二级引导器作为操作系统的先驱,它需要收集机器信息,确定这个计算机能不能运行我们的操作系统,对CPU、内存、显卡进行一些初级配置,放置好内
阅读全文
摘要:###创建虚拟硬盘 dd创建创建虚拟镜像文件 dd bs=512 if=/dev/zero of=hd.img count=204800 ;bs:表示块大小,这里是512字节 ;if:表示输入文件,/dev/zero就是Linux下专门返回0数据的设备文件,读取它就返回0 ;of:表示输出文件,即我
阅读全文
摘要:在让机器跑起来之前,要先弄清楚数据同步的问题,如果不解决数据同步的问题,后面机器跑来了,就会出现很多不可预知的结果。 ###非预期结果的全局变量 int a = 0; void interrupt_handle() { a++; } void thread_func() { a++; } 这段代码描
阅读全文
摘要:###程序局部原理性 CPU大多数时间在执行相同的指令或者与此相邻的指令,这就是程序局部性原理,依据此原理用来缓解CPU和内存之间的性能瓶颈。 ###内存 内存,从专业角度来讲,内存应该叫做DRAM,即动态随机存储器,内存存储颗粒芯片中的存储单元是由电容和相关元件做成,电容存储电荷的多、少代表数字信
阅读全文
摘要:###为什么需要虚拟地址 (多程序并发场景)如果一台计算机内存中运行一个程序A,内存中又放了一道程序B,程序A和程序B各自运行一秒,如此循环,直到其中之一结束,这个场景下就会产生一些问题(此处只关心内存相关的几个核心问题) 1、谁来保证程序A跟程序B没有内存地址的冲突?换句话说,就是程序 A、B 各
阅读全文
摘要:###1、计算机是如何将系统起起来的?-- PC机的引导流程 PC机BIOS固件是固化在PC机主板上的ROM芯片中,断电也能保存,PC机上电后的第一条指令就是在BIOS固件中,**它负责检测和初始化CPU、内存和主板平台,**然后加载引导设备(大概率是硬盘)中的第一个扇区数据,到0x7c00地址开始
阅读全文
摘要:背景: 打算采用以迭代器的方式递归进行二分查找,具体代码如下: 该模板函数以该target元素的迭代器的方式返回 template <typename IterT, typename ValueT = typename std::iterator_traits<IterT>::value_type,
阅读全文
摘要:因该方法实现与之前记录的不同,就想着记录下。。。 重点inplace_partition函数的实现 注意:迭代器范围都是左闭右开的区间 std::iter_swap(last_greater, --first_equal); if(comp(*last_greater, pivot)) { std:
阅读全文
摘要:vector的resize:既分配了空间,也创建了对象,会调用构造函数 vector的reserve:reserve()表示容器预留空间,但不是真正的创建对象,需要通过insert()或push_back()等操作创建对象 reserve()只修改capacity大小,不修改size大小, resi
阅读全文
摘要:如何实现浏览器的前进、后退功能?其实,用两个栈就可以非常完美地解决这个问题。 使用两个栈,X 和 Y,我们把首次浏览的页面依次压入栈 X,当点击后退按钮时,再依次从栈 X 中出栈,并将出栈的数据依次放入栈 Y。当我们点击前进按钮时,我们依次从栈 Y 中取出数据,放入栈 X 中。当栈 X 中没有数据时
阅读全文
摘要:###make_shared的使用 shared_ptr<string> p1 = make_shared<string>(10, '9'); shared_ptr<string> p2 = make_shared<string>("hello"); shared_ptr<string> p3 =
阅读全文
摘要:运行并挂载docker镜像 docker run -it -v E:/workspace/docker:/dl -p 8888:8888 8d78dd1e1b64 /bin/bash 安装jupyter 保存docker容器的修改 查看被修改的容器 :docker ps -l 提交指定容器保存为新的
阅读全文