图灵机
当系统中有一个CPU的时候 ,MR就是它的状态
当系统中有n个CPU的时候,MR1,MR2…MRn 是它的状态
IRQ和NMI是低电平有效信号
NMI不可屏蔽中断
6502的CPU一共40个引脚
eflags寄存器里的 IF 表示 interrupt enable
1表示可以响应中断,0表示关中断
如果IF=0,程序又处于死循环,
那么这个处理器就相当于从操作系统离线了。
中断处理程序所做的事情,只有跳转
处理器如何处理中断:允许软件把代码放到中断处理位置,处理器接收中断信号的时候会把PC跳转到中断处理位置。
RISC-V的中断处理
中断保存
32个寄存器,PC计数器
CPU状态(是一个寄存器)
指令的计数(每个周期+1)
时钟计数
中断相关寄存器
中断地址中断原因
cte_init 定义在中断发生的时候,执行什么函数
iset 设置开关中断(IF)
程序在保护状态执行的时候无法关中断,会被操作系统直接中断,产生异常
中断时:额外开辟一块内存,把寄存器存到内存里
64位所有通用寄存器,cr3寄存器,都存到内存里了
x86所有通用寄存器,cr3寄存器,都存到内存里了
特殊寄存器
rip 【指向代码】:rip寄存器是一个64位的寄存器,用来存储下一条要执行的指令的地址。它是在64位模式下才有的,相当于32位模式下的eip寄存器。rip寄存器可以实现一种新的寻址模式,叫做rip相对寻址,就是用rip加上一个偏移量来计算有效地址。
rsp【指向堆栈】:rsp寄存器是一个64位的寄存器,用来存储当前函数调用的栈栈顶的地址。它是在64位模式下才有的,相当于32位模式下的esp寄存器。rsp寄存器可以用来保存函数的局部变量、参数、返回地址等信息,方便函数的调用和返回。
rbx【指向内存地址】:rbx寄存器是一个64位的基址寄存器,一般用于访问内存的基址。它是被调用者保存的寄存器,也就是说在函数调用时,如果要使用它,必须先保存它的原始值,然后在函数返回时恢复它。
rbp【指向内存地址】rbp寄存器是一个64位的栈帧指针,用于标识当前栈帧的起始位置。栈帧是函数调用时在栈上分配的一块内存空间,用来保存函数的局部变量、参数、返回地址等信息。rbp寄存器可以通过偏移量来访问栈帧中的数据。它也是被调用者保存的寄存器。
进程
不断触发一个软件中断
中断先由操作系统保存运行状态,然后交给软件的中断处理程序,并把Context和Event都给出来。
进程和线程的区别
每个线程都有独立的寄存器和堆栈
每个进程也有独立的寄存器和堆栈
但是进程之间不共享内存
进程对于有些寄存器是可见不可改的,自己内存空间之外的部分,都是不可见的。
给每个线程划定内存空间,就得到一个多进程的操作系统
通过CPU给的虚拟内存机制,划定进程空间
复制进程 fork (Unix)
返回值不同
直接执行输出6个hello
放到管道里就会输出8个hello(因为被放到输出缓冲区,每次输出2个hello)
_exit会把所有线程销毁
syscall exit 只会销毁当前一个线程
Android底层也是linux
操作系统启动:先创建initramfs进程,然后加载磁盘,之后加载网卡驱动配置IP