操作系统绪论

操作系统和Linux资源

  1.VMware下载

    2.Ubuntu下载

  3.c语言的编译使用

 

硬件视角的操作系统 (CPU Reset;固件;为硬件编程) [南京大学2023操作系统-P3] (蒋炎岩)

  我学到了啥?(因为我基础太差感觉什么也没学到)

 

  这节课主要是告诉我们操作系统本身没有我们想的那么难

    具体想要实现老师的代码我还有再学一段时间(连汇编都没学的我)

 

  同时硬件是如何开始运行程序的

    即状态机的初始状态是谁给的?

 

 

    

 

         Bare-metal 是裸机的意思,FirmWare是固件的意思,BIOS是"Basic Input Output System"的缩略词

      其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,

      它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,

      它可从CMOS读写系统设置的具体信息。

       其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

 

       CPU Reset是CPU复位,即重启或再启动电脑时,生产CPU的厂家会固定一个地址

      然后CPU复位时,CPU的PC就会指向这个地址

      然后固件上的代码就会到这个地址上,然后指令开始调动,程序开始跑起来了

 

    

 

         这个为我们直接用硬件写程序成为可能,我们可以将代码直接写到CPU复位后PC的地址

 

Python 建模操作系统----全部资料来自蒋炎岩老师

  

 

 

 

 

 

 

     在一个简单的C程序中都到处存在系统调用:

    如一个简单的Hello World

#include<stdio.h>
int main()
{
    printf ("Hello World");
    return 0;
}

 

    如果不存在系统调用,程序是无止境运行的

   如上正是因为有了printf底层系统调用(syscall),状态(输出的状态或者显示屏的状态)发生改变

   因为有了return底层系统调用,状态机才从“计算”中解放出去,即程序完结

  

  可以用python模拟系统调用的API和状态的计算

  

 

 

     这里要先介绍一下python中yield这个关键字

    他可以模拟一个程序调用系统调用,将这个程序目前的状态和操作权交给操作系统的行为

     操作系统进而可以对程序进行管理

          如上程序为例,了解一下yield

 

      当程序执行到这条程序时,

 

 

       numbers()这个函数返回了一个生成器(generator)

       这个时候n就是得到这个生成器,语法:n.send(None),开始的时候一定要先send一个None

       作用是恢复原来的状态

      接下来的send(x),这个x都会传给ret,然后接着上面numbers()函数还未执行完的语句继续执行

       然后i+=ret,然后直到再遇到yield,重复上面的过程

 

# ! os-model.py
import sys
import random

""""这是一个系统库:"""
from pathlib import Path


class OperatingSystem():
"""A minimal executable operating system model."""

SYSCALLS = ['choose', 'write', 'spawn', 'sched']

class Thread:
"""A "freezed" thread state."""
# ! func是生成器generator
def __init__(self, func, *args):
# ! 生成一个还未启动的状态机
self._func = func(*args)
# !状态机的状态
self.retval = None

def step(self):
"""Proceed with the thread until its next trap."""
syscall, args, *_ = self._func.send(self.retval)
self.retval = None
return syscall, args

def __init__(self, src):
variables = {}
# ! exec能够直接运行字符串中的python语句
# ! 后面的variables 是字典形的存放参数的地方(这个参数是src串中的参数)
exec(src, variables)

'''for key,value in variables.items():
print (f'{key} : {value}\n')'''

self._main = variables['main']

def run(self):
threads = [OperatingSystem.Thread(self._main)]
while threads: # Any thread lives
try:
# ! 当前执行的进程一直都是threads[0]
match (t := threads[0]).step():
case 'choose', xs: # Return a random choice
t.retval = random.choice(xs)
case 'write', xs: # Write to debug console
print(xs, end='')
case 'spawn', (fn, args): # Spawn a new thread
threads += [OperatingSystem.Thread(fn, *args)]
case 'sched', _: # Non-deterministic schedule
random.shuffle(threads)
except StopIteration: # A thread terminates
threads.remove(t)
# ! 将列表中的顺序打乱:
random.shuffle(threads) # sys_sched()


if __name__ == '__main__':
# !sys.argv得到的是脚本名(argv[0]),以及后面跟上的参数:
if len(sys.argv) < 2:
# ! 字符串中加上f,可以让被{}包裹的变量被认为是参数:
print(f'Usage: {sys.argv[0]} file')
exit(1)

# ! Path是来自pathlib的方法,其可以得到参数中的文件地址,read_txt()可以快速读取到文件中的内容
src = Path(sys.argv[1]).read_text()
for syscall in OperatingSystem.SYSCALLS:
src = src.replace(f'sys_{syscall}', # sys_write(...)
# ! 使用这个yield 关键字,当程序碰到yield 程序先停止
# !
f'yield "{syscall}", ') # -> yield 'write', (...)

OperatingSystem(src).run()
 

 结合如下代码,执行:python os-model.py hello.py,来解释一下

# ! hello.py
def
main(): sys_write('Hello, OS World\n') # sys_write -> print sys_write('Hello, CILINMENGYE\n')

  首先os-model.py将hello.py当做参数,,保存在sys.arg[1]中

 

 

  然后

  得到程序的状态机 

 

  可以通过self._func实现对程序状态的调用和继续

   到此为止一切准备工作完成,

 

  接下来通过程序中的yield来讲状态交给操作系统(系统调用)

   和操作系统对系统调用的类型进行反应

   

sys,  pathlib

 

 

 

   

 

 

问题集:

1.linux权限不够怎么办?

  sudo -s # 这个指令是什么意思?

2.linux下如何按照gcc 编译器?

  1.linux如何下载yum?

    1.apt-get install build-essential 这个指令是什么意思?
    2.yum又如何配置?

  2.命令:$sudo apt install gcc

    为啥可以用这么简单的指令按照gcc?

    sudo apt 是啥意思?

    如何下载既可以编译c(gcc)和c++ (g++) 的编译器GCC?

 

    解释:

      

 

 

           

             

 

           所以yum 与 apt 命令都是软件包管理器,只是用于不同的linux 版本而已

      在使用这个的时候需要我们自己配置源

    

 

   3.linux tmux 这个好像是个文本编辑器,到底是干啥用的?

  4.linux gdb 这个好像是一个调试用的,到达是干啥用的?

  5.linux 中的指令ld是干啥的?

  6.objdump -d xxx

    这个objdump 好像是个工具,他好像可以看c的二进制文件,到达是怎么用的?

  7.以Ubuntu 为例,linux中如何解压.tar.gz文件?(我看到网上各种版本都有)

  8.在linux中软件的下载方式到达有哪些?

   在各种资料里有apt-get install 或者 再带一点参数的

      或者根本不同的,到底这之间的原理是什么?

 

posted @ 2023-02-24 09:36  次林梦叶  阅读(64)  评论(0)    收藏  举报