关闭

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

标签: c语言linux
306人阅读 评论(0) 收藏 举报
分类:

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


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


#PS:这个只是  《  我自己    》理解,如果和你的原则相冲突,请


谅解,勿喷 


近段时间看一些代码,自己也写了一些。但是写着写着感觉自己迷茫了,自己对程序的结构越来越模糊,甚至都不相信自己的写的部分,或者相信自己的知识。


那么现在就来终结这些想法,让自己提升一下。

本系列文章主要分为两部分,(一)是分析程序在内存中的分布(二)是linux下程序的执行流程


下面是linux下程序的执行流程:

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


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


当你在shell中输入

<span style="white-space:pre">	</span>./XXXXX
这个时候,一个程序就开始执行了。现在就进入我们这篇文章要讲的重点。(一个程序要可以执行的前戏就是之前的分析)


现在我要开始执行XXXXX程序:

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


第一步:

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


第二步:

下面来分析execve()函数的执行过程。

查看man手册:

execve源码:


在调用INLINE_SYSCALL宏后,



调用INTERNAL_SYSCALL()


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

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

  1. asmlinkage int sys_execve(struct pt_regs regs)  
  2. {  
  3.     int error;  
  4.     char * filename;  
  5.   
  6.     filename = getname((char *) regs.ebx);
  7.     error = PTR_ERR(filename);  
  8.     if (IS_ERR(filename))  
  9.         goto out;  
  10.     error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, &regs);  
  11.     if (error == 0)  
  12.         current->ptrace &= ~PT_DTRACE;  
  13.     putname(filename);  
  14. out:  
  15.     return error;  
  16. }  
调用do_execve(),先收集信息,调用search_binary_handler()函数,根据可执行文件类型,调用不同的的处理函数去执行。(后面详细的信息可以去阅读源码,这里就不一一说明)

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


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


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


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


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


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

#PS:请尊重原创,不喜勿喷 #PS:要转载请注明出处,本人版权所有 #PS:这个只是  《  我自己    》理解,如果和你的原则相冲突,请 谅解,勿喷  #PS:请尊重原创,不喜勿喷 ...
  • u011728480
  • u011728480
  • 2016-05-31 16:23
  • 347

C/C++中auto、static、register、extern关键字区别小结

本文介绍了四种存储说明符关键字的区别和使用注意小结
  • FX677588
  • FX677588
  • 2016-09-28 09:24
  • 1028

linux 下C程序内存分布

先问大家个问题,在linux下,对于C源程序到可执行文件的过程大家清楚吗?还有一个可执行文件是怎样运行的?        一 源文件到可执行文件的过程如下:      源程序----预编译中间文件---汇编文件-...
  • b5w2p0
  • b5w2p0
  • 2014-09-26 15:51
  • 1119

c语言变量的存储方式(auto,register,static,extern)及作用域(局部变量/全局变量)详解

在讨论函数的形参变量时曾经提到, 形参变量只在被调用期间才分配内存单元,调用结束立即释放。 这一点表明形参变量只有在函数内才是有效的, 离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量, C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。 C语言...
  • wtxwd
  • wtxwd
  • 2014-09-06 10:54
  • 601

Linux程序加载过程

一个进程在内存中主要占用了以下几个部分,分别是代码段、数据段、BSS,栈,堆,等参数。其中,代码、数据、BSS的内容是可执行文件中对应的内容,加载程序并不是把它们的内容从可执行程序中填充到内存中,而是将它们的信息(基地址、长度等)更新到进程控制块(task_struct)中,当CPU第 一次实际寻址...
  • hnzziafyz
  • hnzziafyz
  • 2016-08-13 16:56
  • 547

可执行程序加载到内存的过程

在linux中,程序的加载,涉及到两个工具,linker 和loader。Linker主要涉及动态链接库的使用,loader主要涉及软件的加载。 1、  exec执行一个程序 2、  elf为现在非常流行的可执行文件的格式,它为程序运行划分了两个段...
  • u010229420
  • u010229420
  • 2016-09-20 11:28
  • 3265

Linux下浅析程序的运行过程

本文的主要内容: 1>程序运行的4个阶段。 2>浅析静态库和动态库。 3>浅析Linux下的主要目录的作用。1、程序运行的4个阶段: 在前边的文章http://blog.csdn.net/peiyao456/article/details/51524533 已经对程序运行...
  • peiyao456
  • peiyao456
  • 2016-12-28 20:39
  • 706

C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)

1.局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也...
  • XSL1990
  • XSL1990
  • 2013-11-14 00:18
  • 3110

C语言内存空间分布详解

BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态...
  • gzg1500521074
  • gzg1500521074
  • 2016-01-01 14:31
  • 1570

简单C语言程序的执行过程

程式的運行方式 在開始進行程式開發前,我們先來探討最簡單的C程式如何運作。 為了使程式足夠簡單,我們可讓CPU直接從Flash上取得指令(fetch instruction)並執行,而且程式中沒用到全域變數,因此編譯出來的目的檔(object file)中是data section長度是0,如此...
  • jsdchenye
  • jsdchenye
  • 2015-04-14 21:11
  • 1809
    个人资料
    • 访问:60359次
    • 积分:1146
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:6篇
    • 译文:1篇
    • 评论:24条
    最新评论