Tinix写HelloWorld起步

系统启动理论基础

机器启动之后处于实模式,这时候CS=DS=ES=SS=0xFFFF,IP=0x0000,从CS:IP也就是0xFFFF0开始自动执行程序代码,这个地址通常是BIOS中的地址,但由于这个地址开始到结束也只有16个字节的空间,所以这里一般存放的是BIOS的跳转指令,跳转到BIOS真正的代码地址中。

执行PC机中的BIOS代码时将执行系统硬件的检测,并在物理地址0处初始化中断向量。此后它将设备的第一个扇区(512字节的引导扇区,这里假定只有软盘)读入到内存绝对地址0x7c00处,并跳转到这个地址。

通常这个引导扇区存的是boot模块的代码,boot模块的主要工作是负责将load模块的代码从软盘读取至内存,并跳转到load代码中执行,因为load模块代码大小可能不止一个扇区,所以不能将load代码作为引导扇区启动,load模块主要为加载kernel模块。

那怎么样叫一个引导扇区呢?

软盘的第0个扇区,也就是0面0道1扇区,对于这个扇区的512个字节,如果最后的两个字节为0xAA55,那么BIOS则认为该软盘为一个引导扇区。当然除了这个之外,这个扇区应该有一段小于512字节的执行码。

令人迷惑的ox7c00

0x7c00干了啥?书中的代码1-1,第一句是org 0x7c00,上面BIOS将引导扇区读入到的内存地址也是0x7c00,这两个是否同一个意思呢?如果去掉这句又有什么不同呢?

在这里我编译了两个版本的boot,分别是boot_7c00.bin,boot_0100.bin,第一个使用org  07c00h编译,第二个使用org  0100h编译。

直接使用beyond compare比较两个bin文件,发现除了一个位置之外两个文件包完全相同,而这个不同就是这里指定的7c以及01。

对于dos下面跑的com文件,将来加载到的起始地址在0x0100h,用作boot的文件将来加载到的起始地址在0x7c00h,使用nasm提供的ndisasm.exe指定起始地址反编译刚才生成的bin文件,分别生成disboot_7c00.asm以及disboot_0100.asm文件。

再行比较生成的两个反编译disboot_7c00.asm以及disboot_0100.asm文件,发现除了第一列起始地址外,相对于原来的boot.asm代码有几个不同的地方。

1、  org 这一行在反汇编里面不存在,因为这句不是intel指令,是编译器指令。

2、  call DispStr,jmp $这两句的机器指令是一致的,但是反编译出来的汇编代码不一致,也就是说反编译出来的汇编指令加上了代码段地址。

3、  mov ax, BootMessage这句汇编语句被编译成真正的地址,而真正的地址都被加上了数据段地址,BootMessage的地址在0x7c1f以及0x011f处,下来到0x7c1f的下面,两侧的机器码都是一致的,分别是48 65 6C 6C 6F…转换回ASCII就是Hello…

综上所述,org这句实际上是在编译的时候为数据生成了真实的数据地址。

小提示:查看ASCII的时候可以使用linux中的man ascii命令来进行查看

Helloword代码解析

对于1-1这个代码片段,书中基本上都已经解析了,但是有一个int 10h中断书中没怎么解析,这里再贴一下int 10h中断的用法如下,AH=13是表示显示字符串的功能号。

1 DispStr:
2        mov ax, BootMessage
3        mov bp, ax                ; ES:BP = 串地址
4        mov cx, 16                ; CX = 串长度
5        mov ax, 01301h            ; AH = 13,  AL = 01h
6        mov bx, 000ch             ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
7        mov dl, 0
8        int 10h                   ; 10h 号中断
9        ret

功能号:13H

