自制操作系统2:初识汇编--helloworld内核

littleoskernel
1.首先安装 nasm
sudo apt-get install nasm
nasm -version
NASM version 2.14.02
touch hello.asm
gedit hello.asm
section .data
  hello:     db 'Hello world!',10    ; 'Hello world!' plus a linefeed character
  helloLen:  equ $-hello             ; Length of the 'Hello world!' string
                                     ; (I'll explain soon)
 
section .text
  global _start
 
_start:
  mov eax,4            ; The system call for write (sys_write)
  mov ebx,1            ; File descriptor 1 - standard output
  mov ecx,hello        ; Put the offset of hello in ecx
  mov edx,helloLen     ; helloLen is a constant, so we don't need to say
                       ;  mov edx,[helloLen] to get it's actual value
  int 80h              ; Call the kernel
 
  mov eax,1            ; The system call for exit (sys_exit)
  mov ebx,0            ; Exit with return code of 0 (no error)
  int 80h

nasm -f elf64 hello.asm
ld -s -o hello hello.o
./hello
2. 参考网址:

https://blog.csdn.net/tyler_download/article/details/51761750

https://weread.qq.com/web/reader/38732220718ff5cf3877215k98f3284021498f137082c2e

3.编写boot.asm
  nasm -o boot.bat boot.asm
查看一下二进制文件:
ubuntu下用神码工具查?
vim -b boot.bat
然后输入命令  :%!xxd -g 1  切换到十六进制模式显示

4.制作镜像:在上一节的程序基础上改造,OperatingSystem.java
把byte数组改为boot.bat文件,制作成镜像system.img
5.用virtualbox加载system.img,结果:

附上boot.asm代码,代码解读可以见原链接

org  0x7c00;

entry:
  mov  ax, 0
  mov  ss, ax
  mov  ds, ax
  mov  es, ax
  
  mov  si, msg
putloop:
  mov  al, [si]
  add  si, 1
  cmp  al, 0
  je   fin
  mov  ah, 0x0e
  mov  bx, 15
  int  0x10
  jmp  putloop
  
fin:
  HLT
  jmp fin
  
msg:
  DB 0x0a,0x0a
  DB "Hello,World"
  DB 0x0a
  DB 0

附上工具OperatingSystem.java代码

import java.io.*;
import java.util.ArrayList;

public class OperatingSystem {

    private ArrayList<Integer> imgByteToWrite = new ArrayList<Integer>();

    private void readKernelFromFile(String fileName) {
        File file = new File(fileName);
        InputStream in = null;

        try {
            in = new FileInputStream(file);
            int tempbyte;
            while ((tempbyte = in.read()) != -1) {
                imgByteToWrite.add(tempbyte);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        imgByteToWrite.add(0x55);
        imgByteToWrite.add(0xaa);
        imgByteToWrite.add(0xf0);
        imgByteToWrite.add(0xff);
        imgByteToWrite.add(0xff);
    }

    public OperatingSystem(String s) {
        readKernelFromFile("boot.bat");

        int len = 0x168000;
        int curSize = imgByteToWrite.size();
        for (int l = 0; l < len - curSize; l++) {
            imgByteToWrite.add(0);
        }
    }

    public void makeFllopy()   {
        try {
            DataOutputStream out = new DataOutputStream(new FileOutputStream("system.img"));
            for (int i = 0; i < imgByteToWrite.size(); i++) {
                out.writeByte(imgByteToWrite.get(i).byteValue());
            }
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        OperatingSystem op = new OperatingSystem("hello, this is my first line of my operating system code");
        op.makeFllopy();
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值