用Java做一個最小的作業系統核心
作業系統,是電腦科學中的皇冠,它作為一個平臺,幾乎集結了計算機科學裡面的所有知識,如硬體,演算法,架構,能夠寫出一個作業系統的人,無一不是行業裡的翹楚或大神級人物,像Linux的創始人Torvalds,Android的創始人安迪·魯賓,蘋果早期電腦系統的開發者史蒂夫-沃茲尼亞克
所以我也要做一個作業系統......
import java.io.DataOutputStream; import java.io.FileOutputStream; import java.util.ArrayList; public class OperatingSystem { private ArrayList<Integer> imgByteToWrite = new ArrayList<Integer>(); private int[] imgContent = new int[]{ 0xeb,0x4e,0x90,0x48,0x45,0x4c,0x4c,0x4f,0x49,0x50,0x4c,0x00,0x02,0x01,0x01,0x00,0x02,0xe0, 0x00,0x40,0x0b,0xf0,0x09,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x0b,0x00,0x00,0x00,0x00,0x29, 0xff,0xff,0xff,0xff,0x48,0x45,0x4c,0x4c,0x4f,0x2d,0x4f,0x53,0x20,0x20,0x20,0x46,0x41,0x54,0x31,0x32, 0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x8e, 0xd0,0xbc,0x00,0x7c,0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a, 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09,0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb,0xee,0xf4,0xeb,0xfd }; public OperatingSystem(String s) { for (int i = 0; i < imgContent.length; i++) imgByteToWrite.add(imgContent[i]); imgByteToWrite.add(0x0a); imgByteToWrite.add(0x0a); for (int j = 0; j < s.length(); j++) imgByteToWrite.add((int)s.charAt(j)); imgByteToWrite.add(0x0a); //換行 int len = 0x1fe; int curSize = imgByteToWrite.size(); for (int k = 0; k < len - curSize; k++) imgByteToWrite.add(0); /* * 要想讓虛擬機器將軟盤的頭512位元組當作作業系統的核心載入到記憶體 * 前512位元組的最後兩個位元組必須是55,aa */ imgByteToWrite.add(0x55); imgByteToWrite.add(0xaa); imgByteToWrite.add(0xf0); imgByteToWrite.add(0xff); imgByteToWrite.add(0xff); len = 0x168000; curSize = imgByteToWrite.size(); for (int l = 0; l < len - curSize; l++) // 其餘部分都用0補全 imgByteToWrite.add(0); } public void makeFllopy(){ /* * 在磁碟上建立一個1474560位元組的二進位制檔案,將imgContent的內容寫入該檔案的前512位元組 * 這個二進位制檔案將作為一個1.5M的虛擬軟盤用於當作虛擬機器的啟動軟盤 */ 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(); } }
上面的程式碼執行後,在工程目錄下會生成一個system.img檔案。接著利用virtualbox建立一個虛擬機器,設定它為磁碟啟動,並在配置中,將程式碼生成的system.img當做虛擬磁碟插入虛擬機器:

然後點選啟動,結果如下:

Java程式碼中,main函式裡的字串出現在了虛擬機器螢幕裡,然後虛擬機器就卡死了。機器上電後就載入了我們的程式碼,這不就是一個作業系統的雛形嗎。
這是我作業系統的第一篇文章,接下來我會繼續完善這個作業系統,敬請期待......