自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 操作系统真象还原:编写硬盘驱动程序

这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件要实现文件系统,必须先有个磁盘介质,虽然咱们己经有个虚拟磁盘 ,但它只充当了启动盘的作用,仅用来存储内核,是个没有文件系统的裸盘( raw disk)如同我们之前第一章创建主盘时一样,在bochs目录下:创建磁盘然后在输入框依次输入以下,输入一个,按一次回车接下来,我们在文件中,写入这样,bochs虚拟机启动时,就会识别这个磁盘并且自动挂载。:用来查看物理地址处的值,eg:查看0x475处一个字节的值。这个0x475处存储的是主机上安装的硬盘数

2024-07-02 15:26:36 260

原创 操作系统真象还原:进一步完善内核

系统调用就是让用户进程申请操作系统的帮助,让操作系统帮其完成某项工作,也就是相当于用户进程调用了操作系统的功能,因此“系统调用”准确地来说应该被称为“操作系统功能调用”。Linux 系统调用是用中断门来实现的,通过软中断指令 int 来主动发起中断信号Linux 只占用一个中断向量号,即 0x80 ,处理器执行指令 int 0x80 时便触发了系统调用。

2024-07-01 16:05:32 637

原创 操作系统真象还原:用户进程

** @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE。

2024-06-23 16:44:46 1086

原创 操作系统真象还原:输入输出系统

键盘是个独立的设备,在它内部有个叫作键盘编码器的芯片,通常是 Intel8048或兼容芯片,它的作用是:每当键盘上发生按键操作,它就向键盘控制器报告哪个键被按下,按键是否弹起。这个键盘控制器可并不在键盘内部,它在主机内部的主板上,通常是 Intel 8042 或兼容芯片,它的作用是接收来自键盘编码器的按键信息,将其解码后保存,然后向中断代理发中断,之后处理器执行相应的中断处理程序读入 8042 处理保存过的按键信息。一个键的状态要么是按下,要么是弹起,因此一个键便有两个编码,按键被按下时的编码叫通码。

2024-06-19 20:56:11 904

原创 操作系统真象还原:线程

我们软件中所做的任务切换,本质上就是改变了处理器中程序计数器的指向,即改变了处理器的“执行流”。

2024-06-19 14:50:38 962

原创 操作系统真象还原:内存管理系统

