Windows PE文件浅析

1、虚拟地址VA:PE对应的进程支配了自己独立的4GB虚拟空间,在这个空间定位的地址称为虚拟地址VA。在PE中进程本身的VA被解释为:进程的基地址+相对虚拟内存地址。

2、相对虚拟内存地址:一个进程被加载内存空间后,其相关的动态库也会被加载。这些同时加载到进程虚拟地址空间的文件称为模块。每一个模块在加载时都会有一个基地址、不同模块的基地址一般是不同的。但如果两个模块的基地址相同,就有操作系统来决定这两个模块在虚拟空间中的具体位置。

相对虚拟内存地址RVA是相对于基地址的偏移,几RVA是虚拟内存中用来定位某个特定未知的,该地址的值是这个特定位置距离某个模块基地址的偏移量。所以RVA是针对某个模块而存在的。RVA和VA的概念可如下图表示:

RVA是相对于模块而言的,VA是相对于进程而言的

3、文件偏移地址FOA:和内存无关,它是指某个位置距离文件头的偏移。

4、数据目录:Windows下的可执行文件是PE中的一种,这种文件除了包含代码及数据段的相关数据以外还包含了许多与文件执行有关的其他数据。PE中有一个数据结构称为数据目录表,其中记录了所有可能的数据类型,包括导出表、导入表、资源表等。

5、节:无论是结构化程序设计还是面向对象程序设计,都提倡程序与数据的独立性。因此程序中的代码和数据是分开存放的。为了保证程序执行的安全,保证内核的稳定,Windows操作系统通常对不同用途的数据设置不同的访问权限。如代码段中的字节码在程序运行的时候,一般不允许用户进行修改,数据段则允许在程序运行的过程中读和写,常量只能读等。Windows操作系统在加载可执行文件时,会为这些具有不同属性怼的数据分别分配标记有不同属性的页面(当然,相同属性

STM32启动文件是嵌入式开发中非常关键的一部分,它负责在芯片上电或复位后进行初始设置,并跳转到主程序的入口点。该文件通常以汇编语言编写,其功能包括初始化堆栈指针、中断向量表配置、系统时钟设置以及调用C库函数的初始化代码等。 ### 启动文件的主要功能 1. **设置初始堆栈指针** 在芯片上电后,首先需要设置堆栈指针(SP),这是因为在后续的初始化和程序运行过程中会使用到堆栈来保存局部变量、函数调用返回地址等信息。启动文件通过一条指令将一个预定义的地址赋值给堆栈指针寄存器。 2. **定义中断向量表** STM32微控制器支持多种中断源,因此启动文件必须定义中断向量表,其中包括各种异常处理程序和外设中断服务例程的入口地址。例如,复位中断(Reset_Handler)是第一个被执行的处理程序,它负责引导整个系统的初始化过程[^1]。 3. **调用系统初始化函数** 复位处理程序通常会调用`SystemInit()`函数,这个函数用于配置系统时钟(如PLL设置)、AHB/APB总线时钟分频系数等关键参数,确保MCU运行在正确的频率下。 4. **跳转到主程序入口(main函数)** 完成底层硬件初始化之后,启动文件中的代码会调用`main()`函数,从而进入用户应用程序的执行阶段。在此之前,可能还会涉及到`.data`段和`.bss`段的初始化,即把已初始化的数据从Flash复制到RAM中,并将未初始化的数据区域清零[^1]。 5. **提供默认的中断处理程序** 如果某些中断没有被用户显式地实现,则启动文件可以提供一些弱定义(weak symbols)的默认处理程序,防止程序因找不到中断服务例程而崩溃。 6. **支持调试接口配置** 有些启动文件还包含对调试接口(如SWD或JTAG)的支持,以便于开发者进行在线调试。 ### 启动文件的基本结构示例 以下是一个简化的STM32启动文件片段,展示了基本的中断向量表和复位处理程序: ```assembly ; 文件名:startup_stm32f10x_hd.s .section .isr_vector,"a",%progbits .type g_pfnVectors, %object .size g_pfnVectors, .-g_pfnVectors g_pfnVectors: .word _estack ; Initial Stack Pointer .word Reset_Handler ; Reset Handler .word NMI_Handler ; NMI Handler .word HardFault_Handler ; Hard Fault Handler .word MemManage_Handler ; MPU Fault Handler ... .thumb_func .type Reset_Handler, %function Reset_Handler: bl SystemInit ; Call SystemInit before main ldr r0, =_start ; Set the initial PC to main bx r0 ; Branch to main ``` 在这个例子中,`_estack`表示堆栈的起始地址,而`Reset_Handler`则是复位中断的处理程序,它调用了`SystemInit()`并最终跳转到`main()`函数开始执行用户代码。 ### 相关问题 1. STM32启动文件如何影响系统的时钟配置? 2. 如何修改STM32的启动文件以适应不同的硬件平台? 3. 在STM32项目中,为什么需要对.data和.bss段进行初始化? 4. 不同系列的STM32芯片之间启动文件有何差异? 5. 调试STM32应用时,启动文件中的哪些部分可能会导致问题?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值