Pull to refresh

Пишем ОС… на Java?

Недавно мне в руки попала интересная вещь — Simple Java Compiler от Стефана Френца. Как он сам пишет, его компилятор преобразует Java-код в native-код для определенной архитектуры (поддержка IA-32 и AMD64). Компилятор использует спец-аннотации. Автор реализовал с помощью компилятора несколько ОС. Также один умелец по имени lenidh написал ОС Bearded Robot.

Компилятор можно скачать на сайте автора.

Сегодня я вам покажу, как написать нативный «Hello, world!», который потом можно запустить в QEMU.

Класс Object — суперкласс всех классов в Java.

Код
package java.lang;

import rte.SClassDesc;

public class Object {
  public final SClassDesc _r_type=null;
  public final Object _r_next=null;
  public final int _r_relocEntries=0, _r_scalarSize=0;
}

package java.lang;
public class String {
  private char[] value;
  private int count;
  @SJC.Inline
  public int length() {
    return count;
  }
  @SJC.Inline
  public char charAt(int i) {
    return value[i];
  }
}
package rte;
public class SArray {
  public final int length=0, _r_dim=0, _r_stdType=0;
  public final Object _r_unitType=null;
}
package rte;
public class SClassDesc {
  public SClassDesc parent;
  public SIntfMap implementations;
}
package rte;
public class SIntfDesc {
}
package rte;
public class SIntfMap {
  public SIntfDesc owner;
  public SIntfMap next;
}
package rte;
public class SMthdBlock {
}
package rte;
public class DynamicRuntime {
  public static Object newInstance(int scalarSize, int relocEntries,
      SClassDesc type) { while(true); }
  public static SArray newArray(int length, int arrDim, int entrySize,
      int stdType, Object unitType) { while(true); }
  public static void newMultArray(SArray[] parent, int curLevel,
      int destLevel, int length, int arrDim, int entrySize, int stdType,
      Object unitType) { while(true); }
  public static boolean isInstance(Object o, SClassDesc dest,
      boolean asCast) { while(true); }
  public static SIntfMap isImplementation(Object o, SIntfDesc dest,
      boolean asCast) { while(true); }
  public static boolean isArray(SArray o, int stdType,
      Object unitType, int arrDim, boolean asCast) { while(true); }
  public static void checkArrayStore(Object dest,
      SArray newEntry) { while(true); }
}



А теперь и «Hello World!»

Код
package kernel;
public class Kernel {
  private static int vidMem=0xB8000;
  public static void main() {
    print("Hello World");
    while(true);
  }
  public static void print(String str) {
    int i;
    for (i=0; i<str.length(); i++) print(str.charAt(i));
  }
  public static void print(char c) {
    MAGIC.wMem8(vidMem++, (byte)c);
    MAGIC.wMem8(vidMem++, (byte)0x07);
  }
}



А теперь компилируем.

Для Linux (32-bit):

./compile rte.java hello.java -o boot


Пример для 64-bit есть в поставке компилятора.

Для Windows (32-bit):

compile rte.java hello.java -o boot


Пример для AMD64 есть в поставке компилятора.

Для запуска в QEMU:

qemu-system-i386 -boot a -fda BOOT_FLP.IMG


Всем спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.