MMU和PCB的理解
因为之前接触过一部分关于嵌入式系统的东西,大致了解一些mmu具体的工作原理及其虚拟和物理地址的概念,通俗易懂而言的话,mmu就是给你的物理地址一个别名,这个别名才是你在程序中调用的地址。下图是从讲解视频中获取的一个CPU和程序执行的示意图。
对于一个在32位平台中运行的程序而言,有4G的k虚拟地址空间,其中0-3G是用户空间,剩余空间为内核空间这部分空间是不允许程序直接访问的,MMU就是把你使用的这些空间进行一个内存映射,虚拟内存映射到物理内存,我的理解是为了更合理的分配有限的物理内存空间,然后进行这样的一个设置,将需要的空间再在内存中进行开辟出来一个,然后对应的地址通过MMU转化之后交给程序进行使用。
PCB这个对我是一个全新的概念,第一次听说这个词还是在PCB板子上听过,每一个进程都有一个对应的PCB就是进程控制块,也称为进程描述符,它的本质是一个tast_struct的结构体,这个结构体的成员陈列在下图:
每个成员的各自含义在图中叙述得很清楚了。
认识了PCB后就可以接触到程序和进程的概念了,程序就是一个编译好了的一个文件,就仅仅是一个文件,只是占用的是你硬盘的存储空间,而进程却占用很多系统资源,比如CPU、内存等,我学习的过程中听到一个比喻我感觉特别形象,程序就是一个剧本,仅仅只是一张纸而已,而一个工作的进程就是一个正在上演的戏剧,它就是按照你所设定的剧本在运行,需要用到舞台、演员等等资源。
然后引申出两种程序的设计模型,一种是单道程序设计模型——CPU只能顺序的处理完一个个计划任务,就和队列一样;多道程序设计模型——就是能够并行去处理多个计划任务。关于是如何实现并行运行的,我的理解很简单,就是让一个任务工作一会儿然后暂停下,然后工作另一个任务,然后再暂停会,然后依次进行两个任务切换运行,由于处理速度很快,人们就会感觉是在同时处理两个任务。(这种多任务模式我记得我在STM32上的UCOS上也看过介绍,我记得也是这个意思,让一个任务挂起然后去处理另一个然后再回来处理这个)
通过并行处理就可以发现一个进程的状态不单单只有运行一种,应该有五种状态,如下图:
箭头表示状态的切换方向,很直观的可以看出各个状态之间应该怎么切换,初始态未在图上列出。
最后还了解了环境变量的定义,其实环境变量在很早之前就有过接触,通过配置windows里的我的电脑里面的设置来设定的,当时是为了玩什么游戏吧应该,Linux下常用的环境变量有PATH、SHELL、HOME、LANG、TERM,同时Linux还提供了几个环境变量的操作函数
char *getenv(const char *name);获取一个环境变量的值
int setenv(const char *name, const char *value, int overwrite);设置环境变量
还有其他函数,具体使用方法可以在man文档中得到详细的了解,这里就不一一重复了
第一天接触Linux的系统编程,概念较多,大多都是听过但是没有很系统的去了解,有点似是而非。