- 博客(82)
- 资源 (1)
- 收藏
- 关注
原创 《真象还原》读书笔记——第十章 输入输出系统
多线程访问公共资源时出问题的原因是产生了竞争条件,也就是多个任务同时出现在自己的临界区。信号量的初值代表是信号资源的累积量,也就是剩余量,若初值为 1 的话,它的取值就只能为 0 和 1,这便称为。时(当然这也属于线程合作),为了保证结果正确,必然要用一套额外的机制来控制它们的工作步调,也就是使线程们。信号量就是个计数器,它的计数值是自然数,用来记录所积累信号的数量。操作来表示信号量的减、增,这两个都是荷兰语中的单词的缩写。唤醒已阻塞的线程是由别的线程,通常是锁的持有者来做的。
2024-03-02 17:46:19
883
原创 《真象还原》读书笔记——第九章 线程
操作系统把进程“执行过程”中所经历的不同阶段按状态归为几类,注意,强调的是“执行过程”,意为进程的状态描述的是进程中有关“动作”的执行流部分,即线程,而不包括静止的资源部分。初始情况下此栈在线程自己的内核栈中位置固定,在 PCB 所在页的最顶端,每次进入中断时就不一定了,如果进入中断时不涉及到特权级变化,它的位置就会在当前的 esp 之下,否则处理器会从 TSS 中获得新的esp 的值,然后该栈在新的 esp 之下,这是后话,有关 TSS 这方面的内容以后会介绍。任务片到期后从任务表中切换任务。
2024-03-02 01:21:33
1009
原创 《真象还原》读书笔记——第八章 内存管理系统(字符串操作、位图定义与实现)
一个字节有8位,所以位图的一个字节对应8个资源单位。假设是管理内存,每一位都将表示实际物理内存中的 4KB。也就是 1页。如果某位为0,就是可以分配,如果某位为1,就是不可分配。1/*遍历位图时候是以字节为单位,微操是位。所以此处的位图指针必须是单字节*//*初始化 btmp 位图*///向下取整用于数组索引。//取余用索引数组内的位/*先字节比较*///该字节无空位,去下一个字节++idx_byte;
2024-02-27 20:58:51
465
原创 《真象还原》读书笔记——第七章 中断处理
8259A 有哪些功能呢?管理和控制可屏蔽中断,屏蔽外设中断.实行优先级判决CPU 提供中断向量号Intel 处理器可支持256个中断,但8259A只管理8个中断。所以把多个8259A级联起来,最多连9个,也就是最多64个中断。n片8259A通过级联的方式可支持7n+1个中断源。级联的时候只有一个主片master,其余都是从片slave。8259A在收到了中断后,对中断判优,将优先级高的中断转发给 CPU处理。IMR 寄存器中的位,为 1,则表示中断屏蔽,为 0,则表示中断放行。
2024-02-25 18:17:02
1052
原创 《真象还原》读书笔记——第六章 完善内核(打印字符代码部分)
尤其要注意的是在链接的时候,main.o 和 print.o 的顺序不能颠倒,因为 main.o 中调用了 print.o 中的实现,所以main.o要在前,print.o要在后。并且这两种情况的编译出的文件大小还不一样,运行时如果不遵守这种情况情况运行还会报错。当 main.o print.o 时候,编译大小为:2656 bytes。当 print.o main.o 时候,编译大小为:2660 bytes。由于我的环境是 Linux 64位子系统。
2024-02-24 11:16:25
281
原创 Linux 之 start_kernel() 下的 setup_arch()
end (->addr) 因为是 add+size,所以自然和 自己的起始地址 addr (->pbios->addr) 不相等。change_point [ 0 ]->pbios / change_point [ 1 ]->pbios 存放的是。最主要就是这个 for 结构,以及打头的 if — is addr — else — is end — 操作。很明显,这里的第二行是和第四行同属于一对,第一行和第三行是一对。is end 的操作是删除,我们看看 OS 是如何操作的。我们看一下排序后的结果。
2023-10-11 02:36:04
169
原创 在 Win11安装 Ubuntu20.04子系统 WSL2 到其他盘(此处为D盘,因为C盘空间实在不能放应用)
该篇文章记录了在 win11 中安装 Ubuntu20.04 子系统。先安装到 C盘 ,再通过打包的方式 安装到 D盘 上。因为是安装后写的文章,可能会有所疏漏,所以有任何问题可以在评论区留言。打开这三个:配置功能后记得重启。之后还可能要安装一个软件(下载速度有些慢):https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi接下来的全过程只有设置用户名和密码的时候以及设置 su 的密码时候在 Ubuntu 上操
2023-07-25 00:06:47
11666
22
转载 Windows 10 开启文件名大小写敏感功能(转载)
Windows 的文件系统的文件名,是大小写不敏感的,也就是你的文件名是 a.txt 或者 A.txt,在 Windows 中都是一视同仁,认为是同一个文件。下面宇润给大家介绍一个在 Windows 10 中开启文件名大小写敏感的功能,需要注意这个功能必须启用 WSL 才可使用!只要针对这个路径进行设置,这个路径下后续建立的所有文件和文件夹,都会是大小写敏感的了!使用 Git 时,相信大家也经常遇到文件名或者目录名大小写冲突的问题。好了,现在你的 Windows 文件系统,已经支持区分文件名大小写了!
2023-07-14 12:23:36
527
原创 真象还原-碎笔笔记 : C与汇编混合编程 在64位机器上编译出32位可执行代码
很重要的一点:这时候的环境是64位的环境。所以在编译程序的时候要注意编译成32位的。
2023-02-18 00:08:53
270
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)
Task State Segment 任务状态段。用于存储任务环境。104字节是TSS的最小尺寸,根据需要还可以接上个IO位图。当任务在特权级变化的时候,如果说使用同一个栈来容纳所有特权级的数据,就会导致栈中数据混乱、栈溢出的问题。所以TSS 中有3个栈。分别是:ss0,sp0ss1,sp1ss2,sp2TSS是处理器硬件原生的系统级数据结构。低特权到高特权级此时 3 可以到 2 1 0 ,2 可以到 1 0 ,1 可以到 0。这被称为“向内层转移”。高特权级到低特权级。
2023-02-16 01:37:59
154
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(加载内核)(代码部分,更新)
kernel.bin编译,还是因为gcc 编译太大了,所以用clang编译。同时还要注意,编译环境可能是64位下,所以要指定编译后的代码为 32 位的。mbr.asm 没有什么改变。
2023-02-15 21:10:52
118
原创 《真象还原》读书笔记——第三章 完善MBR(3.5 硬盘)
柱面-磁头-扇区磁道的编号从0 开始,相同编号的此道组成的管状区域就是柱面。盘面和磁头一一对应,所以用磁头号表示盘面,磁头编号从上到下从0开始。扇区编号与盘面和磁道不同,各磁道内的扇区都是以1为起始编号的,并且只限于本磁道内有效。所以各个磁道间的扇区编号都是相同的,下限都是0。主板是如何支持硬盘的硬盘控制器 与硬盘的关系就像是 显卡和显示器。一开始:将硬盘和硬盘控制器整合一起,这个接口被称为集成设备电路(IDE)。习惯将硬盘称为IDE硬盘。后期出现硬盘串口接口(SATA)。
2023-02-09 10:41:54
341
原创 《真象还原》读书笔记——第三章 完善MBR(3.1-3.4)
地址就相当于门牌号。编译器的工作就是给各个符号编址。偏移量:本质就是地址,每个变量的地址是前一个变量的地址+前一个变量的内存空间大小。1. mov ax, 0x0 说明 $$ 就是在段首。3. var 处被 0xd 替换,说明var 的地址为 0xd4. $ 也就是 label 该行代码的地址 0x85. jmp short 0x8 ,说明 label 标号也就是 标号处的地址。
2023-02-04 22:14:43
536
2
原创 《真象还原》读书笔记——第二章 编写 MBR 主引导记录
因为是历史原因。BIOS将检测到了任何可用的磁盘,BIOS就将其第一个扇区加载到0x7c00。MBR的任务是加载某个程序(这个程序一般是内核加载器,很少有直接加载内核的)到指定位置,并将控制权交给它。之后MBR就没用了。
2023-01-27 18:09:31
735
原创 Qt学习之 信号与槽
通过 connect, 将 按钮 与 A 信号绑定,在点击按钮时,激活信号,从而调用函数。定义了A Class 和 B Class,在A中自定义了信号,在B中定义了要被定义的函数。按钮按下,激活clicked信号 => 激活A,A信号 => 激活B,B函数。通过 connect,将 A 中的信号和 B 中被调用函数绑定。.........
2022-08-03 18:13:55
145
原创 汇编语言(第三版)第九章 转移指令的原理 笔记
修改IP或是同时修改CS和IP的指令就是转移指令。就是可以控制执行内存中某处代码的指令。转移指令对IP的修改范围不同。通过学习无条件转移jmp来俩理解cpu执行转移的基本原理。
2022-07-15 17:44:29
541
原创 汇编语言(第三版)第七章 更灵活的定位内存地址的方法 笔记
and 按位逻辑与,or 按位逻辑或7.2 关于ASCII码是一种编码方案,约定了用什么信息来表示现实对象。用61H表示’a’,用62H表示’b’.比方‘A’的ASCII码是41H,'a’的ASCII码是61H.之间相差了20H。通过比较发现,第五位如果是0就是大写,第五位为1就是小写。问题 7.17.6 用[bx+idata]的方式进行数组的处理7.7 SI 和 DIsi 和 di 在8086CPU中功能与 bx 相近。但不能将其分成两个8位寄存器使用。问题 7.3用更少的代码
2022-07-13 20:03:05
118
原创 汇编语言(第三版)第六章 包含多个段的程序 笔记
dw 就是定义字型数据。6.2 在代码段中使用栈检测点 6.16.3 将数据、代码、栈放入不同的段8086模式的限制 当数据 、栈、代码需要的空间超过64KB就不能放在一个段中了。定义多个段要注意的地方:(6)[1] 汇编语言:编写、调试具体多个段的程序......
2022-07-12 21:38:46
189
原创 汇编语言(第三版)第五章 [BX] 和 loop 指令 笔记
[0]表示偏移地址为0[bx]表示偏移地址在bx中mov ax,[bx] 表示 将一个长度为2字节的内存单元内容送入axmov al,[bx] 表示将一个长度为1字节的内存单元内容送入alloop表示循环使用描述性的符号"()"表示一个寄存器或一个内存单元中的内容。(ax)表示ax中的内容(al)表示al中的内容(20000H)表示内存20000H单元中的内容(()中的内存单元的地址为物理地址);((ds)*16+(bx)) 表示 (ds)*16+(bx) 地址单元的内容。(X) 表示的数据有
2022-07-12 09:07:46
1284
原创 汇编语言(第三版)第四章 第一个程序 笔记
以往的章节都是通过Debug来写指令。这一章节中将编写可执行文件。源程序中包含:XXX segment … XXX ends,这个表示是一个段的范围end,表示一个程序的结束。assume cs:XXX 表示将一个段寄存器与该段相关联。XXX是标号,作为该段的段地址。有一点要注意的是:这个图中,例如像有时候会疑惑为什么是 B8 23 01这个顺序。是因为按照或者图的顺序,右边的内存单元地址更高。原字为0123h ,01 比 23 高位,所以是23 01。因为没有Edit编辑器
2022-07-11 14:11:15
167
原创 汇编语言(第三版)第三章 寄存器(内存访问) 笔记
CPU中16位寄存器存储一个字:高8位在高字节,低8位在低字节。内存中,内存单元也是字节单元,所以一个内存单元存放一个字节也就是8bit。用此图举例。存放的数据4E20 h存放在地址0处。其中高位字节在地址1处,低位字节在地址0处。存放的数据0012 h是一样的。0012h存放在地址2处,高字节为00h,低字节为12h。将起始位置为N的字单元简称为N地址字单元。字单元:存放一个字型数据,就按照上述例子存储。(1) 20H; 地址单元应该是一个字节。(2) 4E20H,字型数据应该是一个字单元。
2022-07-10 21:57:52
1030
原创 汇编语言(第三版)第二章 寄存器 笔记
AX,BX,CX,DXSI,DISS, SP, BPIP,CSDSESPSWAX,BX,CX,DX8086CPU所有寄存器都是16 bit 。为兼容上一代CPU的8bit寄存器,这四个寄存器可以拆开为8个8bit的寄存器。例如:8086CPU的两种尺寸:汇编指令或者一个寄存器的名称并不区分大小写。add ax, bx ;ax=8226h bx=8226h因为 ax = ax+bx = (8226 + 8226)h = (1044c )h又因为 ax为一个字,2个字节,16位。将第17
2022-07-05 00:03:40
1920
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级)
5.4 特权级深入浅出防止程序"越轨操作",于是给予其对应的权力。5.4.1 特权级那点事实际上就是检查访问者的特权级和受访者的特权级是否匹配。特权级:0,1,2,3。数越小,权力越大。0是内核级特权直接控制硬件。1,2一般是虚拟机、驱动程序等系统服务。3不用说了,就是用户程序。5.4.2 TSS(任务状态段)简介TSS (Task State Segment)任务状态段是处理器硬件原生系统级数据结构最小(不加IO位图)104字节。三个栈指针是为了不同特权级不同栈准备的。两
2021-12-17 22:58:01
521
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(加载内核)
5.3 加载内核5.3.1 用C语言写内核首先是编译:在64位环境中编译32位文件。第一个C语言代码://main.cint main(){ while(1); return 0;}编译://加上-m32是为了在64位的情况下编译出32位的main.ogcc -m32 -c -o main.o main.cfile查看main.o:$ file main.omain.o: ELF 32-bit LSB relocatable, Intel 80386, version 1
2021-12-16 20:09:49
692
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(加载内核)(代码部分)
加载内核boot.inc该文件没有变化;---loader 和 kernel ---LOADER_BASE_ADDR equ 0x900LOADER_START_SECTOR equ 0x2LOADER_STACK_TOP equ LOADER_BASE_ADDR;--- gdt描述符属性 --- DESC_G_4K equ 100000000000000000000000bDESC_D_32 equ 1000000000000
2021-12-16 20:02:33
174
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(内存分页机制)(代码部分)
loader.asm多了页函数和页操作。boot.inc比之前多两部分。mbr.asm 和之前的一样。
2021-12-03 15:43:38
508
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(内存分页机制)
5.2 启用内存分页机制,畅游虚拟空间为了让每个进程都能用到4GB。5.2.1 内存为什么要分页为了让碎片内存也得以利用。为了让不连续的碎片内存也得以连续。办法:通过映射关系,将(连续的)线性地址映射到任意物理地址。5.2.2 一级页表分页是建立在分段的基础上。必须先分段,后分页。如果N,则按线性地址算如果Y,则按虚拟地址算分页机制的作用有两个方面将线性地址转换成物理地址(通过线性地址寻找到对应的物理地址)用大小相等的页代替大小不等的段逐字节对应的情况:结果:得不偿失
2021-12-03 00:34:23
282
原创 《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(获取物理内存容量)
5.1 获取物理内存容量5.1.1 学习linux获取内存的方法BIOS中断0x15的3个子功能:BIOS中断是实模式下的用法,不能在保护模式下使用。若全部失败了就只好让机器挂起了。运行成功再启动保护模式。EAX=0xE820:遍历主机上全部内存AX=0xE801:分别检测出64MB和16MB~4GB的内存,最大支持4GBAH=0x88:最多检测出64MB内存,实际内存超过该容量也按64MB返回5.1.2 利用BIOS中断0x15子功能0xe820获取内存返回地址消息,通过地址范围描述符
2021-12-01 22:35:11
590
原创 《真象还原》读书笔记——第四章 保护模式入门(代码部分)
4.3.5 让我们进入保护模式打开A20加载GDT将cr0的PE位置置为1三个文件代码1. boot.inc;---loader 和 kernel ---LOADER_BASE_ADDR equ 0x900LOADER_START_SECTOR equ 0x2;---gdt描述符属性---DESC_G_4K equ 10000000_00000000_00000000bDESC_D_32 equ 1000000_00000000_0
2021-11-16 01:05:09
125
原创 《真象还原》读书笔记——第四章 保护模式入门
4.3 全局描述符表全局描述符表(GDT)。4.3.1 段描述符实模式下访问内存使用的是 段基址:偏移地址。在保护模式下为了安全性,给其中的段基址添加了很多的安全属性同时也增长了段基址长度,让总长度增加到了8字节。name长度功能备注段界限20bit描述段的拓展范围,界限粒度由G来决定 。CPU硬件会负责检测偏移地址是否越界段界限边界值 =(描述符中段界限+1)*(段界限的粒度大小:4KB或是1)-1,因为从零算,所以多一行,因为从零算,所以少一个G1bit
2021-11-15 00:48:12
328
《汇编语言(第三版) 作者:王爽》学习过程中使用的工具
2022-07-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人