码迷,mamicode.com
首页 > 其他好文 > 详细

x01.os.14: 时间都去哪儿了

时间:2014-11-06 21:46:13      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   for   sp   

时间都去哪儿了

老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨。试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹琴无人听,但一老妇人听得却潸然泪下。原来她的亡夫是弹棉花的!这虽是个笑话,却一语道破玄机。歌声动人,除了唱功,还有感情因素在里面。假如老帕的”花儿为什么这样红“是 1 分, 那么,张碧晨的父女情为 1 分, ”时间都去哪儿了“为 1 分。2 : 1, 张碧晨胜出也就理所当然了。

shell 的实现

在自己的 os 中运行自己的程序 echo,实现起来,比想象的要简单一些。这得益于文件系统的支持。准备工作,参见 x01.os.7。源代码,可到 x01.Lab.Download 中下载 x01.os.13.tar.gz。解压后由终端进入,make 后 bochs 可看到如下界面:

    bubuko.com,布布扣

看来,echo 程序运行的还不错。首先,来看看 echo 程序,代码如下:

 1 #include "kstd.h"
 2 
 3 int main(int argc, char* argv[]) {
 4     int i;
 5     for (i = 1; i < argc; i++) {
 6         printf("%s%s", i == 1 ? "" : " ", argv[i]);
 7     }
 8     printf("\n");
 9     return 0;
10 }

非常简单,但这个 main 函数已经不是我们平时看到的那个了。它要在我们自己的 os 中运行,还需要 start.s 的帮忙,代码如下:

 1 extern main
 2 extern exit
 3 
 4 bits 32
 5 
 6 [section .text]
 7 global   _start
 8 
 9 _start:
10         push        eax
11         push        ecx
12         call            main
13         push        eax
14         call            exit
15         hlt

这个 _start 是关键,与 kernnel.s 中的一致。那么,怎么在我们自己的 os 中运行呢?在 mm.c => MM_Exec() 函数中,有这么一句:

g_ProcTable[src].Regs.eip = elf_hdr->e_entry;

echo 的 entry point,正是由这句完成交接。简单而言,就是 fork 一个 Init 的子进程,然后在 shell 中替换为我们自己的程序如 echo。

学习操作系统,如果脑海里有个内存布局,将会事半功倍。为了计算 10 进制到 16 进制的转换,顺手写了个 hex 程序。但要把它运行在自己的 os 中,却又有许多工作要做,作罢。

一个完善的 os,非一人之力,非一时之功。除了大家共同努力,难道还有别的办法吗?

x01.os.14: 时间都去哪儿了

标签:style   blog   http   io   color   ar   os   for   sp   

原文地址:http://www.cnblogs.com/china_x01/p/4079708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!