1 Star 0 Fork 1

louislin19/course-xv6

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

系统调用流程分析

syscall 到 exec 调用

  1. syscall 处理系统调用
    • 获取当前执行进程
    • 从系统调用表 syscalls 中调用系统调用函数 sys_exec
  2. sys_exec
    • 检查
    • 获取 argv
    • 调用 exec
  3. exec

exec() 系统调用

void exec(init, argv)
  1. 创建用户地址空间
  2. 从磁盘加载 path 文件, 到内存中
    • 打开文件, namei
    • 读取 ELF 头, readi
      readelf -h _init
              
      ELF Header:
        Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
        Class:                             ELF32
        Data:                              2's complement, little endian
        Version:                           1 (current)
        OS/ABI:                            UNIX - System V
        ABI Version:                       0
        Type:                              EXEC (Executable file)
        Machine:                           Intel 80386
        Version:                           0x1
        Entry point address:               0x0
        Start of program headers:          52 (bytes into file)
        Start of section headers:          14252 (bytes into file)
        Flags:                             0x0
        Size of this header:               52 (bytes)
        Size of program headers:           32 (bytes)
        Number of program headers:         2
        Size of section headers:           40 (bytes)
        Number of section headers:         18
        Section header string table index: 17
              
    • 解析代码段, readi/allocuvm/loaduvm
      readelf -l _init
              
      
      Elf file type is EXEC (Executable file)
      Entry point 0x0
      There are 2 program headers, starting at offset 52
      
      Program Headers:
        Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
        LOAD           0x000080 0x00000000 0x00000000 0x00b2c 0x00b38 RWE 0x10
        GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x10
      
       Section to Segment mapping:
        Segment Sections...
         00     .text .rodata .eh_frame .data .bss
         01
              
  3. 申请用户堆栈页面, allocuvm
  4. 设置参数 args, 准备堆栈, copyout
  5. 提交用户态,跳转用户态, switchuvm
    • elf.entry
    • pgdir
    • eip/esp
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/louislin19/course-xv6.git
git@gitee.com:louislin19/course-xv6.git
louislin19
course-xv6
course-xv6
master

搜索帮助