- 博客(141)
- 收藏
- 关注
原创 【操作系统】计算机硬件软件知识汇总
以下解析使用CentOS 6.1版本的操作系统进行讲解,采用Sysinit模式的进行初始化,如果你的操作系统没有类似/etc/rc.d这些目录,那么你的操作系统可能是采用Systemd模式进行初始化,虽然模式不同,但是要实现的基本功能都是差不多的。
2023-10-12 16:56:24 198
原创 【操作系统】段描述符、全局描述符表和选择子
与实模式不同的是,保护模式下内存段不再是简单地用段寄存器加载一下段基址然后乘以16位结合偏移地址得出实际要访问的内存地址,而是通过选择子在全局描述符表中找到对应的段描述符,CPU从段描述符中提取段基址,再与偏移地址结合得出实际要访问的内存地址。
2024-04-09 19:00:00 1266
原创 【算法】不懂数学原理也能看得懂的KMP算法
举个例子,excel表格大家都用过吧,在表格内按下“Ctrl+F”可以弹出“查找和替换”功能,输入我们想要查找的关键字,系统就会帮我们定位到具体的位置,没有找到就上报具体的错误信息,KMP算法的作用就和excel表格的“查找”功能一样,帮你从一堆字符串中找到你想要的字符。 当然你也可以参考力扣的这题: 我们按照以下的例子进行说明: 我们要在文本串中找到模式串所在的位置,需要用到经过next函数计算出来的next数组: 至于这个数组是怎么算出来的先暂时别
2024-02-01 19:00:00 657
原创 【操作系统】调用硬盘并且实现MBR与Loader的过渡——原理篇
前文(【操作系统】优化MBR程序:让MBR调用显存吧)中的MBR程序仅有512字节大小,完全不能将内核成功加载到内存并且运行,所以我们需要在另一个程序中完成初始化环境以及加载内核的任务,这个程序称之为Loader加载器,本文我们就将实现MBR与Loader的交接部分,从硬盘上把loader加载到内存,并且将接力棒交付给它。再次之前,我们需要明白怎么调用硬盘。【计算机组成原理】磁盘的基本结构,不在此赘述。),硬盘控制器属于IO端口,端口是位于IO控制器上的寄存器。
2024-01-27 10:58:13 571
原创 【操作系统】优化MBR程序:让MBR调用显存吧
显卡用于连接CPU和显示器,我们调用显示器时,其实就是利用显卡提供的IO接口间接地对显示器进行操作,所以显卡也称之为显示适配器。【操作系统】BIOS与MBR之间的过渡实践),使我们的程序通过直接操作显卡来输出,显卡给我们的输入接口有显存和端口,而本文中主要用到显存。【操作系统】BIOS开机自检)就可以知道,内存布局中关于显存地址分布如下:显卡支持三种模式:文本模式、黑白图形模式以及彩色图形模式,本文中我们将使用文本模式,以实现类似Linux控制台风格的字符界面。
2024-01-11 21:00:00 1834
原创 【操作系统】BIOS与MBR之间的过渡实践
【操作系统】MBR主引导目录结构以及作用,我们了解到BIOS在检测完内存、显卡,把硬盘等一系列外设简单检测之后,下一步将和主引导程序MBR进行交接,将主控权交付给下一位嘉宾,至此BIOS的任务就完成了继续睡去,本篇文章我们来开始编写一个简单MBR程序,并且让其完成从BIOS过渡到MBR这个过程,至于MBR的本质工作(启动引导程序等)我们将在之后逐步完善其内容。
2024-01-09 19:00:00 887
原创 【操作系统】CPU的保护模式与实模式的区别
内存寻址空间扩展到4G之后,原来的寻址方式已经不能满足需求了,按照原来的寻址方式,段基址左移4位与段内偏移地址相加就是实际的物理地址,而在4G的地址空间里,左移4位已经不能满足了,需要左移16位(也就是2的16次方),才能访问到32位的地址空间,这显然是不切实际的。通过以上代码可以看到,第二行和第五行的机器码分别为B83412和B834120000,这两者都是通用的操作码B8,不同模式下都是同样的操作码,可见寻址方式和操作数类型都是相同的,不同的是一个是16位寄存器ax,一个是32位寄存器eax。
2023-12-11 21:00:00 1104
原创 【操作系统】Bochs安装和配置
Bochs是使用C++编写的高度可移植开源IA-32(X86)PC模拟器,能在大多数流行的平台上运行。它包括模拟Intel x86 CPU、常见I/O设备和自定义BIOS。Bochs可以被编译以模拟许多不同的x86 CPU,从386早期到最新的x86-64英特尔和AMD处理器甚至可能还没有进入市场。Bochs能跑仿真中的大多数操作系统(例如DOS),Linux或Windows。
2023-11-23 20:00:00 1884
原创 【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因
这个结果也只能到达17位,还不够16位(两个n位的数无论多大,其相加的结果也不会超过n+1位,原因很简单,因为即使n位的数能表示的最大数相加,也只是相当于乘以2,数值上与往左移动了1位而已),虽说直接使用立即数手动指定20位的地址也可以,但那是利用了程序员自身的软件办法来补了硬件的这个坑,但是作为一个严谨的CPU硬件,如果寄存器确实不支持1MB的寻址空间,那就写不支持就好,但是既然写了寄存器寻址支持1MB的寻址宽度,那么就得自圆其说。什么用都没有,直接扔掉,也就相当于把地址对1MB取模了。
2023-11-07 21:00:00 362
原创 【计算机组成原理】CPU的工作原理
顺序执行时,CPU修改PC的过程就是简单地加1,转移执行时,后续指令的地址会根据当前指令的地址加上转移的偏移量得到,或者根据转移指令给出的直接转移地址得出。比如进行减法运算时,会先将被减数去除暂存在AC中,再从内存中取出减数,然后通AC的被减数相减,所得到的结果送至AC中,运算结果是放在累加器中的。,这个程序计数器PC就像个悬赏榜一样,告诉CPU任务发起人在哪里,让CPU去指定的地址找任务发起人,执行相应的指令。,识别该指令规定的操作,向操作控制器发出具体的控制信号,控制各部件工作,完成所需的功能。
2023-11-02 19:00:00 244
原创 【C语言】五分钟学会一个小游戏-4399的吉普赛读心术
在4399平台上面有一个游戏叫吉普赛神秘读心术,大概长成这个样子:这是我小时候的童年震撼,懵懂无知的我每次都觉得特别厉害,不知道为什么每次都能读到我的图案出来。游戏的规则也很简单:在99以内的数字里面任意挑选一个数字,比如23,那么就将两个数字相加2+3=5,再将这个数和之前的数字相减23-5=18,最后找到数字18的图案,点击水晶球,水晶球就会显示出来你心里的那个图案。
2023-10-26 07:00:00 231
原创 【银河麒麟系统】备份还原工具显示“备份分区空间不足,请删除过期或者不需要的备份”解决方法
两个分区重新挂载完成后,重新打开备份还原工具即可。该方法在重启后会恢复原来的挂载分区,但是文件/etc/.bootinfo里的UUID还是自己修改的那个UUID,需要手动更改回来。该问题的处理思路与之前写过的一篇文章:XXXXXX类似,故本次也参考了那篇文章的基本思路,再加上银河麒麟V10系统的一些特有性适配步骤,可以解决该问题。PS:如果打开备份还原工具打开失败,则可能是因为在安装操作系统时没有选择创建备份分区。
2023-10-24 07:00:00 2599 1
原创 【操作系统】MBR主引导目录结构以及作用
一.BIOS和MBR的交接仪式当BIOS检测完内存、显卡,把硬盘等外设加载进来后,便开始在内存0X00~0X3FF处建立起数据结构、中断向量表,并且填写中断例程。完成这一系列的操作后便开始寻找硬盘(如果硬盘不止一个的话,则会通过遍历的方式一个个地找到每个硬盘),在每个能找到的硬盘的第0盘0磁道第1扇区里面,看看此扇区最后两个字节是否为0X55和0XAA。
2023-10-20 16:58:14 313
原创 【Linux】如何判断RS-232串口是否能正常使用
使用RS-232协议的串口引脚一般如图下所示为了让串口能够接收到自己发出的串口数据,需要将输出端和输入端(RXD和TXD)进行短接操作:短接完成后,才能实现自发自收的功能(走其他协议的串口清参考对应的短接方式),网上大部分的文章都是直接就往端口发数据,导致很多人发了数据没有收到以为是串口坏了,浪费很多时间。
2023-10-19 16:03:38 1969
原创 【操作系统】BIOS开机自检
可以看到CS:IP寄存器来到了0XFFFF0这个地址,而这个地址里面保存了一个指令,跳转到0XFE05B这个位置,而这个地方才是BIOS真正的代码开始的地方,检测内存、显卡等外设信息,初始化硬件,建立向量表等等,完成这些工作后,BIOS将控制权交给下一位嘉宾,也就是MBR。CPU可以通过地址访问到数据,是由地址总线通过映射完成的,地址总线把某个ROM存储器绑定了这个地址,或者把某个外设的内存绑定了那个地址,等到CPU要使用时就可以直接访问地址,而不需要知道究竟数据放在哪个物理存储单元。
2023-10-12 16:54:46 874
原创 解决方案:fatal error: openssl/bio.h: 没有那个文件或目录
出现报错如下: 出现该错误的原因有两个: 使用指令安装openssl: 我的是已经安装完成了,所以再把libssl-dev的库也给装上就OK: 如果在安装libssl-dev时出现“E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。”的错误: 则说明libssl-dev版本过高,无法支持低版本的openssl,需要讲libssl-dev库进行降级处理,安装aptitude包管理器:
2023-08-22 16:18:17 2392
原创 【数据库管理】十分钟了解啥是三级封锁协议、X锁和S锁
有了这两把锁之后,新的问题又出现了:怎么知道什么情况下要用什么锁?什么时候要用锁?什么时候不用?上锁之后什么时候解锁最合适?……而神奇的“三级封锁协议”,就是为了告诉你什么情况下用什么锁可以解决什么问题,只要事务们都按照协议的规则去做,就可以避免诸如更新丢失、读取脏数据或者不可重复读取数据等问题。锁本身只限制其他事务对数据的加锁权限,而限制事务对数据的读写操作,是通过锁+封锁协议来实现的。
2023-06-26 16:25:58 3650 1
原创 【软件设计】模块设计耦合的七种类型
在结构化分析与模块设计方法中,模块化是一个很重要的概念,它是将一个待开发的软件分解成为若干个小的模块,每个模块可以独立地开发、测试。使得复杂问题的“分而治之”,令程序的结构清晰、易于测试与修改。而模块的独立性通常要求每个模块能尽可能完成一个相对独立的子功能,并且与其他模块少点联系,软件设计上用耦合(模块之间联系的紧密程度)和内聚(模块内部各元素之间联系的紧密程度)两个标准来衡量,所以设计的目标就是高内聚、低耦合。
2023-06-15 18:00:02 1100
原创 【计算机组成】Cache与CPU的直接映射、全相联映射与组相联映射
Cache的地址映射中,会以Cache的容量为标准将内存分成相同大小的块(页或者区),根据映射方法的不同,地址的表达方式也不同,常见的映射方式分为:直接映射、全相联映射和组相联映射。
2023-06-05 16:39:08 3068 5
原创 【计算机组成】三分钟了解顺序存储、直接存储、随机存储和相联存储的区别
我知道这个数据存在哪个地址中,现在我把这个地址给你,麻烦你帮我找出我要的数据来:我要找一个数据,数据里其中一段是“XXXXXXX”,麻烦你帮我匹配下有哪些数据包含了这一段的,给我找出来。
2023-05-22 16:48:24 2622
原创 【Unity项目实战】手把手教学:飞翔的小鸟(7)障碍对象池
我们已经生成了一个障碍物柱子,并且使得小鸟在越过柱子之后自动获得一分,接下来将继续讲解障碍物的随机生成。
2023-05-13 18:39:21 821 2
原创 【Unity项目实战】手把手教学:飞翔的小鸟(6)添加障碍
我们已经让主角在停止不动的情况下,移动背景图,使得主角小鸟像是自己往前移动了一样,接下来我们将继续往下,讲解如何添加障碍。
2023-05-08 19:31:52 1370 1
原创 【数据结构】尾插法链表初始化、新增和删除指定位置的数据
使用尾插法进行链表初始化的一个好处是,使得链表遍历时按照的原则进行输出。使用尾插法,我们需要初始化三个兄弟,分别是L、r和p(当然也不一定要这个名字,你们可以随便起三个),第一个是L头结点,该节点不存储数据,仅作为,如图下所示:其中指针“L”的作用是,便于后面遍历、添加等操作时迷路了可以回来。如此同时,我们还需要有一个指针“r”用来如何理解“指向当前所在的结点”?比如在遍历整个链表时,如果遍历到了第四个结点,那么指针“r”就会指向第四个,就是这个意思。最后是指针“p”,该指针只要。
2023-03-28 17:43:19 260
原创 【MFC】两个ListBox控件数据交互
界面如图下所示: 候选数据列表的ID为: 已选数据列表的ID为: 可以使用以下代码往框中添加数据: 显示效果如下: 如果有多个数据,可以使用以下方法: 显示效果如下: 如果想让数据按照自己的顺序排序,可以在控件处将自动排序关闭: 实现代码如下: 效果如下: 可以看到“已选数据列表”中的数据是乱的,需要把该控件的自动排序也关掉: 关闭后数
2023-03-16 14:46:20 568
原创 【算法】关于双指针的奇技淫巧(一):对撞指针
说明两数之和应该还要往上增加,而此时尾指针所指向的数已经是最大了,所以需要让头指针往右移动才可以使得两数之和往上增加,继而推断出头指针所指向的“2” 与尾指针指向的“6、10、12、15”都不符合,因为“15”已经是最大都不符合目标数,其他比它小的数就更不用说。10 + 15 = 25 > 22,只要看明白上面说的原理,这里理解起来也很简单,就是。判断一下当前数值相加是否符合目标数,2 + 15 = 17 > 9 ,两数之和比目标数要大,所以要让两数之和减少,因为头指针所指向的数已经是最小的了。
2023-01-03 09:06:55 597
原创 【Unity项目实战】手把手教学:飞翔的小鸟(5)背景滚动
我们已经使得主角小鸟接触到地面后跳转到Game Over状态,接下来我们将继续往下,讲解得分机制。
2022-12-14 14:55:23 864 2
原创 【LINUX】使用Service服务开机自启动脚本或者指令
我们在路径/etc/systemd/system下新建一个以.service为后缀的文件名,以远程连接服务ssh.service为例,格式如下:Service文件主要由三个部分组成:[Unit]、[Service]以及[Install]。
2022-11-24 14:31:03 3217 1
原创 【C++】加了<string.h>还是报“strlen:找不到标识符”的错误
预编译头一般包含了基本程序引用库、客户自定义库等,其中基本程序引用库就包含了常用的与C标准库对应的头文件,如标准输入头文件stdio.h、字符串头文件string.h等文件。问题出自于预编译头里面已经包含了一些基本的头文件,而且在编译前已经把这些库进行了预编译处理,我们再手动添加这些头文件就很容易被略过。把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件。的为目的的预编译头:#include “stdafx.h”。出现问题的原因是使用了编译软件。
2022-11-11 12:17:30 3932
原创 【Linux】ssh: connect to host localhost port 22: No route to host
ssh: connect to host localhost port 22: No route to host
2022-10-28 11:53:52 6029
原创 【Unity项目实战】手把手教学:飞翔的小鸟(4)文本添加
我们已经把小鸟的飞翔、死亡动画通过触发器与常态画面连接起来,下一步就是通过对小鸟进行脚本编写以及编写,使得小鸟能够根据我们鼠标点击而飞行起来。
2022-10-15 13:10:54 2411 5
原创 【linux】把home目录挂载到其他分区(数据盘/data等)下
在安装系统时由于没有合理地分配,导致home主目录的内存分配过小,久而久之内存逐渐不是很够用,这时候需要把home目录进行扩容处理,以下有一个方法,就是把home通过挂载到其他分区的方法达到扩容的地步。
2022-09-25 16:13:11 6688
原创 【Linux】编写COM口和USB口的规则文件(.rules)
当外接存储设备(如:U盘、机械硬盘等)时,由于路径/dev下并没有存储新设备的设备节点、规则文件等,udev会给新的存储设备按照内核的分配规则分配设备节点诸如:/dev/sda(如U盘)、/dev/sdb(如机械硬盘)等临时设备节点,这些临时设备节点是按照外接设备的插入顺序决定的,也就是说下次如果是先插机械硬盘、再插U盘就可能会分配临时名字:/dev/sdb(如U盘)、/dev/sda(如机械硬盘),又或者是其他诸如/dev/sdc、/dev/sda2等等。
2022-09-20 14:29:35 1958
原创 【数据结构】哈夫曼编码与最优二叉树(哈夫曼树)
在进行大容量存储、图像压缩等数据交换的时候,如果文件过大,恰好WIFI又不怎么快,你是不是会觉得十分暴躁呀?比如有这样一串数据需要传输:上面就有100位二进制数,这还只是数字,如果要传输英文字母、中文等需要更多的二进制位数:这种完完整整原原本本地传输数据的方法叫固定长度压缩算法。但是如果通过哈夫曼编码之后,就会变成数据+转换表(也就是非固定可变长度压缩算法,):只需要10+9+32= 51位!!节省了将近49位的数据!!...
2022-08-30 16:39:42 1171 1
规则文件编写程序(C++)
2022-09-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人