
- SIDL状态
进程的生命周期开始于SIDL状态,这个状态表示一个暂时的空闲状态,进程在刚刚被父进程通过fork创建出来时处于这个状态,在这个状态中,进程仍被定义为"正在初始化",不会影响任何信号,也不会进行任何操作,因为这个进程还在进行内存布局的设置工作以及加载要求的依赖模块,一旦所有初始化工作都完成,那么就可以说这个进程开始执行了,而且不会返回到SIDL状态,处于SIDL状态的进程一定是单线程的,因为只能在过后被派生(spawn)出来- 当一个进程正在执行时,这个进程处于SRUN状态,不过这个状态由两个不同的状态组成: 一个是可运行状态(runable),还有一个是正在运行状态(running),如果一个进程被加入运行队列等待运行,那么这个进程就处于可运行状态,但是这个进程并没有真正被运行, 因为cpu忙于运行其他进程,只有当CPU的寄存器都加载了属于某个寄存器值时,这个进程才真正的处于运行状态m
UNIX信号
当进程在活动时,通常都只顾着自己的业务,即以顺序的方式执行代码,如果使用了多线程,以并行的方式执行一些顺序代码,然而,进程有可能会遇到信号,信号是一种软件中断,表示进程自己发生了异常,或者发生了外部的事件
信号指发送给程序的异步通知,其中不包含数据(或只包含非常少量的数据)信号是由操作系统发送给进程的,用于发生了某种条件,而这种条件通常是因为某类硬件错误或者程序异常而产生的
大部分应用程序都有可能会崩溃,在UNIX中,崩溃和一个信号有关,崩溃的真正原因来自于内核
可执行文件
进程是特殊文件在内存中加载得到的结果
OSX目前支持: 解释器脚本格式、通用二进制格式、Mach-O格式,解释器脚本实际上只是一种特殊格式的二进制文件格式
Mach -O格式
Mach-O具有一个固定的文件头,这个文件头的详细信息在<mach-o/loader.h>
头文件中
加载器可以通过这个魔数值快速判断这个文件用于32位还是64位
4. MH_DYLIB 动态库 dynamically bound shared library
5. MH_DYLINKER 动态链接器 dynamic link editor
MH_ALLOW_STACK_EXECUTION 允许栈可执行,只有可执行文件可以用这个标志,但是通常不建议使用,当发生缓冲区溢出时,可执行的栈会给代码注入带来方便
MH_NO_HEAP_EXECUTION 将堆标记为不可执行,用于防止"堆喷(heap spray)"的攻击技术,使用这种技术的黑客盲目地用sellcode覆盖大量的堆空间,然后投机的跳转到这些地址中,企图能够跳转到自己的代码并且执行
由于代码注入的常见方法是使用栈变量(即自动变量),因此默认情况下栈都标记为不可执行,而这个标志可以用于覆盖这种行为(非常危险)。堆则默认可以执行,尽管完全可能,但是通过堆注入代码相对困难一些
加载命令
Mach-O 文件头中包含了非常详细的指令,这些指令在被调用时清晰地指导了如何设置并加载二进制数据,这些加载命令,紧跟在基本的mach-header
之后,每一条指令都采用"类-长度-值"的格式
- LC_SEGMENT
这条命令指导内核如何设置新运行的进程内存空间,这些"段"直接从Mach-O二进制文件加载到内存中

有了LC_SEGMENT命令,设置进程虚拟内存的过程就变成遵循LC_SEGMENT命令的简单操作,对于每一个段,将文件中相应的内存加载到内存中,从偏移量为fileoff处加载fileszie字节
Grand Central Dispatch
动态库
OS X上几乎所有的库都是程序动态链接的,动态链接器是内核执行LC_DYLINKER加载命令时启动的

dyld开源代码
网友评论