自己动手写操作系统pdf_写作系统

自己动手写操作系统pdf_写作系统2019-4-26AM9:15前言:记得上初中时,在一张英语报上看到一篇关于史蒂夫乔布斯的文章,那时他才20多岁,就已经达到人生的巅峰,可谓意气风发,我的内心对其充满崇敬之意。联想到表哥家的那台windows95大块头电脑,时常偷偷玩上两把魔兽争霸,那时,已经对这个魔术般奇幻的机器充满好奇。再后来一直到大学,在偌大的图书馆看到关于计算机的书籍,里边总是浮现一些不明所以的代码,既感到神奇的同…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

2019-4-26 AM 9:15

前言:记得上初中时,在一张英语报上看到一篇关于史蒂夫乔布斯的文章,那时他才20多岁,就已经达到人生的巅峰,可谓意气风发,我的内心对其充满崇敬之意。联想到表哥家的那台windows95大块头电脑,时常偷偷玩上两把魔兽争霸,那时,已经对这个魔术般奇幻的机器充满好奇。再后来一直到大学,在偌大的图书馆看到关于计算机的书籍,里边总是浮现一些不明所以的代码,既感到神奇的同时也暗下决心一探究竟,我记得第一次运行hello world程序的狂喜心情,然后这种对计算机技术的热爱就一直延续至今。很纯粹的热爱,就想弄明白操作系统的运作原理,便想依照于渊老师的《自己动手写操作系统》做一个小的系统内核,真正属于自己的!想想都有种莫名的激动。

基本上,书中都是在虚拟机上运行,我手边有一个基本上不用的联想Y460的笔记本电脑,我决定直接在这个机器上做实验,不知是不是对不起我的爱机?

以前实际上是有过类似的写操作系统的经验的,但因为没有任何文档记录,现在得一切从头开始。这两天已经摸索出基本测试思路:1.使用notepad++文本编辑器编辑好系统代码,asm格式。2.使用NASM转为格式为bin文件 3.直接使用rawrite写入U盘 4.使用真机测试

第一章–最小的“操作系统”

最最简单的“操作系统”就是一个最最简单的引导扇区(Boot Sector)。虽然它不具有任何功能,但是它却能够直接在裸机上运行,不依赖其他软件。一个引导扇区是512个字节,并且以0xAA55为结束标识的扇区。

/****************************************************************************************************************************************************引导扇区(Boot Sector) 通常指设备的第一个扇区,用于加载并转让处理器控制权给操作系统。

自己动手写操作系统pdf_写作系统

自己动手写操作系统pdf_写作系统

0x07C00相当于十进制中的:31744

***************************************************************************************************************************************************/

  1. org 07C00h                          ; 告诉编译器程序加载到07C00处  
  2.        mov ax, cs  
  3.        mov ds, ax  
  4.        mov es, ax  
  5.        call DispStr                     ; 调用显示字符串例程  
  6.        jmp $                    ; 无限循环  
  7. DispStr:  
  8.        mov ax, BootMessage  
  9.        mov bp, ax                       ; es:bp = 串地址  
  10.        mov cx, 16                       ; cx = 串长度  
  11.        mov ax, 01301h               ; ah = 13, al = 01h  
  12.        mov bx, 000Ch                ; 页号为0(bh = 0) 黑底红字 (bl = 0Ch,高亮)  
  13.        mov dl, 0  
  14.        int 10h                          ; 10h号中断  
  15.        ret  
  16. BootMessage:  db “Hello,OS world!”  
  17. times 510-($-$$)   db   0               ; 填充剩下的空间,使生成的二进制代码恰好为512字节  
  18. dw 0xaa55                               ; 结束标志  

1、org 07C00h

org伪指令: org + 数值表达式

其中,org是操作码,不可省略。数值表达式给出偏移地址值,即org语句后的指令或数据以数值表达式给出的值作为起始的偏移地址。数值表达式必须是一个可计算得到的正整数,数值范围在0~65535之间。

org伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。汇编程序汇编时把语句中表达式的值作为起始地址,连续存放org语句之后的程序和数据,直到出现一个新的org指令。若省略org语句,则从本段起始地址开始连续存放。

在大多数情况下,不需要用org语句设置位置指针。由于段定义语句是段的起点,它的偏移地址为0000H,以后每分配一个字节,位置指针自动加1,所以每条指令都有确定的偏移地址。只有程序要求改变这个位置指针时,才需要安排org语句。通常org语句可以出现在程序中任何位置上。   

org示例:

在数据段中依次定义以下变量,由于此时没有使用org语句,则变量word1的偏移地址为0。
word1 DW  1234h
byte1  DB   56h
word2 DW  abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。
自己动手写操作系统pdf_写作系统

在数据段中依次定义以下变量,由于此时使用org语句,则变量word1的偏移地址为1。
org 0001h
word1 DW  1234h
byte1  DB   56h
word2 DW  abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。

自己动手写操作系统pdf_写作系统

