Apakah fungsi fail cmd dalam Linux

王林
Lepaskan: 2023-05-12 18:52:12
ke hadapan
2374 orang telah melayarinya

Di Linux, fail cmd ialah fail arahan pautan, yang menyimpan maklumat konfigurasi pemaut dan boleh dirujuk sebagai fail arahan fungsi fail cmd; menunjukkan cara untuk memautkan program. Fail cmd terdiri daripada dua bahagian: MEMORY dan SECTIONS: MEMERY digunakan untuk mentakrifkan nama, alamat permulaan dan panjang setiap blok memori SECTIONS digunakan terutamanya untuk menerangkan segmen yang dipetakan ke segmen ruang storan.

Apakah itu fail cmd?

Fail cmd ialah Fail Perintah Pemaut, berakhir dengan akhiran .cmd.

Nama profesional CMD ialah fail konfigurasi pemaut, yang menyimpan maklumat konfigurasi pemaut Kami memanggilnya sebagai fail arahan. Seperti yang dapat dilihat dari namanya, tujuan fail ini adalah untuk menentukan cara untuk memautkan program.

Kemudian kita tahu bahawa semasa menulis program TI DSP, program itu boleh dibahagikan kepada banyak segmen, seperti teks, bss, dsb., dan setiap segmen mempunyai peranan yang berbeza. Apabila benar-benar berjalan dalam filem, lokasinya juga berbeza. Sebagai contoh, kod teks biasanya harus diletakkan dalam kilat, manakala pembolehubah bss harus diletakkan dalam ram. dll. Walau bagaimanapun, untuk cip yang berbeza, alamat permulaan dan penamat setiap memori adalah berbeza Selain itu, penyambung tidak tahu di mana memori pengguna ingin meletakkan bahagian tertentu, terutamanya bahagian tersuai. Untuk memberitahu pemaut peruntukan ruang storan dalaman cip yang akan digunakan dan lokasi storan khusus setiap bahagian program, adalah perlu untuk menulis fail konfigurasi, iaitu fail CMD.

fail cmd terdiri daripada dua bahagian: MEMORI (iaitu: ingatan) dan BAHAGIAN (iaitu: segmen). MEMERY digunakan untuk menentukan nama, alamat permulaan dan panjang setiap blok memori. SECTIONS digunakan terutamanya untuk menerangkan segmen yang dipetakan ke segmen ruang storan yang mana. MEMORY boleh dibahagikan kepada PAGE0 (ruang simpanan program) dan PAGE1 (ruang penyimpanan data), PAGE (iaitu: bingkai).

Segmen yang dinyatakan di atas boleh dibahagikan kepada dua kategori: segmen yang dimulakan dan segmen yang tidak dimulakan. Segmen yang dimulakan mengandungi arahan dan data sebenar dan disimpan dalam ruang memori program. Segmen tidak dimulakan hanya menyimpan ruang alamat pembolehubah Segmen tidak dimulakan tidak mempunyai kandungan sebenar Data ditulis kepada pembolehubah semasa menjalankan program dan disimpan dalam ruang storan data. Dalam bahasa C, terdapat banyak segmen yang ditentukan, seperti ".text", ".const", dan ".system". Untuk segmen yang ditakrifkan ini, terdapat banyak penjelasan mengenainya di Internet, jadi saya tidak akan menerangkan butiran di sini. Artikel ini seterusnya akan memperkenalkan pembaca kepada cara mentakrifkan segmen sendiri sebagai pengguna.

MEMORY dan BAHAGIAN

Ulasan boleh ditulis dalam fail cmd, dikelilingi oleh "/*" dan "*/", tetapi "//" tidak dibenarkan ", ini berbeza daripada bahasa C.

Untuk menulis fail cmd kita perlu menggunakan dua arahan pseudo MEMORY dan SECTIONS (mesti menggunakan huruf besar).

Sintaks MEMORY dan SECTION boleh didapati dalam talian Artikel ini akan menerangkan kandungan MEMORY dan SECTION dengan contoh khusus.

Terangkan MEMORY berdasarkan fail cmd F28335 yang digunakan oleh pengarang.

