
打造简单OS
一步一步打造简单操作系统
jadeshu
这个作者很懒,什么都没留下…
展开
-
jmp far
jmp 0x20:0x0123分析步骤:1.段选择子拆分 0X20 = B100000 ===>TI = 0;RPL=0;INDEX = 42.查DGT表得到段描述符 TI = 0 ,所以查找GDT表 INDEX=4 ,可找到对应的段描述符 四种情况可以跳转:代码段、调用门、TSS任务段、任务门3.权限检查 如果是非一致性代码段,要CPL==DPL并且RPL <= DPL 如果是一致性代码段(即代码共享),要求CPL>=DPL...原创 2021-01-01 22:22:47 · 613 阅读 · 0 评论 -
GRUB软盘和硬盘在虚拟机中启动系统内核
平台选择:1.linux上 需要安装bochs工具,gcc,nasm1.1目录结构 Demo | +--src +--fd +--hd1.2运行 不使用bootloader,直接使用grub去加载系统内核。1.3Bochs配置megs: 32romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000...原创 2020-11-27 18:07:56 · 855 阅读 · 0 评论 -
打造简单OS-总目录
1-汇编写入引导区,虚拟机启动步骤(了解即可)2-开机BIOS初始化与MBR操作系统引导详解(了解即可)3-MBR引导区转移加载简单程序(突破512限制)(了解即可)4-loader硬盘加载和C++写入文件(重点)5-进入保护模式6-内存分页7-加载内核8-中断9-内存管理10-线程11-进程12-文件系统管理个人用的记录CPU...原创 2019-06-23 19:49:29 · 533 阅读 · 0 评论 -
物理、线性、虚拟、逻辑、有效地址
1、物理地址:就是物理内存真正的地址,相当于内存中的每个存储单元的门牌号,具有唯一性。CPU最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站。 在实模式下,{段基址+段内偏移地址}经过段部件的处理,直接输出的就是物理地址,CPU可以直接用此地址访问内存。2、线性地址: 在保护模式下:{段基址+段内偏移地址} 称为线性地址,不过此时段基址已经不是真正的地址,...原创 2019-04-04 20:12:04 · 2143 阅读 · 2 评论 -
MBR结构
1.MBR结构图: 表1 64 Byte 就只能划分 4 个主分区。每个分区的 16 字节的规划如下表 2 所示。表 2 分区表内容 存储字节 数据内容及含义 第 1 字节 引导标志 第 2 字节 本分区的起始磁道号 第 3 字节 本分区的起始扇区号 第 4 字节 本分区的起始柱面号 第 5 字节 分区类型,可以识别...原创 2020-08-30 01:56:00 · 806 阅读 · 0 评论 -
(1)打造简单OS-汇编写入引导区,虚拟机启动步骤
首先需要您在网上下载NASM编译器,可以将汇编编译为二进制文件1.写一段汇编代码在屏幕上打印一段字符可以运行的!并进行nasm为二进制文件,如下"test.asm" 至于为什么这么做的问题,您可以观看后面章节,现在只要按部就班的实际操作就好,运行起来才有直观感受,理论先放后面! 该段汇编主要是向显卡循环显示一个一个字符,最后取值为0就跳转fin执行HLT让CPU睡眠,死循环!...原创 2018-12-17 00:30:46 · 1136 阅读 · 0 评论 -
bochs调试命令
Bochs几条基本指令:通过物理地址查看内存时,可以不加参数'/nuf':其中n指定显示的单元数,默认是1;u 指定每个显示单元的大小(b表示字节、h表示字(2字节)、w表示双字(4字节)),默认是w;f 指定显示格式(x 十六进制、d 有符号十进制、u 无符号十进制、o 八进制、t 二进制、c 字符),默认是x1、指令断点1.1、设置断点1.1.1、设置在物理地...转载 2019-06-23 19:09:02 · 968 阅读 · 0 评论 -
bochs模拟器创建映像文件 、写入文件并启动
安装 bochs,dd for windows,nasm,并将安装目录加入到环境变量中。我用的bochs版本是2.6.81.用 bochs 中 bximage.exe 创建新的 img 文件2.编写汇编代码并编译成二进制文件test.asm汇编文本文件org 0x7C00 ;主引导记录的内存地址jmp entryentry: mov ax, 0 mo...原创 2019-04-05 19:51:04 · 4633 阅读 · 0 评论 -
CHS和LBA逻辑块地址
LBA简介磁盘读取发展IO操作读取硬盘的三种方式: chs方式 :小于8G (8064MB) LBA28方式:小于137GB LBA48方式:小于144,000,000 GB LBA方式访问使用了data寄存器,LBA寄存器(总共3个),device寄存器,command寄存器来完成的。LBA28和LBA48方式:LBA28方式使用28位来描述一个扇区地...转载 2019-04-07 17:46:22 · 9902 阅读 · 3 评论 -
(2)打造简单OS-开机BIOS初始化与MBR操作系统引导详解
================大概了解即可===============1、BIOS的工作: 我们的计算机在开机之前,它是一个纯硬件的机器,但是从按下开机按钮的那一刻起,ROM上的固化程序就开始为操作系统这个重要的软件进行初始化工作,初始化工作完成以后,将操作系统内核加载到内存中,操作系统就会帮助我们管理各种硬件资源,带给了用户良好的体验。我们普通用户通常都不关心,在...转载 2019-03-29 00:32:29 · 2322 阅读 · 0 评论 -
(3)打造简单OS-MBR引导区转移加载简单程序(突破512限制)
1、总结和开机流程 在第一节<(1)汇编写入引导区,虚拟机启动步骤>中讲解到一个简单屏幕显示一川字符串,第二节讲到BIOS启动过程! 第一节中基本原理就是将那个汇编代码用nasm汇编器进行汇编成二进制,然后把这二进制文件写入模拟的软盘system.img[磁盘]的第0面0磁道第1扇区中!然后虚拟机加载此映射文件。 ...原创 2019-03-29 00:34:30 · 1437 阅读 · 0 评论 -
(4)打造简单OS-loader硬盘加载和C++写入文件
0.简要说明: 我们完全可以使用bochs创建映像文件,如https://blog.youkuaiyun.com/jadeshu/article/details/89046838 ,那么为什么还去用C++去模拟文件呢,主要更深刻的理解和自己动手,比直接创建的文件映像更深刻,了解的内容也更多!!! 当然如果想省事的话,您也可以直接用bochs直接创建映射软盘和硬盘文件,然后...原创 2019-06-23 16:03:43 · 893 阅读 · 0 评论 -
(4.1)打造简单OS-小实验[图形显示]
主要是实现<简单打造OS>第四小节说到的一个图形界面的实验项目1.mbrboot.inc;------------- loader和kernel ----------LOADER_BASE_ADDR equ 0x900 LOADER_STACK_TOP equ LOADER_BASE_ADDRLOADER_START_SECTOR equ 0x2KER...原创 2019-11-15 21:47:39 · 624 阅读 · 0 评论 -
传统PC机I/O位址空间范围
空间范围是0x000--0x3FF,有1024个I/O端口位址可供使用! 使用EISA或PCI等汇流排结构的现代PC机,有64KB的I/O位址空间可供使用。在普通Linux系统下透过查看/proc/ioports(对应的I/O口),可以得到相关控制器或设置使用的I/O位址范围!/proc/ioports0000-0cf7 : PCI Bus 0000:00 000...原创 2019-07-15 01:32:25 · 2479 阅读 · 0 评论 -
条件转移指令
原创 2019-04-05 21:49:50 · 2733 阅读 · 0 评论 -
系统指令
系统指令用于处理系统级功能,如加载系统寄存器、管理中断等。大多数系统指令只能由处于特权级0的操作系统软件执行,其余一些指令可以在任何特权级上执行,因此应用程序也能使用。下表中列出了我们将用到的一些系统指令。其中还指出了它们是否受到保护。 常用系统指令列表 指令...原创 2019-07-01 20:29:17 · 829 阅读 · 0 评论 -
(5)打造简单OS-实模式与进入保护模式
1.简介: 8086实模式 80286才出现保护模式,保护模式下的段寄存器存储的是段选择子,不在是8086实模式的段基址了! [扩展知识]:可以看了后面知识在回头看一下这段. [8086各个段寄存器和通用寄存器都是16位,地址总线20位,采用段式段+偏移可访问物理内存1M] [80286...原创 2019-07-01 03:23:48 · 1676 阅读 · 0 评论 -
OS创建页目录和页
;开始创建页目录项(PDE).create_pde: ; 创建Page Directory Entry mov eax, PAGE_DIR_TABLE_POS ; PAGE_DIR_TABLE_POS = 0x100000 add eax, 0x1000 ; 此时eax为第一个页表的位置及属性 mov ebx, eax ; ...原创 2019-04-13 16:02:24 · 511 阅读 · 3 评论 -
实模式下的内存布局
作者:北极链接:https://www.zhihu.com/question/269649445/answer/351632444来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。显存基地址虽然是人为确定的,但真要追究原因的话,还是可以找到一些原因的。首先,16位时代8086的寻址范围是0000:0000~FFFF:000F,最早划给RAM...原创 2019-04-05 01:46:57 · 2856 阅读 · 0 评论 -
内存管理分段和分页机制
---其中:(*)分段机制(物理地址/线性地址 = 段基址 + 偏移量) 保护模式下未开启分页(段基址+偏移量)直接对应物理地址空间; 保护模式下开启分页(段基址+偏移量)则是对应线性地址空间的地址。X86 CPU中逻辑地址到线性地址映射过程:(*)分页机制(物理地址=页表项内的地址+偏移量)一级页表 ...原创 2019-09-03 18:29:22 · 477 阅读 · 0 评论 -
页目录项和页表项低12位意义
页目录项和页表项上图就是页目录项和页表项的格式。可以看出,由于页表或者页的物理地址都是4KB对齐的(低12位全是零),所以上图中只保留了物理基地址的高20位(bit[31:12])。低12位可以安排其他用途。【P】:存在位。为1表示页表或者页位于内存中。否则,表示不在内存中,必须先予以创建或者从磁盘调入内存后方可使用。【R/W】:读写标志。为1表示页面可以被读写,为0...原创 2019-07-21 22:33:19 · 3034 阅读 · 0 评论 -
CPL、DPL和RPL
(1)CPL CPL是当前执行的程序或任务的特权级。它被存储在CS和SS的第0位和第1位上。通常情况下,CPL代表代码所在的段的特权级。当程序转移到不同特权级的代码段时,处理器将改变CPL。只有0和3两个值,分别表示用户态和内核态。(2)DPL DPL表示段或门的特权级。它被存储在段描述符或者门描述符的DPL字段中,当当前代码段试图访问一个段或者门(这里大家先把门看成跟段一样),DPL将会和CPL以及段或者门选择子的RPL相比较,根据段或者门类型的不同,DPL将会区别对待。 GD..原创 2020-09-07 23:59:34 · 3893 阅读 · 0 评论 -
特权级之间的转换
一、特权级 在IA32的分段机制下,特权级总共有4个特权级别,从高到低分别是0、1、2、3。数字越小表示的特权级越大。特权级如下图所示:较为核心的代码和数据,将被存放在特权级较高的层级中。处理器将用这样的机制来避免低特权级的任务在不被允许的情况下访问位于高特权级的段。二、一致代码段和 非一致代码段 系统要安全,必须保证内核与用户程序分离开,内核要安全,必须不能被用户来打扰。但是有的时候,用户程序也是需要访问内核中的部分数据,那怎么办?于是操作系统就将内核中的段分...转载 2020-09-08 00:14:26 · 1271 阅读 · 0 评论 -
(6)打造简单OS-内存分页
好长时间没有更新了,最近比较忙。。。。。。 内存分页可以放在C代码中,这样比较方便编写!即loader执行完后进入kernel_main函数之后在分配内存分页!一、地址 讲到内存必然要讲到计算机中经常提到的一些地址。物理、线性、虚拟、逻辑、有效地址(点击可查看具体内容) 再需要了解内存的分段和分页机制:内存管理分段和分页机制 保护模式下地址转换原理图:(可以先...原创 2019-09-01 20:50:17 · 653 阅读 · 0 评论 -
ELF格式说明
ELF file header(ELF文件头)/* The ELF file header. This appears at the start of every ELF file. */#define EI_NIDENT (16)typedef struct{ unsigned char e_ident[EI_NIDENT]; /* Magic number a...原创 2019-06-23 22:22:38 · 458 阅读 · 0 评论 -
(7)打造简单OS-加载内核
一、简要说明 我们在第五讲【(5)打造简单OS-进入保护模式】中的mbr.S 汇编文件有段这样的代码 mov eax, 0x2 ; 起始扇区lba地址,从间隔第二个扇区开始 mov bx, 0x900 ; 写入的地址 mov cx, 4 ; 待读入的扇区数,读取4个扇区内容 call rd_disk_m_16 ; 以下读取程序的起...原创 2019-09-03 00:14:03 · 445 阅读 · 0 评论 -
CPU中断
CPU共256个中断类型型号: 0~31:对应于异常和非屏蔽中断,不使用中断控制器; 32~47:分配给可屏蔽中断,由I/O设备引起的中断,这其中就包含可由两个8259A级联响应的15个; 48~255:用来标识软中断;CPU中断的机制概论 cpu的数学模型是图灵机,图灵机是一个线性运行指令的机器,它的执行序列是完全确定的,中断机制是使得cpu具有异步处理...原创 2019-08-31 21:03:36 · 16971 阅读 · 3 评论 -
BIOS 中断大全
BIOS中断:1、显示服务(Video Service——INT 10H)00H —设置显示器模式0CH —写图形象素01H —设置光标形状0DH —读图形象素02H —设置光标位置0EH —在Teletype模式下显示字符03H —读取光标信息0FH —读取显示器模式04H —读取光笔位置10H —颜色05H —设置显示页11H —字体06H、07H —初始化或滚...转载 2019-03-28 15:02:23 · 1096 阅读 · 0 评论 -
BIOS 中断向量表
在bochs虚拟器调试中输入info ivt可以查看BIOS中断向量表具体说明如下:中断 描述 INT 00h CPU:除零错,或商不合法时触发 INT 01h CPU:单步陷阱,TF标记为打开状态时,每条指令执行后触发 INT 02h CPU:非可屏蔽中断,如引导自我测试时发生内存错误。 INT 03h CPU:第...原创 2019-04-04 22:02:10 · 1429 阅读 · 2 评论 -
(8)打造简单OS-中断
一、中断简介1.1简介 早期计算机各个程序只能串行执行、系统资源利用低。为了解决上述问题,人们就发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。 中断是多程序并发执行的前提条件。1.3实模式下的中断向量表 详情点击二、中断分类2.1外部硬件中断外中断:外中断的信号来源于CPU外部、与当前执行的指令无关。如用户强...原创 2020-01-09 16:27:47 · 659 阅读 · 0 评论 -
经常用到(创建OS)的命令
1. 将汇编代码编译为二进制模块文件 nasm mbr.asm -o mbr nasm loader.asm -o loader2. 将wirte.c文件编译为二进制模块文件 gcc -m32 -fno-asynchronous-unwind-tables -s -c -o write.o write.c ...原创 2019-06-19 20:59:56 · 338 阅读 · 0 评论 -
《自制编程语言--基于C语言 郑钢》学习笔记
《自制编程语言》学习笔记本仓库内容《自制编程语言》源码src/sparrow.tgz 《自制编程语言》读书笔记docs/* 《自制编程语言》样章阅读reference/自制编程语言-样章.pdf等相关站点GitBook访问地址:https://yifengyou.gitbooks.io/sparrow/content/ GitHub访问地址:https://github....转载 2019-09-26 15:22:04 · 2279 阅读 · 0 评论