一、环境变量
1.什么是环境变量:环境变量是为每个进程所提供的、具有该进程环境信息的键值对
2.用处:在cmd中通过环境变量中的path来进行查找;命令行严重依赖于环境变量
3.好处:环境变量存储在进程内存中,读取快;进程之间各自拥有自己的环境变量,有助于进程隔离;环境变量可以使一个二进制文件变成一个指令,从而不需要写完整路径来调用二进制程序
4.特点:环境变量间可以继承;环境变量可以动态修改
5.环境变量是通过内核将环境变量放置相应进程的内存空间中,在高地址处,然后os调用crt0将环境变量传给main()函数,无论main()函数是否提供参数接收,crt0都会将环境变量传给main()
二、程序地址空间
1.什么是程序地址空间:即虚拟地址空间,每个进程拥有自己的程序地址空间,不是物理地址空间
2.程序地址空间的优点:有利于进程间独立性
3.用户态:cpu仅可运行在进程虚拟空间中的用户空间,不可运行在内核空间,不可操作硬件,只能通过系统调用陷入内核态来操作硬件
4.内核态:cpu可在整个虚拟空间中运行,也可操作硬件
5.系统调用:用户态代码调用系统调用函数,cpu权级发生改变,由用户态陷入内核态,执行相应操作,然后再切回用户态,返回结果给应用程序
6.由用户态切到内核态三种方式:
(1)硬件中断:CPU处于用户态执行程序代码,此时用户进行点键盘鼠标等操作,由于仅有内核态时才有操作硬件的能力,此时CPU由用户态转为内核态,此时发生硬件中断
(2)同步中断:CPU处于用户态执行程序代码,此时程序代码中含有系统调用函数,此时CPU陷入内核态进行操作,再切回到用户态
(3)现代快速特权跳转指令
7.地址空间管理:
(1) 程序地址空间的建立:程序地址空间是随进程的存在而存在的,建立一个程序地址空间需要先fork()出一个子进程,内核会为该子进程创建程序地址空间,fork()完后此时的程序地址空间与父进程的程序地址空间一样。
注:为增强fork()的运行速度,增添写时复制机制COW,刚开始为子进程创建页表,并将页表标记为只读,此时子进程的页表指向的是父进程的真实物理内存空间,此时子进程并没有真正意义上自己的物理内存空间;当程序需要修改时MMU触发缺页异常,内核此时为子进程这一页分配物理内存空间。
(2)程序地址空间的修改: 调用execve()这个系统调用,会将fork()后的程序地址空间和页表进行销毁,通过ELF重新为子进程建立自己的程序地址空间和页表
(3)虚拟与物理内存空间相互转换:通过CPU中MMU硬件以及mm_struct以及进程的页表进行虚拟地址与物理地址之间的相互转换,CR3寄存器中存放着当前正在运行的进程的页表的根