程序运行的基本概念:
程序不是必须运行在操作系统上的,CPU也不管什么操作系统,只是执行指令。但操作系统提供了一个运行环境或者说平台,一般来说外部软件需要借助于操作系统,才能实现对硬件的操控,和对软件的调度。
从操作系统的角度来看,当程序运行时,操作系统将程序的一次运行抽象为一个进程。操作系统在创建进程时,建立PCB(进程控制块)( Process Control Block),PCB伴随进程运行的全过程,直到进程撤消而撤消。
PCB是进程状态信息的集合,主要包含的信息有:
标识符(identifier)——唯一标识进程
状态(state)——进程的当前状态(运行/就绪/等待)
优先级(priority)——相对于其他进程的优先级别
程序计数器(PC = Program Counter)——即将被执行的下一条程序指令的地址
内存指针(memory pointers)——包括指向程序代码、相关数据和共享内存的指针
上下文数据(context data)——进程被中断时处理器寄存器中的数据,可以用于进程的恢复
I/O状态信息(I/O status information)——包括显式I/O请求、分配给进程的I/O设备、被解除使用的文件列表等
记帐信息(accounting information)——包括占用处理器时间、时钟数总和、时间限制、账号等,比如在进程处于退出态时可以取出PCB的记账信息来做性能分析
PCB用来描述进程,可以用PCB区分不同的进程,对进程的管理和调度都要用到PCB。
线程也有线程控制块,TCB(Thread Control Block),可以理解为进程控制块的组成和附属。
对程序文件而言,操作系统便是神一样的存在,所有的一切都要仰仗于他。如果不运行,程序就以文件形式,静静地躺在磁盘空间里。如果运行,操作系统不是直接运行程序,而是创建进程。进程映像(进程实体)由PCB、程序段、数据段三部分构成。PCB在内存,程序段、数据段是存储在硬盘中的可执行文件。OS把进程影映像部分或全部装载到内存中,运行后就产生了一个进程。程序实际运行一定在内存中。从程序文件的角度看,进程是运行于虚拟地址空间的一个程序。
参考这篇文章《操作系统是个大骗子?》https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513894&idx=1&sn=3cf8faef41800f0dd52f84a0ae2d8065&chksm=80d67be5b7a1f2f31833dc71f8c67dc50e64b14bb5a25678155a7b39927b63db7c17510793d0&scene=21#wechat_redirect
再来一篇《可执行文件的装载与进程》https://www.cnblogs.com/fr-ruiyang/p/11196858.html,可执行文件的加载执行过程应该是逆向的核心知识,以后在调试器中加载源码,再慢慢来把玩研究。。。
记录知识点:
不同操作系统的库文件:
windows 系统静态库扩展名为:.lib 动态库扩展名为:.DLL;
Linux 系统静态库扩展名为:.a 动态库扩展名为: .so
库文件是预先编译好的方法的集合。
比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,而不需要重新编写。库文件分为:静态库和动态库(也叫共享库)两种。
静态库和共享库的区别
1、静态库是在程序编译时链接的;动态库是在程序运行时链接的
2、静态库的可执行文件当中包含了库代码的一份完整的拷贝,因此,当它被多次使用时就会有多份没用的拷贝在内存当中,所以比较占内存;而动态库系统只需载入一次动态库,不同的程序可以得到内存当中相同的动态库的副本,因此会节省很多内存。