xv6 Shell & OS organization
Shell & OS organization主题: 概述图用户态如何连接内核态应用程序 - > printf() - > write ) - > SYSTEM CALL - > sys_write() - > ... 用户级库是应用程序的私有业务 内核内部函数不能由用户调用 进程的状态,进程和线程区别是什么??process=address space + thread(s)?? 计算机系统进程由以下资源组成(或被称为拥有):
进程和线程的一个简单解释 系统调用xv6有几十个系统调用,而今天的Linux系统有几百个系统调用。 让我们回顾家庭作业2(sh.c)为什么两个execv()参数?execv 函数原型:execv(char cmd,char argv[]); /* 执行/bin/ls -al /etc/passwd */
#include <unistd.h>
main()
{
char * argv[] = {"ls","-al","/etc/passwd",(char*)};
execv("/bin/ls",argv);
}
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中. 重定向以下是可以用来重定向的命令的完整列表: pgm > file pgm 的输出被重定向到文件
pgm pgm 程序从文件度它的输入
pgm >> file pgm 的输出被添加到文件
n > file 带有描述符 n 的输出流重定向到文件
n >> file 带有描述符 n 的输出流添加到文件
n >& m 合并流 n 和 流 m 的输出
标准输入从开始行的下一个标记开始。 管道ls | wc -l 如果ls产生的输出比wc消耗的更快呢? 如果ls比wc慢,该怎么办? 每个命令如何决定何时退出? 如果读者没有关闭写入结束呢?[尝试一下] 如果作者没有关闭阅读结束呢? 内核如何知道何时释放管道缓冲区? shell如何知道管道何时完成?例如: ls | sort | tail -l 通过递归调用来解决先后完成的层次逻辑。 parsepipe(char **ps,char *es)
{
struct cmd *cmd;
cmd = parseexec(ps,es);
if(peek(ps,es,"|")){
gettoken(ps,0,0);
cmd = pipecmd(cmd,parsepipe(ps,es));
}
return cmd;
}
UNIX系统调用观察fork / exec拆分看起来很浪费 - fork()拷贝memory而exec()丢弃。为什么不使用 pid = forkexec(path,argv,fd0,fd1) ? 文件描述符设计:
Philosophy:小概念上简单的调用结合起来,
为什么必须内核支持管道 - 为什么不用shell来模拟它们,
猜测:如果用sh代替管道 执行的指令数,空间,时间都会变多。 系统调用接口简单,只是中断和字符缓冲区。为什么不用open()函数返回一个指向内核文件对象的指针?ps:如果返回指针则能从用户层直接修改内核对象 核心的UNIX系统调用是古老的; 他们保持得好吗?一方面来讲是非常成功的,历经多年的发展 :设计迎合了命令行和命令行开发 命令行用户,如命名文件,管道, 对于开发,调试,服务器维护都很重要 但另一方面UNIX思路并不完美:
系统调用API,程序员使用库通常不是很有价值,例如,隐藏sys调用细节的Python,
或者在智能手机上 应用程序可能与文件&c一些UNIX抽象是不是非常有效
而且fork()对于多GB进程是非常慢的
FDs隐藏的细节可能是重要的,
例如块大小的磁盘上的文件,
例如时间和网络消息的大小,
所以有很多将来的计划工作: 新的抽象的系统调用对于已有的系统调用 OS组织如何实现一个系统调用接口?为什么不是使用一个库?即没有内核,只需在硬件上直接运行app +库即可。 内核的关键要求:隔离 helpful approach: abstract resources rather than raw hardwareFile system,not raw disk 从隔离开始,因为这往往是最严格的要求。隔离目标:应用程序不能直接与硬件交互 处理器提供帮助隔离的机制硬件提供用户模式和内核模式 内核构建在硬件隔离机制上操作系统以内核模式运行 应用程序运行在用户模式 内核里要放什么?
微内核设计- 许多操作系统服务作为普通用户程序 在文件服务器 - 内核实现在用户空间运行服务的最小机制 使用内存进程间通信(IPC) - 内核接口!=系统调用接口 -优点:多个隔离 -缺点:可能很难获得好的性能 外核:没有抽象apps can use hardware semi-directly,but O/S isolates 应用程序可以读/写自己的页表,但是需要O / S审核 应用程序可以读/写磁盘块,但是O / S是块的所有者是 优点:对要求苛刻的应用程序有更多的灵活性 jos将是微内核和exokernel的混合 Next Lecture:x86硬件的隔离机制和xv6如何使用他们 参考: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |