 |
1楼
巨大八爪鱼
2016-2-26 18:33
【OS.c】 #include <stdio.h>
char memory[256]; // 假定這個就是「作業系統」的一塊內存
int main() { char *pStr; int size, n; // 將要運行的程序讀入「內存」 FILE *fp = fopen("app.hrb", "r"); fseek(fp, 0, SEEK_END); size = ftell(fp) - 1; // size = 文件大小 - 1 fseek(fp, 1, SEEK_SET); // 必須跳過文件中的第一個字節 fread(memory, size, 1, fp); // 從第二個字節開始讀取,一直到文件結束 fclose(fp); // 運行「程序」, 並獲取「程序」向「作業系統」返回的值 n = ((int (*)())memory)(); pStr = memory + n; puts(pStr); // 輸出程序中的字符串 return 0; }
|
 |
2楼
巨大八爪鱼
2016-2-26 18:34
【OSHead.asm】 ; 這個文件裏面什麼也不用寫
|
 |
3楼
巨大八爪鱼
2016-2-26 18:35
編譯「作業系統」: nasm -f elf OSHead.asm gcc -m32 OSHead.o OS.c -o OS
|
 |
4楼
巨大八爪鱼
2016-2-26 18:35
【應用程式 app.asm】 ORG -1 ; 告訴編譯器,這個程序將會被讀到&memory[-1]的地址上 MOV EAX, msg ; 該「應用程式」會將msg的地址作為返回值返回給「作業系統」 RET ; 返回
msg: DB "I'm from a program." DB 0 【編譯「應用程式」】 nasm app.asm -o app.hrb
|
 |
5楼
巨大八爪鱼
2016-2-26 18:36
最後,運行./OS,輸出: $ ./OS I'm from a program.
這表明,「作業系統「 OS成功運行了「應用程式」 app.hrb。
|
 |
6楼
巨大八爪鱼
2016-2-26 18:39
【補充】 這裏的OS.c必須被編譯成32位的,才能正確運行32位的app.hrb。 如果電腦是64位的話,必須給gcc安裝: sudo apt-get install libc6-dev-i386 才能編譯32位的c程序。
|
 |
7楼
巨大八爪鱼
2016-2-29 23:47
因此,應用程式實際上是拿給CPU執行的,並不是作業系統在解釋執行。作業系統和應用程式本質上都是由機器代碼構成的,其性質基本相同。
|