分析linux/Windows下如何运行一个执行文件(转载)(20210202)

(秋招)vins中的光流法 那么下一层基于这个初值也会得到一个解,就这样进行迭代,直到达到金字塔的最底层,也即第0层,就是原始分辨率的那张图片,此时光流法就会给出一个速度值,这个值是比较可靠的(相比对原始图片直接使用光流法来说)。2.小运动,这个也必须满足,就是时间的变化不会引起位置的剧烈变化,这样灰度才能对位置求偏导(换句话说,小运动情况下我们才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数),这也是光流法不可或缺的假定。可以看到光流法是来估计物体运动的(估计的是物体运动的速度,根据速度再计算相对应的特征点)。 阅读详情

本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。

1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段(已初始化)、从定位信息区、符号表及符号名字字符串构成,如下左图所示,经过链接后生成执行文件如下右图所示,需要说明的是1).bss段在目标文件和执行文件中并不占用文件的空间,但是它在加载时占用地址空间;2)链接后各个段在虚拟空间上的地址就确定了,并且linux下,ELF可执行文件默认从地址0x080480000开始分配。

               

我们知道在linux下运行一个程序只要在shell中执行 ./a.out 这个命令就OK了,剩下的事情操作系统会替我们完成。但是操作系统到底做了什么,它是怎么做的呢,接下来就来解析一下。

2、linux系统中每个程序都运行在一个进程上下文中,这个进程上下文有自己的虚拟地址空间。当shell运行一个程序时,父shell进程生成一个子进程,它是父进程的一个复制品。子进程通过execve系统调用启动加载器。加载器删除子进程已有的虚拟存储段,并创建一组新的代码、数据、堆、栈段,新的堆和栈被初始化为零。通过将虚拟地址空间中的页映射到可执行文件的页大小组块,新的代码和数据段被初始化为可执行文件的内容,最后将CUP指令寄存器设置成可执行文件入口,启动运行。

执行完上述操作后,其实可执行文件的真正指令和数据都没有别装入内存中。操作系统只是通过可执行文件头部的信息建立起可执行文件和进程虚拟内存之间的映射关系而已。现在程序的入口地址为0x08048000,刚好是代码段的起始地址。当CPU打算执行这个地址的指令时,发现页面0x8048000~0x08049000(一个页面一般是4K)是个空页面,于是它就认为是个页错误。此时操作系统根据虚拟地址空间与可执行文件间的映射关系找到页面在可执行文件中的偏移,然后在物理内存中分配一个物理页面,并在虚拟地址页面与物理页面间建立映射,最后把文件中页面拷贝到物理页面,进程重新开始执行。该过程如下图所示:

MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

 

3、这里比较难理解的就是这个分页机制,讲到分页机制,就不得不提linux的分段与分页机制,这也是这篇文章的重点。我们先

来看一张图:

这张图展示了虚拟地址进过分段、分页机制后转化成物理地址的简单过程。其实分段机制是intel芯片为兼容以前产品而保留下来的,然后linux中弱化了这一机制。下面我们先简单介绍一下分段机制:

分段提供了隔绝各个代码、数据和堆栈区域的机制,它把处理器可寻址的线性地址空间划分成一些较小的称为段的受保护地址空间区域。如果处理器中有多个程序在运行,那么每个程序可分配各自的一套段。此时处理器就可以加强这些段之间的界限,并确保一个程序不会通过访问另一个程序的段而干扰程序的执行。为了定位指定段中的一个字节,程序必须提供一个逻辑地址,该地址包括一个段选择符和一个偏移量。实模式下,段值还是可以看作地址的一部分,段值位XXXXh表示以XXXX0h开始的一段内存。而保护模式下,段值仅仅变成了一个索引,只想一个数据结构的一个表项,该表项中定义了段的起始地址、界限、属性等内容。cs、ds等寄存器中存的就是这个段选择符,