MEMORY
{
PAGE 0:    /* Program Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
 
   ZONE0       : origin = 0x004000, length = 0x001000     /* XINTF zone 0 */
   RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */
   RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */
   RAML2       : origin = 0x00A000, length = 0x001000     /* on-chip RAM block L2 */
   RAML3       : origin = 0x00B000, length = 0x001000     /* on-chip RAM block L3 */
   ZONE6       : origin = 0x0100000, length = 0x100000    /* XINTF zone 6 */ 
   ZONE7A      : origin = 0x0200000, length = 0x00FC00    /* XINTF zone 7 - program space */ 
   FLASHH      : origin = 0x300000, length = 0x008000     /* on-chip FLASH */
   FLASHG      : origin = 0x308000, length = 0x008000     /* on-chip FLASH */
   FLASHF      : origin = 0x310000, length = 0x008000     /* on-chip FLASH */
   FLASHE      : origin = 0x318000, length = 0x008000     /* on-chip FLASH */
   FLASHD      : origin = 0x320000, length = 0x008000     /* on-chip FLASH */
   FLASHC      : origin = 0x328000, length = 0x008000     /* on-chip FLASH */
   FLASHA      : origin = 0x338000, length = 0x007F80     /* on-chip FLASH */
   CSM_RSVD    : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
   BEGIN       : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
   CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */
   OTP         : origin = 0x380400, length = 0x000400     /* on-chip OTP */
   ADC_CAL     : origin = 0x380080, length = 0x000009     /* ADC_cal function in Reserved memory */
   
   IQTABLES    : origin = 0x3FE000, length = 0x000b50     /* IQ Math Tables in Boot ROM */
   IQTABLES2   : origin = 0x3FEB50, length = 0x00008c     /* IQ Math Tables in Boot ROM */  
   FPUTABLES   : origin = 0x3FEBDC, length = 0x0006A0     /* FPU Tables in Boot ROM */
   ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */        
   RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
   VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */
 
PAGE 1 :   /* Data Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
           /* Registers remain on PAGE1                                                  */
   
   BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */
   RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */
   RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAML4       : origin = 0x00C000, length = 0x001000     /* on-chip RAM block L1 */
   RAML5       : origin = 0x00D000, length = 0x001000     /* on-chip RAM block L1 */
   RAML6       : origin = 0x00E000, length = 0x001000     /* on-chip RAM block L1 */
   RAML7       : origin = 0x00F000, length = 0x001000     /* on-chip RAM block L1 */
   ZONE7B      : origin = 0x20FC00, length = 0x000400     /* XINTF zone 7 - data space */
   FLASHB      : origin = 0x330000, length = 0x008000     /* on-chip FLASH */
}
Salin selepas log masuk

Anda boleh melihat bahawa MEMORY biasanya mengandungi PAGE0 dan PAGE1 dalam PAGE0 mewakili ruang storan dengan alamat permulaan 0x008000 dan panjang ruang storan 0x001000. Dengan cara yang sama, kita boleh mengetahui maksud nama ruang storan yang lain.

Membandingkan manual data cip TI28335 (hanya sebahagian daripadanya dipintas), kita dapat melihat bahawa penulisan fail cmd di atas adalah berdasarkan bahagian pemetaan memori manual data cip TI28335. Kita juga boleh merujuk kepada bahagian pemetaan memori dalam manual data cip untuk menulis fail cmd.

Apakah fungsi fail cmd dalam Linux

Seterusnya, penulis akan menerangkan kandungan yang terkandung dalam BAHAGIAN Mengambil fail cmd F28335 sebagai contoh

