-
文件复制过程中的系统调用序列
-
获取输入文件名
-
在屏幕显示提示
-
等待并接收键盘输入
-
-
获取输出文件名
-
在屏幕显示提示
-
等待并接收键盘输入
-
-
打开输入文件
-
如果文件不存在,出错退出
-
创建输出文件
-
如果文件存在,出错退出
-
循环
-
读取输入文件
-
写入输出文件
-
-
直到读取结束
-
关闭输出文件
-
在屏幕显示完成完成信息
-
正常退出
-
-
会用到的系统调用
-
键盘输入
-
屏幕输出
-
文件输入输出
-
以上都视为文件系统里的,只是说键盘和屏幕作为特殊的文件使用
这里涉及到的系统调用是
#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)的实现
-
kern/trap/trapentry.S : alltraps()
--获取中段所需要的相关信息组成的数据结构 -
kern/trap/trap.c:trap()
tf->trapno == T_SYSCALL
: 系统调用对应中段向量.在trap()函数中转到下面 -
kern/syscall/syscall.c:syscall()
tf->tf_regs.reg_eax == SYS_read
(系统调用标号==read) -
kern/syscall/syscall.c:sys_read()
(这些参数就会转到相应的系统调用实现里头)从(堆栈)tf->sp获取(当初填进堆栈的)fd,buf,length
(已经从用户态转到内核态,再做相应的函数实现即可) -
kern/fs/sysfile.c:sysfile_read()
-
读取文件-直接操作底下的驱动程序
-
-
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); }
//未完待续...........