zzinit进程从内核态切换到用户态。

本文详细解析了Linux系统中init进程从内核态切换到用户态的过程。通过sys_fork和sys_execve系统调用创建并加载/sbin/init,介绍了关键函数如do_mmap和start_thread的作用,展示了如何实现不同特权级别的转移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

init进程从内核态切换到用户态。

//谢谢lucian_yao 邀请,在此灌水一篇

大家都知道如何产生一个新的进程。
通过sys_fork,之后再调用sys_execve
系统初启后(核心态)的第一个用户态进程是init。
这要涉及到内层(特权级高)向外层(特权级低)转移的问题。
通常情况下,内核是不会调用用户层的代码,要想实现这逆向的转移,一般做法是在用户进程的核心栈(tss->esp0)压入用户态的SS,ESP,EFLAGS,CS,EIP,伪装成用户进程是通过陷阱门进入核心态,之后通过iret返回用户态。
那么linux 2.2.14中的用户态进程init是如何实现的?

首先在kernel_thread(init...)函数中,
利用系统调用sys_clone fork出一个内核级进程(此时要给该进程分配核心栈<-esp0),之后call init函数,init函数还会再起几个kernel_thread,然后会加载/sbin/init(通过execve调用)
在sys_execve中,要完成内核态到用户态的转移。
大体流程是sys_execve-->do_execve-->load_elf_binary()
-->do_load_elf_binary()-->do_mmap()
start_thread(reg,newip,newsp) (processor.h)
请大家关注do_mmap()及start_thread()很重要哦
do_mmap完成从文件虚拟空间到内存虚拟空间的映射。
而start_thread就是要在进程核心栈中的相应位置填入进程用户态的xss,esp and xcs,eip.
最后进程从ret_from_sys_call返回,iret指令从核心栈pop出xcs, eip完成特权及指令的转移, pop出 xss,esp,完成堆栈的切换。

以上我也是刚看代码悟出的,如有不对之处,还望高手指出。 
### 进程和线程切换时的状态分析 进程和线程的切换操作系统中的心机制之一,涉及用户态内核态的转换。以下详细说明进程和线程切换时所处的状态。 #### 用户态内核态的基本概念 - **用户态**:用户态是普通应用程序运行的状态,在此状态下,程序无法直接访问硬件资源或执行特权指令[^4]。 - **内核态**:当程序需要执行系统调用(如文件读写、内存分配等)时,会从用户态切换内核态。在内核态下,程序可以执行特权指令并访问硬件资源[^4]。 #### 进程切换时的状态 进程切换通常由操作系统完成,因此涉及从用户态内核态切换。具体过程如下: 1. 当一个进程需要让出 CPU 或等待某些资源时,会触发系统调用或中断。 2. 系统调用或中断将当前进程用户态切换内核态。 3. 在内核态下,操作系统保存当前进程的上下文信息,并选择下一个要运行的进程。 4. 操作系统恢复新进程的上下文,并将其从内核态切换用户态以继续运行。 整个过程中,进程切换心操作发生在内核态,因为只有内核态才能管理和调度进程上下文[^4]。 #### 线程切换时的状态 线程切换的过程与进程切换类似,但线程切换的开销通常较小,因为线程共享同一进程的地址空间。以下是线程切换的具体状态: 1. 如果线程切换用户态线程管理器完成,则切换可能完全在用户态进行,无需进入内核态[^1]。 2. 如果线程切换涉及系统调用(如时间片耗尽或等待 I/O),则需要从用户态切换内核态。 3. 在内核态下,操作系统负责保存当前线程的上下文信息,并选择下一个线程运行。 4. 恢复目标线程的上下文后,线程从内核态切换用户态继续运行。 对于一对一模型(每个用户态线程对应一个内核态线程),线程切换几乎总是涉及内核态,因为每次切换都需要操作系统参与调度[^3]。 #### 示例代码:系统调用引发的内核态切换 以下是一个简单的 C 语言代码示例,展示如何通过系统调用触发内核态切换: ```c #include <unistd.h> #include <stdio.h> int main() { printf("Switching to kernel mode via system call...\n"); sleep(2); // 调用 sleep 系统调用,触发内核态切换 printf("Back to user mode after sleeping.\n"); return 0; } ``` 在上述代码中,`sleep` 函数是一个系统调用,它将当前进程用户态切换内核态,并在指定时间后返回用户态。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值