SECTIONS
{
 
   /* Allocate program areas: */
   .cinit              : > FLASHA      PAGE = 0
   .pinit              : > FLASHA,     PAGE = 0
   .text               : > FLASHA      PAGE = 0
   codestart           : > BEGIN       PAGE = 0
   ramfuncs            : LOAD = FLASHD, 
                         RUN = RAML0, 
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         LOAD_SIZE(_RamfuncsLoadSize),
                         PAGE = 0
 
   csmpasswds          : > CSM_PWL     PAGE = 0
   csm_rsvd            : > CSM_RSVD    PAGE = 0
   
   /* Allocate uninitalized data sections: */
   .stack              : > RAMM1       PAGE = 1
   .ebss               : > RAML4       PAGE = 1
   .esysmem            : > RAMM1       PAGE = 1
 
   /* Initalized sections go in Flash */
   /* For SDFlash to program these, they must be allocated to page 0 */
   .econst             : > FLASHA      PAGE = 0
   .switch             : > FLASHA      PAGE = 0      
 
   /* Allocate IQ math areas: */
   IQmath              : > FLASHC      PAGE = 0                  /* Math Code */
   IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD 
   
   /* Uncomment the section below if calling the IQNexp() or IQexp()
      functions from the IQMath.lib library in order to utilize the 
      relevant IQ Math table in Boot ROM (This saves space and Boot ROM 
      is 1 wait-state). If this section is not uncommented, IQmathTables2
      will be loaded into other memory (SARAM, Flash, etc.) and will take
      up space, but 0 wait-state is possible.
   */
   /*
   IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD 
   {
   
              IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)
   
   }
   */
   
   FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD 
         
   /* Allocate DMA-accessible RAM sections: */
   DMARAML4         : > RAML4,     PAGE = 1
   DMARAML5         : > RAML5,     PAGE = 1
   DMARAML6         : > RAML6,     PAGE = 1
   DMARAML7         : > RAML7,     PAGE = 1
   
   /* Allocate 0x400 of XINTF Zone 7 to storing data */
   ZONE7DATA        : > ZONE7B,    PAGE = 1
 
   /* .reset is a standard section used by the compiler.  It contains the */ 
   /* the address of the start of _c_int00 for C Code.   /*
   /* When using the boot ROM this section and the CPU vector */
   /* table is not needed.  Thus the default type is set here to  */
   /* DSECT  */ 
   .reset              : > RESET,      PAGE = 0, TYPE = DSECT
   vectors             : > VECTORS     PAGE = 0, TYPE = DSECT
   
   /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
   .adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD
 
}
Salin selepas log masuk

anda boleh melihat bahawa BAHAGIAN mengandungi Pelbagai. nama bahagian. Ambil ".text" sebagai contoh. ".text" ialah segmen kod arahan binari yang dijana selepas penyusunan Anda boleh melihat bahawa kami memperuntukkan kandungan dalam ".text" kepada FLASHA untuk penyimpanan, dan FLASHA terletak di PAGE0 dalam MEMORY.

Ramfuncs dalam BAHAGIAN berkaitan dengan permulaan 28335. Intipatinya ialah membaca kod pengguna daripada FLASH melalui "program but" semasa menghidupkan, menyimpannya dalam RAM dan menjalankannya dalam RAM, dengan itu menyelesaikan masalah ROM Kelajuan membaca dan menulis adalah perlahan, dan sukar untuk menghadapi masalah kehilangan data akibat cip pintar berkelajuan tinggi dan kegagalan kuasa RAM.

Segmen tersuai

Dan apakah gunanya mengetahui maklumat tentang segmen ini untuk pengguna kami? Penggunaan paling langsung ialah apabila pengkompil menggesa bahawa memori memori tidak mencukupi, kami boleh mencari ruang storan yang sepadan melalui nama segmen yang sepadan dan mengubah suai saiz ruang storannya untuk memenuhi keperluan program kami. Kami juga boleh menyimpan kod dan data kami dengan menyesuaikan nama segmen.

Pass #pragma DATA_SECTION (nama fungsi atau nama pembolehubah global, "nama segmen yang ditentukan pengguna dalam ruang data") atau #pragma CODE_SECTION (nama fungsi atau nama pembolehubah global, "nama segmen yang ditentukan pengguna dalam ruang program ") Nama segmen") boleh melaksanakan nama segmen tersuai, dengan itu memperuntukkan ruang storan secara bebas.

#pragma DATA_SECTION (untuk pembolehubah)

#pragma CODE_SECTION (untuk fungsi)

但使用以上指令时需注意:不能在函数体内声明必须在定义和使用前声明,#pragma可以阻止对未调用的函数的优化。

下面结合实际使用例子来具体讲解:

#pragma DATA_SECTION(FFT_output, "FFT_buffer1");
float FFT_output[FFT_SIZE];
Salin selepas log masuk

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

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

FFT_buffer1		: > RAML4,     PAGE = 1
Salin selepas log masuk

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

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

Atas ialah kandungan terperinci Apakah fungsi fail cmd dalam Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan