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);
      }

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

  • 相关阅读:
    soap-学习
    Redis教程
    Java 不可变对象
    java volatile
    Go语言
    mongodb 基础语法
    Linux 命令大全
    Java json字符串对比
    sqlserver 数据库阻塞和死锁
    http 和 https 的区别
  • 原文地址:https://www.cnblogs.com/douzujun/p/6436224.html
Copyright © 2011-2022 走看看