zoukankan      html  css  js  c++  java
  • 《30天自制操作系统》第一天

    首先,这本书的操作系统需要用软驱来装载,但是当今都什么年代了,哪儿来的软驱,所以大家可以用虚拟机实现这本书里的所有东西,我用的是Virtual box,这是一款免费的虚拟机,个人感觉vmware太笨重了(虽然功能很全),言归正传,新建一个虚拟机神马的自己google,下面是添加一个软驱


    然后就可以把软驱文件img文件加载进去了,前期工作已完成,下面是hello.img的编写,书上用2进制编辑器写太扯淡了,直接看一下原理就跳过了,

    下面是hello.asm的代码

    DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
    DB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
    DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
    DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
    DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
    DB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
    DB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
    DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
    RESB    16 ;预留空间指令
    DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
    DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
    DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
    DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
    DB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
    DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
    DB	0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB	368
    DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
    DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB	4600
    DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB	1469432


    然后 使用nasm编译(80x86汇编编译器http://sourceforge.net/projects/nasm/),直接生成软盘映像成软盘映像

    nasm -o helloos.img helloos.asm
     


    最后是8086汇编写的源程序,和书上有点出入:

    ;hello-os
    ;TAB=4
    ;FAT12格式文件系统头部分
        DB		0xeb, 0x4e, 0x90
        DB		"HELLOIPL"
        DW		512
        DB		1
        DW		1
        DB		2
        DW		224
        DW		2880
        DB		0xf0
        DW		9
        DW		18
        DW		2
        DD		0
        DD		2880
        DB		0,0,0x29
        DD		0xffffffff
        DB		"HELLO-OS   "
        DB		"FAT12   "
        RESB	18
    ;程序主体
        DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
        DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
        DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
        DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
        DB		0xee, 0xf4, 0xeb, 0xfd
    ;信息显示部分
    
        DB		0x0a, 0x0a
        DB		"hello, world"
        DB		0x0a
        DB		0
    ;原书中使用下面指令,但这个在nasm中不通过,故使用times
    ;RESB	0x1fe - $
        times 510 - ($-$$) DB 0
        DB		0x55, 0xaa
    ;以下是启动区外输出部分
        DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB	4600
        DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB	1469432
    


  • 相关阅读:
    链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的
    无法定位程序输入点 _glutCreateWindowWithExit于动态链接库glut32.dll上
    Error:“应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。”
    虚函数和纯虚函数的区别
    VS2010和matlab2010混合编程中char16_t重定义的问题
    笔记本电脑关闭小键盘(即打字按P出现星号键)
    WIN7系统下U盘安装Ubuntu双系统
    The Basics of 3D Printing in 2015
    3D建模与处理软件简介
    win7-32 系统 + VS2010 配置 glew
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3112857.html
Copyright © 2011-2022 走看看