Rumah >masalah biasa >Apakah fail cmd dalam Linux
Di Linux, fail cmd ialah fail arahan pautan, yang menyimpan maklumat konfigurasi pemaut dan boleh dirujuk sebagai fail arahan fungsi fail cmd adalah untuk menunjukkan cara memautkan atur cara . 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.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
Fail cmd ialah fail arahan pemaut (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 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: MEMORY (iaitu: memori) 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 membincangkan butiran di sini. Artikel ini seterusnya akan memperkenalkan pembaca kepada cara mentakrifkan segmen sendiri sebagai pengguna.
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 */ }
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 fail cmd di atas ditulis berdasarkan bahagian pemetaan memori manual data cip TI28335. Kita juga boleh merujuk kepada bahagian pemetaan memori dalam manual data cip untuk menulis fail cmd.
Seterusnya, penulis akan menerangkan kandungan yang terkandung dalam BAHAGIAN Juga 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 }</iqnexptable.obj>
Anda boleh melihatnya. dalam SEKSYEN 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 adalah berkaitan dengan permulaan 28335. Intipatinya ialah membaca kod pengguna daripada FLASH melalui "program bootstrap" apabila dihidupkan, simpan dalam RAM dan jalankannya 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.
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(用于函数)
但使用以上指令时需注意:不能在函数体内声明必须在定义和使用前声明,#pragma可以阻止对未调用的函数的优化。
下面结合实际使用例子来具体讲解:
#pragma DATA_SECTION(FFT_output, "FFT_buffer1"); float FFT_output[FFT_SIZE];
笔者声明了一个数据段,段名为FFT_buffer1,段的内容在变量FFT_ouput里。而声明后才定义变量FFT_output的大小。
我们如果想要使用这个自定义的段,接下来我们还要在CMD文件的SECTION中指定FFT_buffer1的存储空间。
FFT_buffer1 : > RAML4, PAGE = 1
通过以上几条语句,笔者实现了将变量的内容存放入指定的RAML4存储空间的操作。
从上可以得出,当全局变量所占内存过大时,我们可以通过自定义段选择有所余裕的存储空间的方式,从而来解决内存不足的问题。
相关推荐:《Linux视频教程》
Atas ialah kandungan terperinci Apakah fail cmd dalam Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!