用段选择符中的段索引在GDT或LDT表中定位相应的段描述符,把段描述符中取得的段基地址加上偏移量,就形成了一个线性地址。

       得到了线性地址之后,我们再来看看分页机制如何把它转换成物理地址。处理器分页机制会把线性地址空间(段已映射到其中)划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页面上。分页与分段最大的不同之处在于分页是用来固定长度的页面(一般为4KB)。如果仅适用分段地址转换,那么存储在物理内存中的一个数据结构将包含器所有部分。但如果适用了分页,那么一个数据结构就可以一部分存储在物理内存中,而另一部分保存在磁盘中。
      处理器把线性地址转换成物理地址和用于产生页错误异常的信息包含在存储与内存中的页目录和页表中。也变可看作简单的4K为单位的物理地址数组。线性地址的高20位构成这个数组的引索值,用于选择对应页面的物理基地址。线性地址的低12位给出 了页面中的偏移量。页表中的页表项大小为32位。由于只需要其中20位来存放页面的物理基地址,因此剩下的12位可用于存放诸如页面是否存在等属性信息。如果线性地址引索的页表项被标注为存在,我们就从页面中取得物理地址。如果表项中不存在,那么访问对应物理页面时就会产生异常。
       页表含有2^20(1M)个表项,而每项占用4个字节。如果作为一个表来存放的话,最多将占用4MB内存。因此为了减少内存占用量,80x86适用了两级表。由此,高20位线性地址到物理地址的转换也被分成两步进行,每部适用其中10个比特。
       第一级表称为页目录。它被存放在1页4k 页面中,具有2^10(1k)个4字节长度的表项。这些表项指向二级表。它们由线性地址最高10位作为引索。
第二级表称为页表,长度也是1个页面。线性地址高10位获取指向第二级页表的指针,再加上中间10位,就可以在相应页表中获得物理地址的高20位。而为地址的低12位就是线性地址的低12,这样就组成了一个完整的32位物理地址。分段、分页的整个过程可见下面这张图:

出处:http://blog.youkuaiyun.com/yu132563/article/details/79446351

整车电检工艺流程 本文是笔者在从事汽车行业智能制造领域过程,对于整车电检工艺流程的理解与总结。 阅读详情

相关推荐

测绘无人船避坑指南:云卓H12Pro遥控器接海康摄像头,从网络设置到RTSP流延迟优化全流程

本文详细解析了测绘无人船视频子系统的优化方案,重点介绍海康威视摄像头与云卓H12Pro遥控器的深度适配流程。从网络设置到RTSP流延迟优化,提供了一套经过实测的低延迟(<200ms)解决方案,适用于复杂水域环境下的测绘任务。

weixin_30415113的博客 627

linux 运行文件

导读:和windows下的PE结构是一样的,安全逆向分析也需要这一块,这和云计算技术虚拟化也相关 本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。 1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段(已初始化)、从定位信息区、符号表及符号名字字符串构成,如下左图所示,经过链接后生成执行文件如下右图.

manongxianfeng的博客 9756

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 236

随笔注意点

32位编译器下,int占用2个字节, long int 占用4个字节, long long int 占用8个字节; 64位编译器下,int占用4个字节, long int 占用8个字节, long long int  依然占用8个字节; 一: 1,C程序需要有 main函数 int main() { return 0; } xcode3前使用gcc编译 xcode4使用llvm

AppleEngineer 632

深入解析BlueZ5与D-Bus:Linux蓝牙开发实战指南

本文深入解析BlueZ5与D-Bus在Linux蓝牙开发中的核心应用,提供从环境搭建到实战开发的完整指南。通过详细代码示例和调试技巧,帮助开发者掌握蓝牙协议栈与D-Bus接口的交互方法,实现高效蓝牙设备管理与GATT服务开发。

weixin_28292761的博客 451

Python接口自动化测试实战:Requests+Pytest+Excel+Allure框架搭建指南

