Linux 中进程创建和内存空间申请:
除进程 0 外,所有进程都是由一个已有进程在用户态下完成创建的。
进 程 0 创 建 进 程 1 前 , 要 将 进 程 0 由 内 核 态 转 变 为 用 户 态 , 方 法 是 调 用
move_to_user_mode 函数
硬件对 5 个 push 压栈的数据分别出栈,给 ss、esp、eags、cs、eip
为了避免低特权级的的代码直接跳转执行高特权级的代码或访问高特权级的数据,需
要转换特权级调用。转换的方法是中断和中断返回。
Intel 将 CPU 设计为:当执行中断和中断返回(iret)时,硬件改变这个特权级的值。
push1 $0x17 :\代表的是 ss 段选择符,0x17 展开二进制形式:00010111,
第 4-5 位的 10 表示从 LDT 的第 3(00-01-10)项中得到有关用户栈段的描述符
第 6 位的 1 表示从 LDT 中获取描述符
第 7-8 位的 11 即 3,表示当前为用户特权级,若为 0 则是内核态
iret 执行时,原本在栈里的用户态数据会恢复给 ss、esp、eags、cs、eip,iret 后
面执行的程序的特权级就转变为用户特权级,也就是程序处在用户态
在执行完 move_to_user_mode()后,相当于进行了一次中断返回,这就会导致 cs
的特权级值从 0 转换成 3,即从内核态转变为用户态
转变成用户态下进行的进程 0 正式开始创建进程 1,所有用户进程在创建
(一般情况下,3 变 0 通过软中断 int 0x80,0 变 3 通过 iret)
内存管理:
P47 下方 对主内存区起始位置的重新确定,标志着主内存区和缓冲区的位置和大
小已经全部确定了,于是系统开始调用 mem_init 函数。先对主内存区的管理结构进行设
置
系统通过 mem_map 数组记录每一个页面的使用次数。先将所有的内存页面使用次
数均设置成 100,然后再依据主内存的起始位置和终止位置将处于主内存中的所有页面的
使用次数全部清 0(即位于主内存中的页次数是 0),系统以后只把使用次数为 0 的页面
视为空闲页面。
mem_map 每一个单元控制一个页面的使用次数
评论0
最新资源