作者共發了7篇帖子。 內容轉換:不轉換▼
 
點擊 回復
260 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)
 

本帖信息

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