Как стать автором
Поиск
Написать публикацию
Обновить

Пишем ОС… на 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


Всем спасибо за внимание.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.