操作系统绪论
操作系统和Linux资源
《硬件视角的操作系统 (CPU Reset;固件;为硬件编程) [南京大学2023操作系统-P3] (蒋炎岩)》
我学到了啥?(因为我基础太差感觉什么也没学到)
这节课主要是告诉我们操作系统本身没有我们想的那么难
具体想要实现老师的代码我还有再学一段时间(连汇编都没学的我)
同时硬件是如何开始运行程序的
即状态机的初始状态是谁给的?



Bare-metal 是裸机的意思,FirmWare是固件的意思,BIOS是"Basic Input Output System"的缩略词
它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,
其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
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来讲状态交给操作系统(系统调用)
和操作系统对系统调用的类型进行反应
问题集:
sudo -s # 这个指令是什么意思?
2.linux下如何按照gcc 编译器?
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 或者 再带一点参数的
或者根本不同的,到底这之间的原理是什么?

浙公网安备 33010602011771号