nachos操作系统(八)

那么你就要知道,如何在一个程序里面运行下一个程序,完成之后还能回到这个程序?

就对于linux系统而言,它还是多进行 ,肯定 是linux永远执行的,其他程序依次调用进cpu,cpu肯定只有一个,它调用一个程序,那么linux系统此时肯定不执行,难道就是说,一旦某一个程序在cpu里面卡住,它还能不执行了不成?

因此,从这个角度来看,linux与其他进程无异,就是其他程序 运行完毕后,调用中断给linux,然后linux执行一次调度,然后linux再次沉睡,就是这样,怪我30天操作系统没有到达写程序的那一天,不然这些概念就很清晰了。

Nachos中使用mips模拟cpu的功能。原因是,如果使用真实的cpu硬件,其中页表切换等操作是由硬件直接完成的,而非可视化的代码。所以,为了学习操作系统的原理,nachos使用了mips来模拟cpu的指令集,由此可以模拟硬件底层原理。
使用nachos运行用户程序时必须先安装mips。

然后你编写一个带有main函数的cc脚本,然后用mips编译之,变成noff文件,然后用nachos -x 文件名,就可以执行这段代码了。

这个noff文件,仍然是一个汇编文件,而不是真正的二进制文件,它在machine/mipssim文件中,提供了解析汇编代码,并用switch+case的方法,提取运算符,寄存器变量,进而操作,赋值给machine实例中的寄存器变量,因此它完全没有涉及到底层二进制的东西。

syscall是一个汇编命令,当解析到这条指令的时候,就会交给异常处理函数去执行,也就是之前提到过的那个异常处理函数,它可以执行程序,而exec和exit,就在这个程序里进行。

虽然在汇编文件中,有exec,exit函数的定义,但是好像我们还要自己实现c语言的代码,毕竟,那些汇编文件中仅仅实现的是压入寄存器二有什么数据,然后调用syscall,然后在machine中的mipssim的解析脚本函数解析到syscall,就会转到异常处理函数,异常处理函数通过寄存器二明白这是什么调用,是exec或者exit,然后在这里进行代码编写。那文件名是哪里来的?

首先,我们通过 nachos -x 文件名的方法,文件名被传给main,在main中解析完毕后,就会直接调用exec进行执行,因为exec的参数就是文件名,根据name指向的地址打开可执行文件,创建AddrSpace,再fork出一个新的线程,将其内存空间设为刚创建的AddrSpace对象,目标函数中,对AddrSpace对象调用InitRegister和RestoreState方法,设置好虚拟机寄存器、内存空间的状态,调用machine->Run()执行。而执行系统调用的线程在fork出新线程后,将SpaceID返回,然后调用AdvancePC使pc寄存器的值前进,避免循环。

那么系统调用在哪里?二者完全搭不上边啊?这里有两个问题,第一个是执行exec它会直接到达汇编代码吗?第二个是在exec汇编代码中它是怎么存储文件名参数的?

而我们的参数不能以直接转换成指针的形式从内存中读取,原因是这里的内存地址实际上是虚拟机的内存,而转换成指针形式的内存地址是真实机器中的地址。所以读取要用machine->ReadMem(int addr,int size,int *value)方法。而读取字符串,则需要循环至读取到\0为止。

在main里, -x 是运行StartProcess(char *file)这么一个函数,这个函数没写。。。首先说,extern与include本身是毫不相干的两个概念。

你先要在main里的有关于thread中的东西都删掉,然后还不行,还要在makefile引进执行相关文件,才行,今天就先到这里。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值