![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
真象还原-碎笔笔记
文章平均质量分 74
1710orange
凝听万物之音
展开
-
《真象还原》读书笔记——第十章 输入输出系统
多线程访问公共资源时出问题的原因是产生了竞争条件,也就是多个任务同时出现在自己的临界区。信号量的初值代表是信号资源的累积量,也就是剩余量,若初值为 1 的话,它的取值就只能为 0 和 1,这便称为。时(当然这也属于线程合作),为了保证结果正确,必然要用一套额外的机制来控制它们的工作步调,也就是使线程们。信号量就是个计数器,它的计数值是自然数,用来记录所积累信号的数量。操作来表示信号量的减、增,这两个都是荷兰语中的单词的缩写。唤醒已阻塞的线程是由别的线程,通常是锁的持有者来做的。原创 2024-03-02 17:46:19 · 885 阅读 · 0 评论 -
《真象还原》读书笔记——第九章 线程
操作系统把进程“执行过程”中所经历的不同阶段按状态归为几类,注意,强调的是“执行过程”,意为进程的状态描述的是进程中有关“动作”的执行流部分,即线程,而不包括静止的资源部分。初始情况下此栈在线程自己的内核栈中位置固定,在 PCB 所在页的最顶端,每次进入中断时就不一定了,如果进入中断时不涉及到特权级变化,它的位置就会在当前的 esp 之下,否则处理器会从 TSS 中获得新的esp 的值,然后该栈在新的 esp 之下,这是后话,有关 TSS 这方面的内容以后会介绍。任务片到期后从任务表中切换任务。原创 2024-03-02 01:21:33 · 1010 阅读 · 0 评论 -
《真象还原》读书笔记——第八章 内存管理系统 2(分配页内存)
【代码】《真象还原》读书笔记——第八章 内存管理系统 2(分配页内存)原创 2024-02-28 16:14:02 · 145 阅读 · 0 评论 -
《真象还原》读书笔记——第八章 内存管理系统(字符串操作、位图定义与实现)
一个字节有8位,所以位图的一个字节对应8个资源单位。假设是管理内存,每一位都将表示实际物理内存中的 4KB。也就是 1页。如果某位为0,就是可以分配,如果某位为1,就是不可分配。1/*遍历位图时候是以字节为单位,微操是位。所以此处的位图指针必须是单字节*//*初始化 btmp 位图*///向下取整用于数组索引。//取余用索引数组内的位/*先字节比较*///该字节无空位,去下一个字节++idx_byte;原创 2024-02-27 20:58:51 · 467 阅读 · 0 评论 -
《真象还原》读书笔记——第七章 中断处理
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 · 1061 阅读 · 0 评论 -
《真象还原》读书笔记——第六章 完善内核
完善内核,打印字符,打印字符串,打印十六进制数到屏幕上原创 2024-02-24 15:06:54 · 919 阅读 · 0 评论 -
《真象还原》读书笔记——第六章 完善内核(打印字符代码部分)
尤其要注意的是在链接的时候,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 · 283 阅读 · 0 评论 -
真象还原-碎笔笔记 : C与汇编混合编程 在64位机器上编译出32位可执行代码
很重要的一点:这时候的环境是64位的环境。所以在编译程序的时候要注意编译成32位的。原创 2023-02-18 00:08:53 · 271 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)
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 · 156 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(加载内核)(代码部分,更新)
kernel.bin编译,还是因为gcc 编译太大了,所以用clang编译。同时还要注意,编译环境可能是64位下,所以要指定编译后的代码为 32 位的。mbr.asm 没有什么改变。原创 2023-02-15 21:10:52 · 118 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级)
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 · 523 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(加载内核)(代码部分)
加载内核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 · 177 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(加载内核)
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 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(内存分页机制)(代码部分)
loader.asm多了页函数和页操作。boot.inc比之前多两部分。mbr.asm 和之前的一样。原创 2021-12-03 15:43:38 · 512 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(内存分页机制)
5.2 启用内存分页机制,畅游虚拟空间为了让每个进程都能用到4GB。5.2.1 内存为什么要分页为了让碎片内存也得以利用。为了让不连续的碎片内存也得以连续。办法:通过映射关系,将(连续的)线性地址映射到任意物理地址。5.2.2 一级页表分页是建立在分段的基础上。必须先分段,后分页。如果N,则按线性地址算如果Y,则按虚拟地址算分页机制的作用有两个方面将线性地址转换成物理地址(通过线性地址寻找到对应的物理地址)用大小相等的页代替大小不等的段逐字节对应的情况:结果:得不偿失原创 2021-12-03 00:34:23 · 283 阅读 · 0 评论 -
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(获取物理内存容量)
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 · 592 阅读 · 0 评论 -
《真象还原》读书笔记——第四章 保护模式入门(代码部分)
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 · 128 阅读 · 0 评论 -
《真象还原》读书笔记——第四章 保护模式入门
4.3 全局描述符表全局描述符表(GDT)。4.3.1 段描述符实模式下访问内存使用的是 段基址:偏移地址。在保护模式下为了安全性,给其中的段基址添加了很多的安全属性同时也增长了段基址长度,让总长度增加到了8字节。name长度功能备注段界限20bit描述段的拓展范围,界限粒度由G来决定 。CPU硬件会负责检测偏移地址是否越界段界限边界值 =(描述符中段界限+1)*(段界限的粒度大小:4KB或是1)-1,因为从零算,所以多一行,因为从零算,所以少一个G1bit原创 2021-11-15 00:48:12 · 329 阅读 · 0 评论 -
《真象还原》读书笔记——第三章 完善MBR(3.5 硬盘)
柱面-磁头-扇区磁道的编号从0 开始,相同编号的此道组成的管状区域就是柱面。盘面和磁头一一对应,所以用磁头号表示盘面,磁头编号从上到下从0开始。扇区编号与盘面和磁道不同,各磁道内的扇区都是以1为起始编号的,并且只限于本磁道内有效。所以各个磁道间的扇区编号都是相同的,下限都是0。主板是如何支持硬盘的硬盘控制器 与硬盘的关系就像是 显卡和显示器。一开始:将硬盘和硬盘控制器整合一起,这个接口被称为集成设备电路(IDE)。习惯将硬盘称为IDE硬盘。后期出现硬盘串口接口(SATA)。原创 2023-02-09 10:41:54 · 343 阅读 · 0 评论 -
《真象还原》读书笔记——第三章 完善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 · 541 阅读 · 2 评论 -
《真象还原》读书笔记——第二章 编写 MBR 主引导记录
因为是历史原因。BIOS将检测到了任何可用的磁盘,BIOS就将其第一个扇区加载到0x7c00。MBR的任务是加载某个程序(这个程序一般是内核加载器,很少有直接加载内核的)到指定位置,并将控制权交给它。之后MBR就没用了。原创 2023-01-27 18:09:31 · 739 阅读 · 0 评论 -
《真象还原》读书笔记——第一章 部署工作环境
环境:由于平时使用 windows 系统 所以 linux 环境 使用了 linux子系统。原创 2023-01-26 23:29:46 · 716 阅读 · 0 评论 -
bochs一般命令
info用于查看各种数据,tab表示页表所示为虚拟地址映射情况:原创 2021-12-03 16:13:23 · 418 阅读 · 0 评论 -
真象还原-碎笔笔记 : C与汇编混合编程_在64位机器上编译出32位可执行代码
运行环境为64位 debian;------- 64-> 64 ---------nasm -f elf -o xxx.o xxx.s;-f 为制定编译输出文件格式;elf为和gcc编译的目标文件链接;-o 是为生成的文件起别名;-s 是将错误添加到stdout中gcc -c yyy.c -o yyy.old -s -o xxx_yyy xxx.o yyy.o;---...原创 2020-04-15 00:28:36 · 266 阅读 · 0 评论