首页 > 系统相关 >Kernel分析—进程创建后用户栈是怎么分配的

Kernel分析—进程创建后用户栈是怎么分配的

时间:2022-11-29 21:03:06浏览次数:42  
标签:Kernel 创建 top 用户 命令 栈是 进程 stack 终端

1.  Shell终端中执行可执行文件过程简述:

(1)读取用户由键盘输入的命令行。

(2)分析命令,以命令名作为文件名,并将其它参数改造为系统调用execve()内部处理所要求的形式。

(3)终端进程调用fork()建立一个子进程。

(4)终端进程本身用系统调用wait4()来等待子进程完成(如果是后台命令,则不等待)。当子进程运行时调用execve(),子进程根据文件名(即命令名)到目录中查找有关文件(这是命令解释程序构成的文件),将它调入内存,执行这个程序(解释这条命令)。

(5)如果命令末尾有&号(后台命令符号),则终端进程不用系统调用wait4()等待,立即发提示符,让用户输入下一个命令,转(1)。如果命令末尾没有&号,则终端进程要一直等待,当子进程(即运行命令的进程)完成处理后终止,向父进程(终端进程)报告,此时终端进程醒来,在做必要的判别等工作后,终端进程发提示符,让用户输入新的命令,重复上述处理过程。

 

 

 

2. 进程地址空间中用户栈的分配

进程地址空间由mm_struct结构描述,每个进程只存在一个地址空间。该结构伴随着进程的创建而创建。其中用start_stack来表示用户栈的起始地址。

(1) 进程创建,并建立进程地址空间。

do_fork

|- > copy_process

         |- > dup_task_struct

         |- > copy_mm

 

(2) 通过系统调用execve执行可执行程序,并重新分配用户栈。

    基本处理流程:

    do_execve_common - > exec_binprm - > search_binary_handler - > load_binary===load_elf_binary

    在load_elf_binary 函数中,完成用户栈 start_stack 的初始化, bpr->p 在setup_arg_pages中赋值 。

其中:

♦  personality 中默认是没有设置ADDR_NO_RANDOMIZE。

    randomize_va_space是由/proc/sys/kernel/randomize_va_space决定,

     通过查看目前设置为 2.

♦ randomize_stack_top函数:

 

♦ setup_arg_pages函数:

int setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top, int executable_stack)
{
.....

#ifdef CONFIG_STACK_GROWSUP   // 没有配置

....

#else

      stack_top = arch_align_stack(stack_top);
      stack_top = PAGE_ALIGN(stack_top);

if (unlikely(stack_top < mmap_min_addr) ||
unlikely(vma->vm_end - vma->vm_start >= stack_top - mmap_min_addr))
return -ENOMEM;

stack_shift = vma->vm_end - stack_top;

bprm->p -= stack_shift;
mm->arg_start = bprm->p;

#endif

.....

}

3. 实验验证

 

       

 

 



标签:Kernel,创建,top,用户,命令,栈是,进程,stack,终端
From: https://www.cnblogs.com/savionyin/p/16936629.html

相关文章

  • 练习_for循环创建用户
    #!/usr/bin/bashread-p"pleaseinputnumber:"numif[[!"$num"=~^[0-9]+$]];thenecho"errornumber"exitfiread-p"pleaseinputpref......
  • 自定义构造函数 创建对象
    函数适用于封装方法的  构造函数就是用于封装对象的1.构造函数首字母大写2.调用通过newnew函数名()3.通过this添加属性//functionPig(name,age){//......
  • 创建vue快捷代码
    实现在新建 **.vue文件中,输入vue2,就可以补全vue2的结构代码    回车后出现下面的代码文件,复制下面代码段,到红框的位置,其中prefix可以自己设定输入什......
  • 【开发小技巧】028—使用CSS创建卡通动画加载效果
    在实际项目开发中,一般都会设计一个动画加载效果,今天这个加载效果非常有趣,可以帮助用户在等待程序加载时,缓解用户着急的情绪。HTML代码:在本文中,设计了代码的基本结构。<!DOCT......
  • 创建并且配置win10系统虚拟机
    一、创建Windows10镜像1、下载地址:https://www.microsoft.com/zh-cn/software-download/windows102、制作镜像完成之后,会生成一个后缀名为.iso的镜像文件二、创建新......
  • 什么是自签名证书?以及如何创建它
    自签名SSL证书是一种数字证书,未经公开信任的​​证书颁发机构(CA)​​签名。自签名证书被认为不同于传统的CA签名证书,因为它们是由负责与证书关联的网站或软件的公司......
  • 《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器
    文章目录3.Docker常用命令3.1帮助启动类命令3.2镜像命令3.3有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)3.4容器命令3.4.1新建+启动容器3.4.2列出当......
  • 什么是自签名证书?以及如何创建它
    自签名SSL证书是一种数字证书,未经公开信任的证书颁发机构(CA)签名。自签名证书被认为不同于传统的CA签名证书,因为它们是由负责与证书关联的网站或软件的公司或开发人......
  • 多线程的创建(继承Thread类)
    多线程的创建方式一:继承Thread类Java是通过java.lang.Thread类来代表线程的。按照面向对象的思想,Thread类应该提供了实现多线程的方式。步骤:定义一个子类MyThread继承......
  • Mysql:创建索引和删除索引
    创建索引的方式创建表时,创建索引在已存在的表,创建索引创建表添加索引添加普通索引、唯一索引、主键索引、联合索引、全文索引CREATETABLE`kuajing_oms`.`cc_bill_......