抄写Linux源码(Day9:读闪客文章第37回 “shell 程序跑起来了”)

文章讨论了如何通过自顶向下学习方式理解Linux启动过程,重点在于shell程序在Linux0.11中的嵌入、缺页中断、硬盘驱动、系统调用(如fork、execve、wait)以及进程调度的重要性。作者指出shell程序需要支持的环境和硬件组件,如键盘驱动和显示接口。
摘要由CSDN通过智能技术生成

原文链接:https://mp.weixin.qq.com/s?__biz=Mzk0MjE3NDE0Ng==&mid=2247502581&idx=1&sn=df3f2c19ce511ac24145091892f47837&chksm=c2c5b058f5b2394ee095d679071b43c23853dc86d5cfd4cc961568643110ab734f635b899984&scene=178&cur_album_id=2123743679373688834#rd

原作者文章写得真好

之所以跳过来先读 37 回,是因为遵循传统路径 “从 Linux0.11 启动一直读到 Shell 启动” 可能会造成我们难以理解 shell 和 Linux0.11 其他模块的关系 (为什么启动 shell 之前要做这么多准备?)

因此,我决定先读 37 回,把 shell 这个程序看明白,写明白,随后再以 “把 shell 运行在 qemu-system-x86_64 上面” 为目标,去构建整个 Linux0.11。

通过这种自顶向下的方式,相信能够对 Linux0.11 有较深的理解

接下来是对原作者文章的批注

简单的看了看闪客的文章,37回这篇文章并没有讲 Linux0.11 的 shell 程序,而是讲解了 xv6 的 sh.c 程序,随后我使用
find -iname “*.c” | vim - 查看了 Linux-0.11 目录下所有的 C 文件名字,没有看到类似于 shell.c bash.c sh.c 的文件,估计在 linux0.11 中,shell 程序是被嵌入在系统中的。

重要信息1:书接上回,上回书咱们说到,Linux 通过缺页中断处理过程,将 /bin/sh 的代码从硬盘加载到了内存,此时便可以正式执行 shell 程序了。(需要支持 硬盘驱动、文件系统、缺页中断)(Linux在启动过程中,会自动启动 /bin/sh,这个 /bin/sh 也可以是一个 Hello World 程序)

$PS1 环境变量是 shell 程序用来作为提示符的。在 bash 中,你可以修改这个环境变量来修改提示符的样式

如下是作者精简过的 xv6 sh.c 程序

// xv6-public sh.c
int main(void) {
    static char buf[100];
    // 读取命令
    while(getcmd(buf, sizeof(buf)) >= 0){
        // 创建新进程
        if(fork() == 0)
            // 执行命令
            runcmd(parsecmd(buf));
        // 等待进程退出
        wait();
    }
}

其实 shell 的原理非常好理解
1.从命令行接受一个命令
2.创建一个子进程,让子进程执行接收的命令
3.父进程等待子进程退出,随后继续循环接受命令,直到接收到 exit 之类的命令

重要信息2: 为了支持 shell 运行,我们还需要支持 fork, execve, wait 这三个系统调用。同时还要支持键盘驱动以输入字符,console/uart/vga 驱动来支持显示字符。还需要支持中断处理,这样操作系统才能够响应我们的键盘输入。

重要信息3: 针对 wait 这个系统调用。它做的事情是让 shell 程序进入停滞状态,随后让 (单核)CPU 去执行 execve 参数所指定的程序,也就是说我们的操作系统还需要支持 “进程调度”: 先把 shell 进程放入 waiting list,再去初始化和启动另外一个进程

好的,看完了。现在可以从 37 回往前看了。

总结一下,为了支持 shell 程序的执行,我们需要提供:
1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)
2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)
3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)
4.键盘驱动、VGA/console/uart 驱动、中断处理 (支持键盘输入和屏幕显示)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值