(四)系统调用示例

(四)系统调用示例

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

    • 获取输入文件名

      • 在屏幕显示提示

      • 等待并接收键盘输入

    • 获取输出文件名

      • 在屏幕显示提示

      • 等待并接收键盘输入

    • 打开输入文件

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

    • 创建输出文件

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

    • 循环

      • 读取输入文件

      • 写入输出文件

    • 直到读取结束

    • 关闭输出文件

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

    • 正常退出

  • 会用到的系统调用

    • 键盘输入

    • 屏幕输出

    • 文件输入输出

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

    这里涉及到的系统调用是

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

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

posted @ 2017-02-24 00:21  douzujun  阅读(900)  评论(0编辑  收藏  举报