功能:在Teletype模式下显示字符串 
入口参数:AH=13H
          BH=页码
          BL=属性(若AL=00H或01H)
          CX=显示字符串长度
          (DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL=显示输出方式 
 0—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变 
 1—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变 
 2—字符串中含显示字符和显示属性。显示后,光标位置不变 
 3—字符串中含显示字符和显示属性。显示后,光标位置改变

操作系统的hello
world

使用命令nasm boot.asm –o boot.bin编译boot.asm生成boot.bin文件;生成一个新的镜像文件Tinix.img,生成镜像的方式有多种,如linux下的dd命令,或windows下也可使用fsutil命令生成,或使用VDM生成;生成镜像后直接使用于渊提供的工具FloppyWriter.exe来将boot.bin写入软盘镜像的引导扇区。

注意,软盘镜像不要在dos下格式化然后将Tinix.img虚拟成软盘,再拷贝boot.bin进去,这样拷贝的boot.bin其位置不在引导扇区。

设置debug虚拟机的软盘镜像

确定之后,启动debug虚拟机,可以看到红色的Hello, OS world! 怎么样,不是很难把?当然这只是一个boot而已,真正的操作系统之路还很远。事实上,后面的东西真的很难,起码对我来说是这样的,无论怎样都要加油!

时间: 2024-12-17 05:10:15

Tinix写HelloWorld起步的相关文章

Ajax入门介绍以及用Ajax写helloworld

1:  Ajax被认为是(Asynchronous  JavaScript and XML的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. Ajax:一种不用刷新整个页面便可与服务器通讯的办法 2:用ajax编写一个helloworld的小程序,在超链接中弹出文本框中的内容. <script type="text/javascript"> window.onload=function(){ //1:获取a节点,并对其添加onclick()相应

从零学Java(1)——环境搭建,用记事本写HelloWorld

常用的DOS命令: E:进入E盘根目录cd:进入到某个目录cd..:返回上级目录cd\:返回到根目录md:创建某个目录rd:删除某个目录del:删除文件cls:清空窗口exit:退出DOS命令行 Java体系架构:JavaSE.JavaEE.JavaME Java语言特点: 完全面向对象的语言跨平台性(提供了在不同平台下运行的解释环境JVM)一种健壮的语言(吸收了C.C++的优点)有较高的安全性(自动垃圾回收.强制类型检查.取消指针) Java技术的核心机制: Java虚拟机(JVM):对不同的

intellij idea 写 Helloworld

http://www.jetbrains.com/idea/webhelp/creating-and-running-your-first-java-application.html Creating and Running Your First Java Application Previous | Next | See Also | Shortcuts:                  Default                GNOME                 KDE    

ionic写helloworld步骤

趁周末的时间,研究了一下ionic的apk构建过程,还算顺利,步骤简单记录如下. 1.下载node.js并安装(www.nodejs.org) 2.npm install -g cordova ionic 3.ionic start myapp tabs 或ionic start myapp sidemenu 或ionic start myapp blank 4.安装JAVA,Android-sdk,并配置JAVA_HOME,ANDROID_HOME,PATH等路径. 5.制作签名文件 keyt

如何学习struts并写第一个程序HelloWorld

在编写这个程序前,我觉得盲目地去跟着视频来敲代码或者看完视频后就去练习并不是个好办法.我的做法是:一.去把Struts框架的原理搞清楚,也可以去struts的官方网站 http://struts.apache.org 查阅,它的原理图如下: 简单介绍一下这个原理图的大致意思: (1).客户端发送请求后提交到一系列的过滤器,主要有三层,并且有一定顺序,先是ActionContextCleanUp过滤器,然后再到其他过滤器(SiteMesh等),再到FilterDispatcher过滤器. (2).

struts2 helloworld

学习的今天,在第一天struts2,从来没有学过怎么办,那当然是helloworld.前一段时间去学习android.由于工作的一个项目,我们需要使用server.所有开始学习struts2,好感觉.学习的基本过程几乎是相同的.那是,helloworld,开发环境,然后就是逐个依照知识点打demo,打着打着你就会发现struts2已经掌握地差点儿相同了,让后就能够action了.程序猿就须要不停地学习,学习能力当然是最重要地噢. 废话讲完.进入正题: 第一步:部署开发环境: struts-2.3

Java入门记(一):折腾HelloWorld

HelloWorld,学习每门语言的第一步.有人戏称,这些年的编程生涯就是学习各种语言的HelloWorld,不知是自谦还是自嘲.目前所在的公司使用Java作为主要开发语言,我进行语言转换也大半年了,这HelloWorld便是语言转换的第一关.好在本科的时候学过那么一点,而且在此之前进行了较长时间的C/C++开发,其间有不少的相似之处.这里略去JDK的安装和环境配置(JDK为1.6.0.45),直接从代码入手. 首先看一个最简单的Java下的HelloWorld: public class He

Flex+BlazeDS+IntelliJ IDEA整合开发系列一之起步demo

环境:blazeds-bin-4.0.1.21287,apache-tomcat-7.0.57,IntelliJ IDEA 15.0.4,Flex Builder 4.6 1. 解压blazeds-bin-4.0.1.21287.zip,然后把blazeds.war解压后的blazeds复制放到tomcat的webapps目录下 2. 修改blazeds/WEB-INF/flex/remoting-config.xml: <?xml version="1.0" encoding=

Scala学习2 ———— 三种方式完成HelloWorld程序

三种方式完成HelloWorld程序 分别采用在REPL,命令行(scala脚本)和Eclipse下运行hello world. 一.Scala REPL. 按照第一篇在windows下安装好scala后,直接Ctrl+R,然后在运行命令窗里输入scala,或者输入cmd后,进入命令行在输入scala. 然后我们输入 print("Hello World!") 看下结果: 第一种方式运行完毕. 注意:前两行命令使用了Tab键,可以像bash一样有补全的功能哦! 二.Scala脚本完成H