目前共有7篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:台灣正體▼
 
點擊 回復
348 6
【原創】模擬作業系統運行應用程式的C程序
一派掌門 二十級
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執行的,並不是作業系統在解釋執行。作業系統和應用程式本質上都是由機器代碼構成的,其性質基本相同。
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:348 回複數:6
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-2-29 23:47
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。