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();
}
}