设计和实现一个远程系统调用执行框架
系统调用(Syscall)作为操作系统对用户态提供的编程接口,通常是用户态进程和内核之间最底层的通信接口。 这里我们只考虑为Unix Like的系统平台做相关设计,在Unix Like环境上OS为每个特定的系统调用提供了系统调用编号, 通过栈和寄存器来传递系统调用的参数,通常系统调用服务的个数是有限的,并且libc为我们封装好了更加友好的系统调用接口。 这里以进程从文件中读取内容为例:
+--------+ +-------+
| Reader | | Linux |
+--------+ +-------+
| |
| open |
| ---------------> | +---------+
| | | |
| read | | |
| ---------------> | --------------> | Disk |
| | | |
| close | | |
| ---------------> | +---------+
| |
| |
本项目的目标是实现一个Remote Syscall执行框架,通过这个执行框架用户可以将客户端的一个指定进程的系统调用进行截获, 并转发到服务端上下文进行执行,然后将系统调用结果返回给客户端。项目的本质是为了实现一个远程系统调用模拟环境。
- 1、支持远程系统的调用的基本功能,能够将进程内特定的系统调用拉远到服务端执行并返回对应的结果。
+----------------+ +----------------+ +----------------+ +------------------+
| Reader process | | Syscall Client | | Syscall server | | Operating System |
+-------+--------+ +----------------+ +----------------+ +------------------+
| | | |
| stub_open | | |
| -------------------> | syscall_request | |
| | --------------------->| open |
| | | -------------------->|
| stub read | | | +----------+
| --------------------> | | | | |
| | syscall_reqeust | | | |
| | --------------------> | read | | disk |
| stub close | | -------------------> | -------------> | |
| --------------------> | | | | |
| | syscall_reqeust | | | |
| | --------------------> | | | |
| | | close | +----------+
| | | -------------------> |
| | | |
-
2、支持将某个特定的本地进程的所有系统调用拉远到服务端执行,使得本地进程能够执行在远程服务端上下文并返回正确的执行结果。
-
3、支持通过tcp或者virtio-vsock两种不同通信通道来传递系统调用,通信通道做到独立解耦。
-
1、支持对应用程序代码系统调用修改的方式,将应用程序的系统调用拉远到服务端上下文执行。
-
2、支持通过LD_PRELOAD,或者ptrace和ebpf规则的方式将进程内特定的系统调用,做到非侵入式系统调用拉远。
-
3、尽量简化服务端执行上下文的架构。
2022全国大学生操作系统比赛的“OS功能挑战”赛道
- 以小组为单位参赛,最多三人一个小组,参赛对象为全国普通高等学校全日制在校本科生和在校研究生,参赛队员的在校本科生或在校研究生身份均以报名时为准
- 如学生参加了多个项目,参赛学生选择一个自己参加的项目参与评奖
- 请遵循“2022全国大学生操作系统比赛”的章程和技术方案要求
方应 fangying.tommy@bytedance.com
高等
Remote Syscall相关参考资料
Syscall Proxying: https://markowsky.us/papers/exploits/SyscallProxying.pdf
完成基础功能和扩展功能的开发,并输出说明文档一篇。
注意:下面的内容是建议内容,不要求必须全部完成。选择本项目的同学也可与导师联系,提出自己的新想法,如导师认可,可加入预期目标
参考任务描述部分。