系统调用示例
系统调用示例
文件复制过程中的系统调用序列
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
22System 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
25sfs_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;
}
- in 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 - kern/syscall/syscall.c: syscall()
tf->tf_regs.reg_eax = = SYS_read - kern/syscall/syscall.c: sys_read()
从 tf->sp 获取 fd, buf, length - kern/fs/sysfile.c: sysfile_read()
读取文件 - kern/trap/trapentry.S: trapret()