我们知道编译器本身在汇编时对指令的地址计算是相对地址,而对于引导扇区,是按绝对地址执行,那么对于用相对地址编译的执行码就要换算成绝对地址。一般而言,“真实开始执行的引导扇区”都会固定装载到07C00h处。

由于编译器在编译时的地址是从第一行开始用0000h开始相对计算的,而且我们要写的是“引导扇区”程序,所以我们要将下面的代码加载到地址07C00h处,所以我们需要org 07C00h,通过该伪指令,将代码和数据加载到07C00h地址。

2、jmp $

$被称为当前位置计数器

在汇编程序对源程序进行汇编的过程中,使用地址计数器来保证当前正在汇编的指令地址。地址计数器值可用“$”来表示,汇编语言也允许用户直接用“$”来引用地址计数器的当前值,因此,org $+5可表示从当前地址开始跳过5个字节存储单元,在指令和伪指令中,也可直接用“$”表示地址计数器的当前值。故jmp $进入了一个无限循环。

3、int  10h

int  10H号中断

int 10H 是由BIOS 对屏幕及显示器所提供的服务程序。使用int 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 int 10H。

在这里我们只详细讲解本程序中的10号中断。由于ah=13,故调用编号为13的功能:即显示字符串。其中ES:BP=串地址,CX=串长度 ,AH=13,当AL=01h时,光标会跟随显示移动。BH为页号,BH=0表示页号为0,BL=0CH,表示属性,即黑底红字高亮。因此在调用10号中断之前,无非就是对各个寄存器进行初始化。

4、times 510-($-$$)  db  0

times:重复指令或数据

times前缀引起指令被汇编多次。其中

)次。也就是用0来填充剩下的空间,达到510字节。

 

打开计算机电源;加电自检(POST);寻找启动盘,该系统设置从软盘启动,计算机检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS会认为它是一个引导扇区;BIOS将该512字节扇区内容加载到内存地址0000:7c00;跳转到0000:7C00出将控制权交给这段引导代码。到此为止,计算机不再由BIOS中固有的程序来控制,而变成由操作系统的一部分来控制。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179697.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用nginx搭建RTMP视频点播、直播、HLS服务器

    利用nginx搭建RTMP视频点播、直播、HLS服务器开发环境Ubuntu14.04servernginx-1.8.1nginx-rtmp-modulenginx的服务器的搭建安装nginx的依赖库sudoapt-getupdatesudoapt-getinstalllibpcre3libpcre3-devsudoapt-getinstallopenssllibssl-dev配置并编译nginx使用nginx的默

    2022年6月13日
    22
  • JS获取当前年份月[通俗易懂]

    JS获取当前年份月[通俗易懂]//获取完整的日期 vardate=newDate; varyear=date.getFullYear();  varmonth=date.getMonth()+1; month=(month varmydate=(year.toString()+month.toString());注意,year.toString()+month.toString()不能写成year+mont

    2022年9月16日
    0
  • 谷歌滚动条样式(滚动条样式按钮)

    有不少可以帮你修改Chrome默认滚动条样式的扩展,ScrollBarX就是其中的佼佼者,但是这个扩展在安装的时候提示说会存取所有的网站数据,这就让人感觉很难以接受了。其实咱们可以自己动手,丰衣足食。首先在自己的系统里找到如下这个.css文件:Windows:%LOCALAPPDATA%\Google\Chrome\UserData\Default\UserStyleSheets\…

    2022年4月17日
    38
  • Spring源码下载及安装

    Spring源码下载及安装今天下午开始学习Spring源码深度解析,第一章是进行环境搭建。。。。。照着书整,但是遇到很多问题,然后就各种百度,终于搭建成功了,这里写下博客进行记录总结下:一.安装GitHub1、到官网下载客户端:https://github-windows.s3.amazonaws.com/GitHubSetup.exe,安装完成后,会在桌面上出现两个图标,GitShell和GitHub。那两个图标分别是…

    2022年8月12日
    6
  • smalldatetime mysql_SQL数据表中有savetime(smalldatetime类型)字段,表中有两条记录,savetime值为:2005-3-8 12:12:00和2005-6-…

    smalldatetime mysql_SQL数据表中有savetime(smalldatetime类型)字段,表中有两条记录,savetime值为:2005-3-8 12:12:00和2005-6-…SQL数据表中有savetime(smalldatetime类型)字段,表中有两条记录,savetime值为:2005-3-812:12:00和2005-6-614:02:02我用下面语句什么也搜不出来select*fromsoftwheresoft.savetimelike’%2005-3-8%’SQL帮助中说:”当搜索datetime值时,推荐使用LIKE,因为date…

    2022年5月12日
    34
  • spring 注解验证@NotNull等使用方法

    spring 注解验证@NotNull等使用方法常用标签@Null被注释的元素必须为null@NotNull被注释的元素不能为null@AssertTrue被注释的元素必须为true@AssertFalse被注释的元素必须为false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(

    2022年6月13日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号