计算机基础学习笔记
1、计算机关键组件:
(1)存储程序计算机:冯诺依曼体系,CPU、总线和内存
(2)函数调用堆栈:堆栈是C语言运行时一个必需的记录调用路径和参数的空间,保证函数的按顺序执行
(3)中断机制:支持系统同时跑多个程序,每个程序都有自己的执行流,当1个中断信号发生时,CPU将当前程序的运行信息压到CPU堆栈中,并将EIP指向另一个程序的执行入口。
2、操作系统关键功能:进程管理、内存管理、文件系统
(1)进程(进程相关数据结构包括进程ID、进程状态、内核堆栈、任务入口、把进程用链表链起来)上下文切换:EIP和ESP堆栈指针(栈顶地址ss:esp、状态字eflgs、cs:eip值)的值调整
(2)中断上下文切换:与进程上下文类似,进入中断程序前,保存前一程序的寄存器数据(栈顶地址ss:esp、状态字eflgs、cs:eip值)到内核堆栈,加载中断程序的入口(cs:eip、ss:eip)(中断服务中可能包含进程调度,参考进程上下文切换),退出中断程序后,恢复保存寄存器的数据
3、linux系统调度
(1)区分用户态和内核态
1)CPU有几种不同的指令执行级别,在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态,相应的低级别执行状态,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动。(所有程序员写的代码都允许使用特权指令的话,容易崩溃。内核代码由更专业的程序员写的,更稳定,不易崩溃)x86 CPU 有0-3级别,linux使用0级表示内核态,3级使用用户态。
2)cs寄存器的最低两位表明当前代码的特权等级,cpu读取每条指令根据cs(代码段选择寄存器):eip(偏移量寄存器)这两个寄存器。一般来说,linux地址空间有4G进程地址空间,0xC0000000以上的只能在内核态访问,0x00000000-0xbfffffff之间的只能在用户态访问。
3)中断时从用户态进入内核态的主要方式:用户态执行过程中,来了1个硬件中断或者系统调用,需要进入内核台态执行相关的处理
(2)系统调度:操作系统为用户态进程与硬件交互提供了一组接口,通过软中断向内核发起请求,可把用户从底层的硬件编程中解放出来,极大的提高了系统的安全性(防止系统崩溃),使用户程序具有可移植性(与硬件解耦)
(4)linux进程
1)进程状态机
1)获取CPU的调度权,为TASK-RUNNING运行,否则处于TASK-RUNNING就绪

2)PID进程标识
3)所有进程链表struct list_head tasks:进程的双向循环链表,快速查询使用哈希
4)父子关系描述
5)linux为每个进程分配1格8KB大小的内存区域,用于存放该进程两个不同的数据结构,Thread_info(记录执行到那个位置了,对应CPU的IP和SP)和进程的内核堆栈
6)CPU相关的数据
7)文件系统和文件描述符
8)内存管理-进程的内存空间
2)进程的创建过程(使用fork系统调用)
1)fork的子进程从哪开始执行:从fork return处
2)可执行程序:shell调用execve将命令行参数和环境变量传递给可执行环境的main函数,调用fork通过子进程,传递进去
如:int man(int argc, char *argv[],char *env[])
3)静态链接程序直接传入变量或者环境变量即可,动态链接程序分为装载时动态链接或运行时动态链接,动态链接库都是EFK格式的文件,
4)进程的调度:调度策略是一组调度规则,决定什么时候以什么样的方式选择1个新进城运行;schedule()函数进程调度的时机包括:时钟中断等,用户态进程无法主动调度,只能等中断,内核线程可以主动调度
(5)linux系统运行的一般过程:每次进程切换都会经过用户态X-内核态-用户态Y
用户态进程X切换到用户态进程Y:
1)正在运行X
2)发生中断,中断上下文切换,保存现场
3)执行中断服务,调用schedule(),并完成进程下文Y的切换
4)恢复中断现场
5)执行用户态进程Y
特殊情况:
1)内核线程VS用户态进程:内核线程调度时,没有中断上下文切换
2)fork创建子进程,子进程的运行起点为return from fork
(4)linux系统分层结构

shell:终端解释程序
参考:https://www.bilibili.com/video/BV13t411n7E9?p=56&spm_id_from=pageDriver
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
