首页 > 系统相关 >C程序问题归纳(static,auto,register,extern,程序内存分布图,linux下程序的执行过程......)(二)

C程序问题归纳(static,auto,register,extern,程序内存分布图,linux下程序的执行过程......)(二)

时间:2023-02-11 16:36:19浏览次数:48  
标签:调用 auto ...... 程序 regs filename shell execve

PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=019)
  本文发布于 2016-06-02 14:35:06,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=019)

环境说明

  无

前言


  近段时间看一些代码,自己也写了一些。但是写着写着感觉自己迷茫了,自己对程序的结构越来越模糊,甚至都不相信自己的写的部分,或者相信自己的知识。那么现在就来终结这些想法,让自己提升一下。本系列文章主要分为两部分,(一)是分析程序在内存中的分布(二)是linux下程序的执行流程





linux下程序的执行流程


  对Linux有了解的人都应该知道,在系统中只有一个pid为1的父进程(init),其他的进程都是这个进程衍生出来的子进程(fork),从而形成了以init为树根的一颗树。如图:

rep_img

  如果你有图形桌面,则会在初始化好了开机启动服务后,会调用图形桌面启动器lightdm,然后图形界面初始化,然后你双击鼠标运行的程序就会是图形桌面的子进程。而我们在shell下运行的程序就会是在lightdm->/usr/bin/x-term(以上图为例)下形成子进程。

  当你在shell中输入

./XXXXX

这个时候,一个程序就开始执行了。现在就进入我们这篇文章要讲的重点。(一个程序要可以执行的前戏就是之前的分析)



现在我要开始执行XXXXX程序

  在shell中输入上图命令,并回车后。

  • 第一步:shell 会fork 出一个子进程。同时wait()子进程结束。如果在shell命令后加入&等符号,表示后台执行时,shell fork后,不会wait()子进程,而直接返回。新fork()出的子进程,将会调用一个用户态函数execve() 加载xxxxx程序的文件。(放在磁盘上的静态数据)

  • 第二步:下面来分析execve()函数的执行过程。查看man手册:

rep_img

execve源码:

rep_img

在调用INLINE_SYSCALL宏后,

rep_img

调用INTERNAL_SYSCALL()

rep_img

(提示:其实以上部分就是熟知的GLIBC怎么实现用户API与系统调用结合的过程)

保存系统调用号,然后保存到寄存器,然后切换到内核态,根据调用号查询到sys_execve(),执行sys_execve()

asmlinkage int sys_execve(struct pt_regs regs)  
{  
    int error;  
    char * filename;  
  
    filename = getname((char *) regs.ebx);
    error = PTR_ERR(filename);  
    if (IS_ERR(filename))  
        goto out;  
    error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, &regs);  
    if (error == 0)  
        current->ptrace &= ~PT_DTRACE;  
    putname(filename);  
out:  
    return error;  
}  

调用do_execve(),先收集信息,调用search_binary_handler()函数,根据可执行文件类型,调用不同的的处理函数去执行。(后面详细的信息可以去阅读源码,这里就不一一说明)

(由于本人水平有限,后面部分只知道个大概,就不献丑了)

这样一个程序就执行起来了。是不是非常的简单。





后记


  无

参考文献




打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
qrc_img

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

标签:调用,auto,......,程序,regs,filename,shell,execve
From: https://www.cnblogs.com/Iflyinsky/p/17111914.html

相关文章

  • 程序员画图软件推荐
    Xmind:一款非常实用的商业思维导图软件,应用全球最先进的EclipseRCP软件架构,全力打造易用、高效的可视化思维软件,强调软件的可扩展、跨平台、稳定性和性能,致力于使用先进......
  • 程序员如何提高编程时打字速度的5个Tips
     前言一般地说,程序员的打字速度要快过普通人,仅次于秘书、记者、编辑等文字工作者。 但是在编程时,因为代码中含有大量特殊字符,因此程序员的打字速度要大打折扣。比如......
  • 关于编写GUI程序我自己的一些理解
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文发布于2014-10-1214:51:31,现用MarkDo......
  • 微信小程序:多行文本溢出出现多余的文字
    多行文本溢出隐藏css样式.line-2{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;/*限制文本行数*/-webkit-b......
  • 【学习笔记】第一个Spring程序-HelloSpring
    第一个Spring程序-HelloSpring使用Spring来写第一个程序,首先要将spring依赖导入,我们这里导入的是spring-webmvc<dependency>  <groupId>org.springframework</grou......
  • 程序员如何正确的读书
    首先作为一个读书人,应该要对这个世界的运行规则有抽象的认识。这个,我将其称之为道。在认识了这世界上有一种叫道的东西以后,你就可以开始尽情的研究术法了。在学习术法的过程......
  • 小程序开发常见问题
    1、域名必须是https非https的域名不被微信小程序允许2、input组件placeholder字体颜色卸载placeholder-class里面的color并不生效,需要写在placeholder-style里面就可以......
  • 程序员应该懂的植物学
    我发现,这个仅仅只是通过网络,我没有悉心关注过大多数程序员的生活。他们会种一种叫多肉的植物。当然,也不是不可以种。只是吧,根据我对多肉的了解,程序员种这个,价值不是很大哦。......
  • 《程序是怎样跑起来的》·第六章 亲自尝试压缩数据
    0、开篇(1)文件储存的基本单位是什么?   字节(1字节=8位)(2)DOC、LZH和TXT这些扩展名中,哪一个是压缩文件的扩展名?   LZH (LZH是用LHA等工具压缩过的文件的扩展名)......
  • C++语言程序设计课程设计任务书[2023-02-11]
    C++语言程序设计课程设计任务书[2023-02-11]C++语言程序设计课程设计任务书一.课程设计的目的全面系统的学习面向对象程序设计的基本概念、基本语法和编程方法。正确......