接口自动化测试是现代软件工程中保障软件质量的关键实践,其核心原理是通过脚本模拟客户端请求,自动验证API的功能、性能和可靠性。在Python技术栈中,Requests库以其简洁的API成为处理HTTP请求的基石,而Pytest框架则凭借其灵活的Fixture机制和强大的参数化功能,为测试用例的组织与执行提供了优雅的解决方案。结合Excel进行数据驱动测试,能够有效实现测试数据与脚本逻辑的分离,提升协作效率;最终通过Allure生成可视化测试报告,清晰呈现测试结果与过程。这套技术组合(Requests, Py

weixin_28677451的博客 304

a.out文件如何运行

生成a.out文件之后输入 ./a.out

lb_9800的博客 1万+

字节最新开源模型 DA3(Depth Anything 3)使用教程(一)从任意视角恢复视觉空间

本文介绍DepthAnything3(DA3)模型,一种能够从任意视觉输入中预测几何结构的创新解决方案。DA3采用Transformer骨干网络,通过统一的深度光线表示简化学习过程,支持单目/多视角深度估计、姿态估计和3D高斯预测等多项任务。模型系列包含基础版、度量级和单目专用版本,其中嵌套版本DA3NESTED-GIANT-LARGE表现最佳。代码库提供交互界面、CLI工具和多格式导出功能,支持模块化扩展。实验表明DA3在各项任务上超越现有模型,所有训练数据均来自公开学术数据集。

2506_90492529的博客 2549

linux 执行.out文件_Linux可执行文件与进程的虚拟地址空间

作者:贺东升校队:梁金荣、张孝家Linux可执行文件与进程的虚拟地址空间一个可执行文件被执行的同时也伴随着一个新的进程的创建。Linux会为这个进程创建一个新的虚拟地址空间,然后会读取可执行文件的文件头,建立虚拟地址空间与可执行文件的映射关系,然后将CPU的指令指针寄存器设置成可执行文件的入口地址,然后CPU就会从这里取指令执行。一个可执行文件包含可被CPU执行的指令和待处理的数据,上C...

weixin_39807067的博客 937

TC8:IPv4_HEADER_05-09

所有主机都必须准备好接受最多576个字节的数据报我们知道最大传输单元MTU通常是1500个字节,也就是说一条IP数据报的Header+payload最大1500,那为什么这条测试用例又要求主机准备好接受最多576个字节的IP数据报呢。

jasonj333 512

【Flutter 面试题】 怎么减少Widget的重新构建?

关于 const 关键字的使用:在 Flutter 开发中,任何时候当你确定一个 Widget 在其整个生命周期内都不会发生变化时,使用 const 关键字声明这个 Widget。这样的声明告诉 Flutter 框架这个 Widget 可以在编译时生成,后续的构建周期中可以重用已经创建的 Widget,从而避免了重复的构建开销。这适用于静态文本、图标或整个不变的 Widget 树。

Code Metaverse 1577

a.out程序执行的开始与结束

简述我们利用gcc编译生成可执行文件a.out,在Terminal中输入./a.out即可执行成功,就能看到想要的结果。 ./a.out可执行程序运行过程可以按一下几个步骤来概括。 bash分析指令 bash调用fork()生成子进程,并等待子进程结束 sys_execve() do_execve() search_binary_handler() load_elf_binary() exit()

jqwang1992的博客 1万+

Linux可执行文件

Linux可执行文件及PATH环境变量

荒-于嬉的博客 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

windows .out C语言,Windows下C语言操作硬件设备的方法

本文作者:Fezl本文原地址:http://blog.csdn.net/u010147522/article/details/49912221之前都是在linux下操作硬件设备,open、read、write、ioctl,相当方便。最近要检测windows的驱动程序有没有问题,于是得写个简单的程序测试一下设备的ioctl功能。说一下windows下操作设备的大体方法:1. 用设备的GUID来获取设...

weixin_30724041的博客 435

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

在Windows命令行中编译运行C/C++程序

此处运行环境是在Windos下,运行cmd命令进入DOS界面 首先,如果想在DOS窗口中进行C/C++代码的编译,则需要先配置gcc的环境变量。 1、使用g++进行编译链接 为了可以方便观察,这里我使用一份Helloworld代码(HelloWorld.cpp) #include <iostream> using namespace std; int main(){ cout << "HelloWorld!" << endl; syste..

平凡小智 5万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

在 Mac 上的“终端”中执行.out文件

在 Mac 上直接执行.out文件

eclipse1024的博客 1434

linux每隔一段时间执行一次程序

linux每隔一段时间执行一次程序

jjw_zyfx的博客 1572

计算机系统深度解析:Executable Object File(a.out 文件)全面详解!

a.out 文件是指可执行文件中的一种常见格式。它是用于 Unix 和类 Unix 操作系统上的可执行文件格式之一,经常用于 C 编程语言的程序编译后生成的可执行文件。在早期的 Unix 系统中,a.out 文件格式被广泛采用,直到后来被更为通用的 ELF (Executable and Linkable Format) 格式所取代。然而,在某些系统上,a.out 文件格式仍然得到支持,并且可以通过特定的工具进行创建和解析。在本文中,我们深入探讨了 a.out 文件的内部结构、应用场景以及使用方式。

m0_72410588的博客 1489

Linux(类Unix)系统可执行程序ELF文件格式详解

类Linux系统下,ELF文件结构大致可分为ELF header、Seciotn header table、Program header table,即将数据划分为多个Section存入ELF文件,然后通过Section header table进行索引,在ELF header中记录Section header table的位置和大小

ctbinzi的专栏 2049

走进linux第一步

走进Linux第一步 在开发工作中要操作linux系统就要做到熟悉linux系统的操作命令,首先介绍一下在shell中如何执行用户输入的命令。 shell: CLI(command line interface):输入一个字符串 回车: 执行步骤: (1)先默认按空白符将字符串分割为好多单词,默认第一个单词为命令,后面的单词看成选项和参数 (2)判断此命令是否是自己的shell builtin 内部命令,是的话直接执行 (3...

水獭 381

Linux环境基础开发工具使用(下)

gdb调试程序,必须是debug方式发布,也就是给gcc -g发现这里是编译不通过的,因此在gcc后面加入-std=c99如果想要调试,一定要让程序先跑起来下面演示调试步骤:r就是run的缩写,让程序跑起来——相当于vs中的ctrl+f5快捷键下来就开始学习第一条指令:l==list想从第一行的位置开始显示代码,就输入l 1在这之后继续输入list,行号会跟着如果想要在16行打断点怎么操作?——一般是使用行号去打断点b指令(breadpoint)+行号:打断点。

Protein_zmm的博客 1571

从零编写linux0.11 - 第十一章 可执行文件

加载 elf 格式可执行文件,不支持过大的文件,不支持动态编译。

皓空Fly的博客 1402

linux 执行.out文件_Linux系统下运行c++程序

引言为什么要在Linux下写程序? 需要更多关于Linux下c++ 开发的资料请后台私信【架构】获取分享资料包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。首先要问一下自己,为什么要写这个程序。 如果我们写一个运行在windows平台的应用程序,那么...

weixin_39629075的博客 1万+

Linux学习---创建静态库以及静态库链接

2、链接静态库就是将库中被调用的代码复制到调用模块中。1、静态库的本质就是将目标文件打包成一个文件。3、静态库的扩展名是.a 例:libxxx.a。–计算模块:calc.h、calc.c。–显示模块:show.h、show.c。使用命令:./a.out运行程序。A.编辑库的实现代码和接口声明。命令:gcc -c calc.c。最后生成一个a.out可执行文件。–接口文件:math.h。D、编译并链接静态库。

旅行者的博客 2236

Linux常用命令

一.Linux常用命令: 目录管理 切换目录 cd ##;直接切换到某个目录下 cd /##/##; 切换到指定文件夹下的目录 cd ~;直接返回根目录下 列出目录 ls -a;全部文件列出 ls -l;长数据串列出 包含文件的属性和权限等等 ls -al;可以将上方两个上方结合来用 创建和删除 mkdir ###;创建一个目录 rmdir ###;表示删除该目录 mkdir -p ##/##/##;表示创建多层目录 查看 pwd ;查看当前是在哪个目录下 复制 cp 文件 目录;将文件复制到某个

qq_48508278的博客 595
上一篇: 为什么我们选择parquet做数据存储格式(转)
下一篇: GRUB(GRand Unified Boot loader)引导加载程序(转) 2021-03-01
ccpit2b2c
博客等级 码龄15年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值