os-code-virtualization
All code is taken from NJU-2024-operation-system by jyy. please check https://jyywiki.cn/OS/2024/
forked-code: https://github.com/Cookiecoolkid/jyyos/tree/master/virtualization
PIPE ⭐️⭐️⭐️
- named pipe
- anonymous pipe
- 推荐做课程实验 M5
sperf
对于 named pipe,我们可以通过 mkfifo 系统调用来创建一个命名管道,然后通过 open 来打开这个管道(读口采用 O_RDONLY,写口采用 O_WRONLY),然后就可以通过 read 和 write 来进行读写操作。 示例代码:
1 | |
对于 anonymous pipe,可以通过 pipe 系统调用来创建一个匿名管道(读口写口参数为size = 2的数组 int pipefd[2]),然后通过 fork 来创建一个子进程,通过 close 来关闭不需要的文件描述符,然后就可以通过 read 和 write 来进行读写操作。
dup2可以复制管道的读写端- 文件描述符是一个用于访问文件或其他输入/输出资源的 “指针”
示例代码:
1 | |
sh ⭐️⭐️⭐️
- 这个 Shell 没有引用任何库文件——它只通过系统调用访问操作系统中的对象。
下面为程序主要部分:
程序入口:
1 | |
- 结构体定义及主要命令处理函数:
1 | |
可以看到将 shell 的命令分为了 EXEC、REDIR、PIPE、LIST、BACK 五种类型: - EXEC 为执行命令 - REDIR 为重定向命令 - PIPE 为管道命令 - LIST 为列表命令 - BACK 为后台命令
重点看看对于 PIPE 的处理.
1 | |
dlbox ⭐️⭐️⭐️
dlbox是一个简单的动态链接库加载器,它可以加载并运行动态链接库中的函数。- 对于其中所有的符号都采取"查表"的方式,而不是直接调用函数,这与 GOT(全局偏移表)的工作方式类似。
对于 dl.h:
1 | |
dl.h 对于直接汇编语言编写的代码定义了一些宏,如动态链接库的头部、代码段、结束标记、符号表记录等。对于 C 语言代码,定义了动态链接库头部和符号表记录的结构体。 - DL_HEAD 定义了动态链接库的头部,包括魔数、文件大小和代码段偏移量,在 DL_HEAD 与 DL_CODE 之间的部分写入符号表. - DL_CODE 定义了代码段的起始位置,DL_END 定义了代码段的结束位置。 - LOAD 用于加载动态链接库,IMPORT 导入符号,EXPORT 导出符号,DSYM 调用符号(表示出了符号的地址)
如下面的汇编代码所示:
1 | |
定义了 dl.h 结合 dlbox.c 来使用:
1 | |