Linux中cmd文件的作用是什么(linux里的cmd)

Linux中cmd文件的作用是什么(linux里的cmd)

浏览次数:
信息来源: 用户投稿
更新日期: 2026-03-02
文章简介

在Linux中,cmd文件即链接命令文件,是存放链接器的配置信息的,可简称为命令文件;cmd文件的作用是指明如何链接程序的。cmd文件由MEMORY和SECTIONS两部分组成:MEMERY用于

2025阿里云双十一服务器活动

在Linux中,cmd文件即链接命令文件,是存放链接器的配置信息的,可简称为命令文件;cmd文件的作用是指明如何链接程序的。cmd文件由MEMORY和SECTIONS两部分组成:MEMERY用于定义每个存储器块的名字、起始地址和长度;SECTIONS主要用于描述哪个段映射到了哪段存储空间。

什么是cmd文件?

cmd文件即链接命令文件(LinkerCommandFiles),以后缀.cmd结尾。

CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件。从其名称可以看出,该文件的作用是指明如何链接程序的。

那么我们知道,在编写TIDSP程序时,是可以将程序分为很多段,比如text、bss等,各段的作用均不相同。实际在片中运行时,所处的位置也不相同。比如text代码一般应该放在flash内,而bss的变量应该放在ram内。等等。但是对于不同的芯片,其各存储器的起止地址都是不一样的,而且,用户希望将某一段,尤其是自定义段,放在什么存储器的什么位置,这也是链接器不知道的。为了告诉链接器,即将使用的芯片其内部存储空间的分配和程序各段的具体存放位置,这就需要编写一个配置文件,即CMD文件了。

cmd文件由MEMORY(即:内存)和SECTIONS(即:段)两部分组成。MEMERY用于定义每个存储器块的名字、起始地址和长度。SECTIONS主要用于描述哪个段映射到了哪段存储空间。MEMORY中又可分为PAGE0(程序存储空间)和PAGE1(数据存储空间),PAGE(即:帧)。

上文所提及的段,又可分为两大类:已初始化的段和未初始化的段。已初始化的段含有真实的指令和数据,存放于程序存储空间。未初始化的段只是保留变量的地址空间,未初始化的段并不具有真实的内容,在程序运行过程中才向变量内写数据进去,存放于数据存储空间。C语言中,有许多定义好的段,如“.text”,“.const”,“.system”。对于这些定义好的段,在网上有许多关于他们的讲解,故这里笔者不再赘述。本文接下来会给读者介绍作为用户,来自己定义段的方法。

MEMORY和SECTION

cmd文件中可以写上注释,用"”,包围起来,但不允许使用“//”,这点与c语言不同。

编写cmd文件我们需要借助两条伪指令MEMORY和SECTIONS(必须大写)。

MEMORY和SECTION的语法可在自行网上查找,本文将结合具体例子对MEMORY和SECTION中的内容进行讲解。

结合笔者使用的F28335的cmd文件对MEMORY进行讲解。

ZONE0:origin=0x004000,length=0x001000

RAML0:origin=0x008000,length=0x001000

RAML1:origin=0x009000,length=0x001000

RAML2:origin=0x00A000,length=0x001000

RAML3:origin=0x00B000,length=0x001000

ZONE6:origin=0x0100000,length=0x100000

ZONE7A:origin=0x0200000,length=0x00FC00

FLASHH:origin=0x300000,length=0x008000

FLASHG:origin=0x308000,length=0x008000

FLASHF:origin=0x310000,length=0x008000

FLASHE:origin=0x318000,length=0x008000

FLASHD:origin=0x320000,length=0x008000

FLASHC:origin=0x328000,length=0x008000

FLASHA:origin=0x338000,length=0x007F80

CSM_RSVD:origin=0x33FF80,length=0x000076

BEGIN:origin=0x33FFF6,length=0x000002

CSM_PWL:origin=0x33FFF8,length=0x000008

OTP:origin=0x380400,length=0x000400

ADC_CAL:origin=0x380080,length=0x000009

IQTABLES:origin=0x3FE000,length=0x000b50

IQTABLES2:origin=0x3FEB50,length=0x00008c

FPUTABLES:origin=0x3FEBDC,length=0x0006A0

