1 Star 0 Fork 1

louislin19/course-xv6

forked from 殊蕤/xv6-course 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
34-enter-shell.org 2.03 KB
一键复制 编辑 原始数据 按行查看 历史
殊蕤 提交于 2023-11-16 22:54 . add

从 initcode 到 shell 启动

从 initcode.S 到 init.c

../../study/os/xv6-public/initcode.S

  1. 调用 exec 系统调用加载 sh 启动用户 shell
  2. 通过系统调用 exec() 执行 /init 文件
make -nB fs.img | sed 's/gcc.*-c/gcc -c/' | grep init
gcc -c -o init.o init.c
ld -m    elf_i386 -N -e main -Ttext 0 -o _init init.o ulib.o usys.o printf.o umalloc.o
objdump -S _init > init.asm
objdump -t _init | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > init.sym
./mkfs fs.img README _cat _echo _forktest _grep _init _kill _ln _ls _mkdir _rm _sh _stressfs _usertests _wc _zombie

init.c 到 sh.c

../../study/os/xv6-public/init.c

init.c 运行 shell

  1. 打开 console 文件
  2. 设置 stdout, stderr
  3. 循环创建 shell
    • fork 子进程启动 sh
    • 父进程等待
    • 如果子进程退出,则重新拉起 sh

sh.c 执行,系统启动

调用 sh.c 实现用户 shell

  1. 检测 console 文件打开
  2. 死循环执行命令
    • 获取命令 getcmd
    • cd 命令的特殊处理
    • fork1 创建子进程
      • 父进程循环
      • 子进程解析命令并运行命令

../../study/os/xv6-public/sh.c

总结

  1. initcode (kernel)
  2. int 0x40 (exec) => init.c
  3. init.c (exec) => sh.c
    • open
  4. sh.c (shell)
    1. 检测 console 文件打开
    2. 死循环执行命令
      • 获取命令 getcmd
      • cd 命令的特殊处理
      • fork1 创建子进程
        • 父进程循环
        • 子进程解析命令并运行命令
(gdb) xv-ps
ptable.proc[0]: pid=1 state=2 name=init
ptable.proc[1]: pid=2 state=2 name=sh
ptable.proc[2]: pid=4 state=2 name=sh
ptable.proc[3]: pid=5 state=4 name=wc

init(1)
  |
  --- sh(2)
      |
      |--- sh(4)
           |
           --- wc(5)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/louislin19/course-xv6.git
git@gitee.com:louislin19/course-xv6.git
louislin19
course-xv6
course-xv6
master

搜索帮助