1 Star 0 Fork 0

WHC/xv6-course

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

进程创建

究竟什么是进程

进程是一个抽象概念,它是操作系统对计算资源的抽象

  1. 编译时程序可以假设它独占一台机器,编译器在编译时就可以产生固定的地址
    cc hello.c
        
  2. 操作系统需要管理所有用户提交的程序,所以抽象出进程的概念
    top
        
  3. 编译好的程序 (a.out) 执行代码相当于与把控制权交给操作系统
    • 操作系统会给 a.out 分配虚拟地址空间,通过分页机制使得进程彼此隔离
      • a.out 静态的 / 文件
      • process 动态的 / 运行的 CPU
    • 同一个 a.out 在不同时刻运行产生的实体(也就是进程),拥有自己的资源
      • CPU 时间片
      • 地址空间 (分页)
      • 相关属性 (pid), 在 xv6 中的 struct proc 结构体
        • pid
        • parent id: ppid fork()
      • 打开的文件
    • 进程在内核态和用户态上下文切换时需要保存一些状态
      • p->kstack 内核栈
      • p->state 进程状态
        enum procstate { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
                    

file:../../study/os/xv6-public/proc.h::struct proc {

创建第一个进程

  1. userinit 创建第一个进程
  2. allocproc() 分配进程数据结构体 proc
    • ptable 记录所有进程表
    • 查找到 proc 结构体, 设置 p->state = EMBRYO
    • 分配内核栈 p->kstack, 页面大小 KSTACKSIZE
               |             |
    0x8e000000 |-------------| TOP STACK (total KSTACKSIZE(4K))
               |    esp      |
               |    ...      |
               |    eip      |
               |    ...      |
               |    edi      |
    0x8dffffb4 |-------------| <- p->tf
               |  trapret    | (0x80105852)
               |-------------|
               |    eip      | <= fork() return address
               |             |
               |    ...      |
               |    edi      |
    0x8dffff9c |-------------| <- p->context
               |             |
               |             |
               |   (empty)   |
               |             |
               |             |
    0x8dfff000 |-------------| <- p->kstack
               |             |
        
  3. setupkvm 初始化页表
    • p->pgdir 0x8dffe000
  4. inituvm 初始化, 加载用户代码
    • 地址范围 0 ~ PGSIZE
    • memmove 复制数据
    make -nB | grep -i initcode
        
    gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie -no-pie -nostdinc -I. -c initcode.S
    ld -m    elf_i386 -N -e start -Ttext 0 -o initcode.out initcode.o
    objcopy -S -O binary initcode.out initcode
    objdump -S initcode.o > initcode.asm
    ld -m    elf_i386 -T kernel.ld -o kernel entry.o bio.o console.o exec.o file.o fs.o ide.o ioapic.o kalloc.o kbd.o lapic.o log.o main.o mp.o picirq.o pipe.o proc.o sleeplock.o spinlock.o string.o swtch.o syscall.o sysfile.o sysproc.o trapasm.o trap.o uart.o vectors.o vm.o  -b binary initcode entryother
        
  5. 设置 p->state = RUNNABLE
  6. ptable->proc[] 数组插入 RUNNABLE proc 结构体
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/whc_softHardware/xv6-course.git
git@gitee.com:whc_softHardware/xv6-course.git
whc_softHardware
xv6-course
xv6-course
master

搜索帮助