ROM:origin=0x3FF27C,length=0x000D44

RESET:origin=0x3FFFC0,length=0x000002

VECTORS:origin=0x3FFFC2,length=0x00003E

BOOT_RSVD:origin=0x000000,length=0x000050

RAMM0:origin=0x000050,length=0x0003B0

Linux中cmd文件的作用是什么,linux里的cmd

RAML4:origin=0x00C000,length=0x001000

RAML5:origin=0x00D000,length=0x001000

RAML6:origin=0x00E000,length=0x001000

RAML7:origin=0x00F000,length=0x001000

ZONE7B:origin=0x20FC00,length=0x000400

FLASHB:origin=0x330000,length=0x008000

}

可以看到MEMORY中通常包含PAGE0和PAGE1,PAGE0中的RAML0代表起始地址为0x008000,存储空间长度为0x001000的存储空间。同理可知其他存储空间名称所代表的含义。

对照TI28335芯片数据手册(仅截取了部分)可以看到,以上cmd文件的编写是基于TI28335芯片数据手册内存映射一节所编写的。我们也可参考芯片数据手册上的内存映射一节进行cmd文件的编写。

接下来,笔者对SECTION所包含的内容进行讲解,同样以F28335的cmd文件为例

codestart:>BEGINPAGE=0

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart),

LOAD_SIZE(_RamfuncsLoadSize),

csmpasswds:>CSM_PWLPAGE=0

csm_rsvd:>CSM_RSVDPAGE=0

IQmathTables:>IQTABLES,PAGE=0,TYPE=NOLOAD

FPUmathTables:>FPUTABLES,PAGE=0,TYPE=NOLOAD

DMARAML4:>RAML4,PAGE=1

DMARAML5:>RAML5,PAGE=1

DMARAML6:>RAML6,PAGE=1

DMARAML7:>RAML7,PAGE=1

ZONE7DATA:>ZONE7B,PAGE=1

.reset:>RESET,PAGE=0,TYPE=DSECT

vectors:>VECTORSPAGE=0,TYPE=DSECT

.adc_cal:load=ADC_CAL,PAGE=0,TYPE=NOLOAD

}

可以看到SECTION中包含了各种段名。以“.text”为例,“.text”为编译后生成的二进制指令代码段,可以看到,我们将“.text”中的内容分配到FLASHA中存储,而FLASHA位于MEMORY中的PAGE0。

SECTION中的ramfuncs与28335的启动有关,其本质就是上电运行时通过“引导程序”把用户代码从FLASH中读出,保存在RAM中并在RAM中运行,从而解决ROM读写速度慢,难以满足高速智能芯片和RAM掉电丢失数据的问题。

自定义段

而知道了段的这些信息对于我们用户来说有什么用呢?最直接的用处就是,当编译器提示存储器内存不足时,我们可以通过对应的段名,找到对应的存储空间,修改其存储空间的大小来满足我们程序的需要。甚至我们可以通过自定义段名来存放我们的代码和数据。

通过pragmaCODE_SECTION(函数名或全局变量名,"用户自定义在程序空间的段名")可实现自定义段名,从而自由的分配存储空间。

pragmaCODE_SECTION(用于函数)

但使用以上指令时需注意:不能在函数体内声明必须在定义和使用前声明,pragmaDATA_SECTION(FFT_output,"FFT_buffer1");

floatFFT_output[FFT_SIZE];

笔者声明了一个数据段,段名为FFT_buffer1,段的内容在变量FFT_ouput里。而声明后才定义变量FFT_output的大小。

我们如果想要使用这个自定义的段,接下来我们还要在CMD文件的SECTION中指定FFT_buffer1的存储空间。

FFT_buffer1 :>RAML4,PAGE=1

通过以上几条语句,笔者实现了将变量的内容存放入指定的RAML4存储空间的操作。

从上可以得出,当全局变量所占内存过大时,我们可以通过自定义段选择有所余裕的存储空间的方式,从而来解决内存不足的问题。

以上就是Linux中cmd文件的作用是什么的详细内容,更多请关注主机测评网其它相关文章!

标签:
如何保护客户隐私安全
« 上一篇
返回列表
下一篇 »

如本文对您有帮助,就请抽根烟吧!