make 给咱们提供了方法,可以在命令之前加个字符’@’,这样就不会输出命令本身信息了变量定义的格式:变量名=值(字符串),多个值之间用空格分开。make 程序在处理时会用空格将值打散,然后遍历每一个值。另外,值仅支持字符串类型,即使是数字也被当作字符串来处理。变量引用的格式:$(变量名)。这样,每次引用变量时,变量名就会被其值(宇符串)替换。/*

2024-06-10 19:16:53 951

原创 操作系统真象还原:中断

为了使所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就称为定时或时钟。时钟只是一种时间的度量,只是一种节奏。计算机中的时钟,大致上可分为两大类:内部时钟和外部时钟。内部时钟是指处理器中内部元件,如运算器、控制器的工作时序,主要用于控制、同步内部工作过程的步调。内部时钟是由晶体振荡器产生的,简称晶振,它位于主板上,其频率经过分频之后就是主板的外频,处理器和南北桥之间的通信就基于外频。Intel 处理器将此外频乘以某个倍数(也称为倍频)之后便称为主频。

2024-06-10 16:41:11 1043

原创 操作系统真象还原:完善内核

首先,每个进程都有自己的栈,这就是每个内存自己的专用内存空间。其次,保存参数的内存地址不用再花精力维护,己经有战机制来维护地址变化了,参数在战中的位置可以通过楼顶的偏移量来得到。调用者将所有参数从右向左入栈调用者清理参数所占的栈空间调用者将所有参数从右向左入栈被调用者清理参数所占的栈空间。

2024-06-05 15:13:05 693

原创 操作系统真象还原:保护模式进阶,向内核迈进

特权级转移分为两类, 一类是由中断门、调用门等手段实现低特权级转向高特权级,另一类则相反,是由调用返回指令从高特权级返回到低特权级,这是唯一种能让处理器降低特权级的情况。

2024-06-03 15:50:26 991 1

原创 操作系统真象还原:保护模式入门

CPU 是按照程序中指令顺序来填充流水线的,也就是说按照程序计数器 PC(x86中是 CS: ip)中的值来装载流水线的,当前指令和下一条指令在空间上是挨着的。如果当前执行的指令是jmp,下一条指令已经被送上流水线译码了,第三条指令已经被送上流水线取指啦 仔细想想看,其实这个流水线没用了,因为 CPU 早已经跳到别处去执行了,第二、三条指令用不上了,所以 CPU 在遇到无条件转移指令 jmp 时,会清空流水线。

2024-06-02 19:15:09 913

原创 操作系统真象还原:完善MBR

关键字 section 并没有对程序中的地址产生任何影响,即在默认情况下,有没有 section 都一个样, section 中数据的地址依然是相对于整个文件的顺延,仅仅是在逻辑上让开发人员梳理程序之用。访问内存就要用“段:段内偏移”的形式,所以 cs 寄存器用来存代码段段基址, IP寄存器用来存储代码段段内偏移地址,同 cs 寄存器一样都是 16 位宽。数据段和代码段类似,只是这段区域中的内容不是指令,而是纯粹的数据,也就是说里面存储的是程序运行所需要的数据,属于指令的操作数。

2024-05-29 20:42:08 867

原创 操作系统真象还原:编写MBR主引导记录,让我们开始掌权

另外,因为 BIOS 进入 mbr 是通过 jmp 0: 7c00 来实现的,故此时 cs 己经变成 0,相当于“平坦模型”了,只不过此“平坦模型”大小只是 65536 字节,而不是 4GB。是编译器 NASM 预留的关键字,用来表示当前行和本 section 的地址,起到了标号的作用,它是 NASM 提供的,并不是 CPU 原生支持的。,它们的功能是告诉编译器:“嘿,老兄,你帮我把后面所有数据〈指令和变量 )的地址以 xxxx 为起始开始编吧”道 1 扇区的内容。,随后跳转到此地址,继续执行。

2024-05-29 20:36:24 380

原创 操作系统真象还原:部署工作环境

配置bochs的config文件(–prefix这后面填的是你想要安装bochs的目录),编译,安装。后面路径信息的前部分为自己的bochs安装路径)环境vmware + ubuntu 22.04。然后在输入框依次输入以下,输入一个,按一次回车。启动虚拟机查看效果(在bochs目录下)为即将要安装的bochs创建一个空目录。进入安装好bochs的目录。启动之后,输入c即可看见。

2024-05-29 20:34:59 186

原创 操作系统真象还原:一些你可能正感到迷惑的问题

平坦模型是相对于多段模型来说的,所以说平坦模型指的就是一个段。

2024-05-29 20:28:57 777

原创 c++ priority_queue用法

基本定义默认是使用大顶堆的,即队首总是最大的元素//储存int型数据//储存double型数据//储存string型数据priority_queue q;//储存结构体或者类less 即使用大顶堆greater 即是用小顶堆priority_queue 容器名//储存int型数据//储存double型数据//储存string型数据。

2024-05-07 18:55:07 269

原创 剑指offer面试题34:在二叉树中和为某一值的路径

满足就加入最终的容器中,然后注意这里要对加入的值进行一个删除,达到回溯的目的。容器中,然后当到达了叶子结点就判断容器中的值是否满足。就是用深度优先遍历,直接将路径上的值存在一个。路径总和等于给定目标和的路径。是指没有子节点的节点。

2024-03-12 10:53:58 263

原创 剑指offer面试题32:从上到下打印二叉树

每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾,接下来到队列的头部取出最早进入队列的节点,重复前面打印操作,直到队列中的元素全部打印完了。请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二次按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行一次类推。从上到下按照层打印二叉树,同一层的节点按照从左到右的顺序打印,每一层打印到一个容器里。从上到下打印出二叉树的每个节点,通一层的节点按照从左到右的顺序打印。如何广度优先遍历一幅有向图?

2024-03-11 15:57:48 402

原创 剑指offer面试题31:栈的压入、弹出序列

这个题目我们可以模拟整个入栈和出栈的操作,我们按照建立一个栈,按照pushed序列压入栈,并且判断是否与popped序列的首元素是否相同,如果相同就把这个元素从栈内弹出,并观察下一个popped元素判断与现在的栈元素首元素是否相同,如果是则循环操作,直到遇到与栈首元素不同或者栈为空时退出循环,继续在外边接着上面pushed序列压入剩余元素,等遍历完所有pushed元素后,如果两个序列相互匹配的话就栈内为空,否则就不为空。两个序列,每个序列中的。

2024-03-11 15:57:18 406

原创 剑指offer面试题28:对称的二叉树

1.中序遍历是左中右,所以初步想法是使用中序遍历把二叉树遍历一遍添加到容器中,这时候要把空着的节点以null的形式添加进容器,针对这种。2.书中的想法是使用迭代的思路,将比较左右两个节点,判断他们的情况一共有四种情况,都为空。树结构,然后把容器分为两段比较他们的值,从而得出是否是对称二叉树。,值一样则继续判断左节点的左子节点与右节点的右子节点情况。左节点的右子节点与右节点的左子节点情况。请设计一个函数判断一棵二叉树是否。,一个为空一个不为空。

2024-03-01 20:16:51 395

原创 剑指offer面试题22:链表中倒数第k个节点

2、我们还可以设置两个指针都同时指向头结点,第一个指针先走k-1步然后第二个指针开始跟第一个指针一起向后遍历,当第一个指针遍历到最后一个元素时,第二个指针就是指向的倒数第k个节点。1、求倒数第k个节点的值,我们归纳出当总共有n个节点时,倒数第k个节点就相当于从头开始的第n-k+1个节点。此方式要遍历两次链表第一次求出链表总数,第二次才能解出倒数第k个节点。实现一种算法,找出单向链表中倒数第 k 个节点。以下情况会导致代码崩溃,需要考虑。2.考察所写代码的鲁棒性。

2024-03-01 20:15:20 296

原创 剑指offer面试题16:数值的整数次方

同时这个代码可以优化,比如求一个数的16次方,上面的做法是从1到16依次来做,但是在这个过成中已经产生了8次方,我只要把这个8次方的数在两两相乘就可以得到16次方,这里需要考虑奇偶性。要权全面考虑输入的所有情况,输入的指数可能大于1,小于1或者是零和负数。不得使用库函数,同时不需要考虑大数问题。这里最容易出错的地方就是没有考虑到。

2024-01-10 20:07:19 330 1

原创 剑指offer面试题15:二进制中1的个数

针对这个问题,我们不右移输入的数字n。:这个方法思路是:先判断整数二进制中最右边一位是不是1;接着把输入的整数右移一位,此时原来处于从右边数起的第二位被转移到了最右边,在判断是不是1,这样每次移动一位,直到整数变为0为止。:在右移处理最左边的数字时:当位无符号数时,则用0填补最左边的n位;如果是有符号数时,则用数字的符号位填补最左边的n位,即填补n个1,请实现一个函数,输入一个整数,输出该数二进制表示中。所以上面的程序当输入的是一个负数例如。,则运算的最后结果为。

2024-01-09 17:17:30 366

原创 剑指offer面试题14:剪绳子

1.可以将这个问题看成为一个动态规划问题,我们现在求的是剪成为m段,得到的最大乘积。2.就是使用贪心算法,每一步裁剪的都是一个最优解,那么整体他就是一个最优,从局部最优推导出全局最优,当n>=5时,我们尽可能多地去剪长度为3的绳子;当剩下的绳子长度为4,就把绳子剪成两段长度为2的绳子,这样就可以得到最大乘积。例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。是顺序递增的,这意味着计算的顺序是自下而上的。的绳子,请把绳子剪成整数长的。),每段绳子的长度记为。

2024-01-08 19:50:35 365

原创 剑指offer面试题13:机器人的运动范围

这个题目类与之前的题目类似,就是起点是 [0, 0],判断当前点能够进入然后再遍历四周的点,每次移动到四周点时再将该点作为起点即可,也是一个回溯问题。的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于。例如,当k为18时,机器人能够进入方格。请问该机器人能够到达多少个格子?

2024-01-07 16:51:31 407

原创 剑指offer面试题12:矩阵中的路径

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。这是一个经典的回溯算法题目,可以使用回溯遍历出说有的结果,找到直到找到符合结果的路径。

2024-01-06 17:26:00 311

原创 剑指offer面试题10:斐波那契数列

但是使用递归的方式的话就会产生很多重复节点的运算就可以看成两边子树有很多重复的部分多计算了,这也就意味着计算量会随着n的增大而急剧增大,并且可能还有栈溢出的情况产生。先是简单情况,当只有一阶楼梯那么,只有一种方法,当有两阶楼梯那么就有2种方法。阶楼梯,第一次跳的时候就有两种选择:一是第一次就只跳1级,此时跳法数目等于后面剩下的。这个也可以用动态规划的思路:也就是现在的状态可以由前面的状态推导出来。可以使用递归的方式实现这个,也可以使用循环的方式实现它。因此,n级楼梯的不同跳法就是这两个的和为。

2024-01-05 14:33:05 347

原创 剑指offer面试题11:旋转数组的最小数字

就是利用二分查找的思路,我们用两个指针分别指向数组的第一个元素和最后一个元素,按照题目中的规则,第一个元素应该是大于或者等于最后一个元素。所以不管是移动左边界还是有边界,查找范围都会缩小到原来的一半,接下来在用更新之后的两个指针重复做新的一轮的查找。},这样的话就不能判断最小元素是在指针的左边还是右边的在这个区间内进行顺序搜索。,此时数组中最小元素应该位于该中间元素的右边,缩小寻找范围。,此时数组中最小元素应该位于该中间元素的左边,缩小寻找范围。,最小值就在该区间内。的数组,预先按照升序排列,经由。

2024-01-05 14:32:14 805

原创 剑指offer面试题9:用两个栈实现队列

剑指offer面试题9:用两个栈实现队列

2024-01-02 13:21:48 325

原创 剑指offer面试题8:二叉树的下一个节点

面试题8:二叉树的下一个节点

2024-01-01 18:33:31 301

原创 剑指offer面试题7:重建二叉树

剑指offer面试题7:重建二叉树

2023-12-30 18:12:58 375

原创 剑指offer面试题6:从尾到头打印链表

剑指offer面试题6:从尾到头打印链表

2023-12-29 15:22:47 406

原创 剑指offer面试题5:替换空格

剑指offer面试题5:替换空格

2023-12-28 13:28:31 351

原创 剑指offer面试题4:二维数组中的查找

剑指offer中二维数组中的查找

2023-12-22 13:29:29 313 1

原创 剑指offer面试题3:数组中重复的数字

剑指offer:中数组重复的数字题目

2023-12-22 13:26:39 328

原创 剑指offer:赋值运算符函数

赋值运算符题目

2023-12-21 21:44:55 323

原创 C++中优先级队列,大小根堆

在C++中优先级队列默认是使用的大根堆,如果要声明为小根堆要使用greater.实际应用中我们借助于数组vector来建堆。

2023-10-19 16:02:11 150

原创 Python中json数据格式转换

json数据格式转换

2022-10-16 11:18:39 2375 1

原创 Python学习、刷题(四)

join()函数;round函数;eval函数;hasattr函数

2022-10-16 11:16:11 162

原创 Python学习、刷题(三)

append和extend函数的区别;count()函数;replace()函数--字符串的替换;集合的常见操作:取集合的差集,消除两集合的差集;从字典中获取全部的key值;文件的读操作

2022-10-14 14:30:24 284

原创 Python学习、刷题(二)

列表解析;字典解析;print函数参数讲解;`try...except...finally...`的错误处理;python中的与或非;zip函数;

2022-10-12 21:37:43 525

空空如也

空空如也

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

TA关注的人

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