zoukankan      html  css  js  c++  java
  • (四)系统调用示例

    (四)系统调用示例

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

      • 获取输入文件名

        • 在屏幕显示提示

        • 等待并接收键盘输入

      • 获取输出文件名

        • 在屏幕显示提示

        • 等待并接收键盘输入

      • 打开输入文件

      • 如果文件不存在,出错退出

      • 创建输出文件

      • 如果文件存在,出错退出

      • 循环

        • 读取输入文件

        • 写入输出文件

      • 直到读取结束

      • 关闭输出文件

      • 在屏幕显示完成完成信息

      • 正常退出

    • 会用到的系统调用

      • 键盘输入

      • 屏幕输出

      • 文件输入输出

      • 以上都视为文件系统里的,只是说键盘和屏幕作为特殊的文件使用

      这里涉及到的系统调用是

      #define SYS_write 5
      #define SYS_read  6
      #define SYS_close 7
      #define SYS_open  10
    • 在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()使用示例

      • int sfs_filetest1.c:ret = read(fd, data, len);

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

      1. kern/trap/trapentry.S : alltraps()--获取中段所需要的相关信息组成的数据结构

      2. kern/trap/trap.c:trap()

        tf->trapno == T_SYSCALL : 系统调用对应中段向量.在trap()函数中转到下面

      3. kern/syscall/syscall.c:syscall()

        tf->tf_regs.reg_eax == SYS_read (系统调用标号==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()

        • ireturn 把相应返回值长度返回给用户态

    • ucore+系统调用代码

      static void safe_read(int fd, void *data, size_t len)
      {
          int ret = read(fd, data, len);
          assert(ret == len);
      }
      int sys_read(int fd, void *base, size_t len)
      {
          return syscall(SYS_read, fd, base, len);
      }

      //未完待续...........

  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/douzujun/p/6436224.html
Copyright © 2011-2022 走看看