zoukankan      html  css  js  c++  java
  • x01.os.14: 时间都去哪儿了

    时间都去哪儿了

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

    shell 的实现

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

        

    看来,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("
    ");
     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,非一人之力,非一时之功。除了大家共同努力,难道还有别的办法吗?

  • 相关阅读:
    带结点与不带结点用头插法和尾插法创建单链表
    高中数学教资面试记录
    学习爬虫——test1——模拟浏览器去访问网站
    解决centos虚拟机中使用virt-manager创建虚拟机遇到的镜像导入问题
    pycharm更改背景颜色
    控制函数调用的流程
    简单的获取list的下标
    种一棵树的时间,不是以前,也不是未来的某一天,而是现在。
    将八位教师随机分配到三个办公室——python
    使用tomcat部署idea项目方法(1)
  • 原文地址:https://www.cnblogs.com/china_x01/p/4079708.html
Copyright © 2011-2022 走看看