系统调用示例

系统调用示例

  • 文件复制过程中的系统调用序列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    源文件 ----------------> 目标文件
    获取输入文件名
    在屏幕显示提示
    等待并接受键盘输入
    获取输出文件名
    在屏幕显示提示
    等待并接受键盘输入
    打开输入文件
    如果文件不存在,出错并退出
    创建输出文件
    如果文件存在,出错并退出
    循环
    读取输入文件
    写入输出文件
    直到读取结束
    关闭输出文件
    在屏幕显示完成信息
    正常退出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    System call numbers
    #define SYS _fork 1
    #define SYS _exit 2
    #define SYS _wait 3
    #define SYS _pipe 4
    #define SYS _write 5
    #define SYS _read 6
    #define SYS _close 7
    #define SYS _kill 8
    #define SYS _exec 9
    #define SYS _open 10
    #define SYS _mknod 11
    #define SYS _unlink 12
    #define SYS _fstat 13
    #define SYS _link 14
    #define SYS _mkdir 15
    #define SYS _chdir 16
    #define SYS _dup 17
    #define SYS _getpid 18
    #define SYS _sbrk 19
    #define SYS _sleep 20
    #define SYS _procmem 21
  • 在ucore中库函数read()的功能是读文件

    • user/libs/file.h: int read(int fd, void * buf, int length)
  • 库函数read()的参数和返回值

    • int fd-文件句柄
    • void * buf-数据缓冲区指针
    • int length-数据缓冲区长度
    • int return_value:返回读取数据长度
  • 库韩式read()使用示例

    • in sfs_filetest1.c: ret = read(fd, data, len);
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      sfs_filetest1.c: ret = read(fd, data, len);
      ......
      8029a1:8b 45 10 mov 0x10(%ebp),%eax
      8029a4:89 44 24 08 mov %eax,0x8(%esp)
      8029a8:8b 45 0c mov 0xc(%ebp),%eax
      8029ab:89 44 24 04 mov %eax,0xc(%esp)
      8029af:8b 45 08 mov 0x8(%ebp),%eax
      8029b2:89 04 24 mov %eax,(%esp)
      8029b5:e8 33 d8 ff ff call 8001ed <read>
      syscall(int num, ...){
      ...
      asm volatile(
      "int %1;"
      : "=a" (ret)
      : "i" (T_SYSCALL),
      "a" (num),
      "d" (a[0]),
      "c" (a[1]),
      "b" (a[2]),
      "D" (a[3]),
      "S" (a[4])
      :"cc", "memory" );
      return ret;
      }

ucore系统调用read(fd, buffer, length)的实现

  1. kern/trap/trapentry.S: alltraps()
  2. kern/trap/trap.c: trap()
    tf->trapno = = T_SYSCALL
  3. kern/syscall/syscall.c: syscall()
    tf->tf_regs.reg_eax = = SYS_read
  4. kern/syscall/syscall.c: sys_read()
    从 tf->sp 获取 fd, buf, length
  5. kern/fs/sysfile.c: sysfile_read()
    读取文件
  6. kern/trap/trapentry.S: trapret()