কর্টেক্স এম 3 .bss অঞ্চল সূচনা করার জন্য বেয়ার-মেটাল স্টার্ট আপ কোড


10

আমি এখান থেকে অনুপ্রেরণা তৈরি করেছি আর্ম কর্টেক্স এম 3 এর জন্য একটি বেয়ার মেটাল স্টার্ট আপ কোড। তবে, আমি নিম্নলিখিত সমস্যাটির মুখোমুখি হয়েছি: ধরুন আমি একটি অবিস্মরণীয় গ্লোবাল ভেরিয়েবল ঘোষণা করি, main.c তে স্বাক্ষরবিহীন চরটি লিখুন say

#include ...
unsigned char var; 
...
int main()
{
 ...
}

এটি STM32 f103 এর .bss অঞ্চলকে _BSS_START = 0x20000000 থেকে শুরু করে _BSS_END = 0x20000001 এ শেষ করে। এখন, স্টার্ট আপ কোড

    unsigned int * bss_start_p = &_BSS_START; 
    unsigned int * bss_end_p = &_BSS_END;

    while(bss_start_p != bss_end_p)
    {
        *bss_start_p = 0;
        bss_start_p++;
    }

পুরো .bss অঞ্চলে শূন্যে আরম্ভ করার চেষ্টা করে। যাইহোক, এর ভিতরে লুপটি 4 বাইটের সাথে বৃদ্ধি পায়, সুতরাং এক ধাপের পরে bss_start_p = 0x20000004 অতএব এটি সর্বদা বিএসএস_েন্ড_পি থেকে পৃথক হবে যা একটি অসীম লুপ ইত্যাদির দিকে নিয়ে যায় etc.

এর কোনও মানক সমাধান আছে কি? আমি কি অনুমান করি যে কোনওভাবে .bss অঞ্চলের মাত্রা 4 এর একক হতে হবে? অথবা। বিএসএস অঞ্চলে যাওয়ার জন্য আমাকে স্বাক্ষরবিহীন চরটিতে পয়েন্টার ব্যবহার করা উচিত? সম্ভবত এর মতো কিছু:

    unsigned char * bss_start_p = (unsigned char *)(&_BSS_START); 
    unsigned char * bss_end_p = (unsigned char *)(&_BSS_END);

    while(bss_start_p != bss_end_p)
    {
        *bss_start_p = 0;
        bss_start_p++;
    }
```

কম ব্যবহার করুন। বুটস্ট্র্যাপগুলি কারণ হিসাবে সমাবেশে লেখা হয়। প্রথমে এখন আপনি একটি .ডাটা সমস্যা তৈরি করেছেন। এটি একটি মুরগি এবং ডিমের জিনিস / ব্যবহারের জন্য ধরে নিন যে সি আপনাকে সর্বনিম্ন টেক্সট, .বিএস এবং .ডাটা উপর নির্ভর করে তবে আপনি সি কোড লিখছেন যা নিশ্চিত করে যে সি কোড কাজ করবে, সি কোডে এমন জিনিস ব্যবহার করে যা একটি কোড প্রয়োজন বুটস্ট্র্যাপ সম্ভবত সি কোডে লিখিত যা সি কাজের উপর নির্ভর করে।
old_timer

.Data ওভার কপি করার কোডটি .bss এর সাথে খুব মিল, তবে আপনি যদি উপরের কোডটির মতো করে লিখে থাকেন তবে .ডাটা ওভার কপি করার জন্য আপনার প্রয়োজন .ডাটা অনুলিপি করা উচিত।
old_timer

উত্তর:


15

আপনি যেমন সন্দেহ করছেন, এটি হচ্ছেন কারণ স্বাক্ষরযুক্ত ইনট ডাটা টাইপটি 4 বাইট আকারের। প্রতিটি *bss_start_p = 0;বিবৃতি আসলে বসের ক্ষেত্রের চারটি বাইট সাফ করে।

বিএসএস মেমরির পরিসরটি সঠিকভাবে প্রান্তিককরণ করা দরকার। আপনি কেবল _BSS_START এবং _BSS_END সংজ্ঞা দিতে পারেন যাতে মোট আকারটি চারটির একাধিক হয় তবে সাধারণত লিঙ্কার স্ক্রিপ্টটি শুরু এবং থামানো অবস্থানগুলি সংজ্ঞায়িত করার মাধ্যমে পরিচালনা করা হয়।

উদাহরণ হিসাবে, এখানে আমার একটি প্রকল্পের লিঙ্কার বিভাগ রয়েছে:

.bss (NOLOAD) : ALIGN(4)
{
    __bss_start__ = .;
    *(.bss)
    . = ALIGN(4);
    __bss_end__ = .;
} >RAM

ALIGN(4)বিবৃতি জিনিষ যত্ন নিতে।

এছাড়াও, আপনি পরিবর্তন করতে ইচ্ছুক হতে পারে

while(bss_start_p != bss_end_p)

প্রতি

while(bss_start_p < bss_end_p)

এটি সমস্যাটি আটকাবে না (যেহেতু আপনি নিজের ইচ্ছার চেয়ে আরও 1-3 বাইট সাফ করতে পারেন) তবে এটি প্রভাবটি হ্রাস করতে পারে :)


@ সিমারিয়াস প্রতিবিম্বিত হওয়ার পরে, আমি মনে করি আপনার চর পয়েন্টার ধারণাটি দুর্দান্ত কাজ করবে, যদিও এর জন্য আরও চক্রের প্রয়োজন হবে। তবে আমি নিশ্চিত নই যে পরবর্তী মেমরি অঞ্চলটি স্বাক্ষরবিহীন হওয়ার সাথে সাথে পরবর্তী সমস্যাগুলি রয়েছে কিনা, তাই আমি আমার উত্তরে এটি উল্লেখ করতে যাচ্ছি না ...
বিটস্যাক

1
while(bss_start_p < bss_end_p - 1)অবশিষ্ট মেমোরি রেঞ্জের একটি বাইট-ওয়াইন ক্লিয়ারিংয়ের পরে শেষ উদ্বেগ দূর হবে।
glglgl

4

মানক সমাধানটি হ'ল memset():

#include <string.h>
memset(&_BSS_START, 0, &_BSS_END - &_BSS_START)

আপনি যদি স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করতে না পারেন, তবে আপনার মেমরির আয়তন 4 বাইট অবধি বাড়ানো এবং ব্যবহার চালিয়ে যাওয়া আপনার ক্ষেত্রে ঠিক আছে কিনা তা আপনাকে সিদ্ধান্ত নিতে হবে unsigned int *; বা যদি আপনার এটি সম্পর্কে কঠোর হওয়া দরকার তবে এক্ষেত্রে আপনাকে ব্যবহার করা দরকার unsigned char *

আপনি যদি নিজের প্রথম লুপের মতো আকারটি bss_start_pবাড়িয়ে bss_end_pতুলেন তবে প্রকৃতপক্ষে এর চেয়েও বেশি শেষ হতে পারে তবে <অসমতার পরীক্ষার পরিবর্তে তুলনামূলক কম তুলনায় ডিল করা সহজ ।

অবশ্যই, আপনি বেশিরভাগ মেমরির অঞ্চলটি 32-বিট স্থানান্তর সহ এবং 8-বিট স্থানান্তর সহ কেবলমাত্র শেষ কয়েকটি বাইট পূরণ করতে পারেন, তবে এটি খুব সামান্য লাভের জন্য আরও কাজ, বিশেষত এখানে যখন এটি কেবল স্টার্টআপ কোডের এক অংশ।


1
ব্যবহারের সাথে খুব সম্মত হন memset()। তবে 4 বাইটের প্রান্তিককরণ কমবেশি প্রয়োজন। তাহলে কেন করবেন না?
কোডো

3
কোনওভাবেই আকার বা ফর্ম মেমসেট ব্যবহারের জন্য বুটস্ট্র্যাপের মানক সমাধান নয়, এটি পাগল।
old_timer

আপনি সেই ভাষা বুটস্ট্র্যাপ করতে একই ভাষা ব্যবহার করবেন না
old_timer

2
বুটস্ট্র্যাপ কোড এবং লিঙ্কার স্ক্রিপ্টটি খুব বিবাহিত, আপনি দেখতে পাবেন যে লিঙ্কার স্ক্রিপ্টটি কমপক্ষে একটি 4 বাইট সীমানায় .bss সারিবদ্ধ করে মাপ দেয় এবং একবারে নির্দেশাবলী অনুসারে 4x ওভার বাইট দ্বারা পূরণ করতে পারে (বুটস্ট্র্যাপে) (ধরে
নিলাম

3
@ ওল্ডটিমার, একটি নির্দিষ্ট মানকে মেমরি সেট করার জন্য স্ট্যান্ডার্ড সি ফাংশন memset(), এবং সি সেগুলিই প্রোগ্রামিং করছে বলে মনে হয় simple এর সরল বাস্তবায়নও memset()ঠিক সেই লুপের মতো, এটি অন্য অনেকের উপর নির্ভর করে। যেহেতু এটি একটি মাইক্রোকন্ট্রোলার, তাই আমি এটিও ধরে নিয়েছি যে কোনও গতিশীল সংযোগ নেই বা এরকম চলছে না (এবং লিঙ্কটির দিকে তাকানো আছে, এটি নেই, এটি main()শূণ্য লুপের পরে কেবলমাত্র একটি কল ), তাই সংকলকটি সেখানে নামার পক্ষে সক্ষম হতে memset()হবে অন্যান্য কার্যাবলী সহ (বা এটি ইনলাইন প্রয়োগ করতে)।
ilkkachu

4

শুধু পরিবর্তন !=করতে <। এটি সাধারণত যেহেতু একটি ভাল পদ্ধতির, কারণ এটি এর মতো সমস্যার সাথে সম্পর্কিত।


3

অন্যান্য অসংখ্য সাইট এবং উদাহরণ রয়েছে। দশ হাজার না হলে অনেক হাজার। লিঙ্কার স্ক্রিপ্ট এবং বুস্ট্র্যাপ কোড, নিউলিব, বিশেষত গ্লিবসি সহ সুপরিচিত সি লাইব্রেরি রয়েছে তবে আপনি খুঁজে পেতে পারেন এমন আরও কিছু আছে। সি সহ বুটস্ট্র্যাপিং কোনও অর্থ দেয় না।

আপনার প্রশ্নের উত্তর দেওয়া হয়েছে যে আপনি যে জিনিসগুলি সঠিক নাও হতে পারে তার তুলনায় সঠিক তুলনা করার চেষ্টা করছেন, এটি কোনও পরিচিত সীমানায় শুরু হতে পারে না বা একটি পরিচিত সীমানায় শেষ হতে পারে না। সুতরাং আপনি জিনিসটির চেয়ে কম কাজ করতে পারেন তবে কোডটি যদি সঠিক তুলনা করে কাজ করে না তবে তার অর্থ আপনি অতীতকে শূন্য করছেন b পরবর্তী অংশে যা খারাপ ঘটনা ঘটাতে পারে বা নাও পারে, তাই কেবল স্থায়ী চেয়ে কমের পরিবর্তে সমাধান.

সুতরাং এখানে টিএল যায়; ডিআর ঠিক আছে। আপনি সেই ভাষার সাথে কোনও ভাষা বুটস্ট্র্যাপ করবেন না, আপনি এটির সাথে নিশ্চিতভাবে দূরে সরে যেতে পারেন, তবে আপনি যখন এটি করেন তখন আপনি আগুন নিয়ে খেলছেন। আপনি যদি এটি কেবল শিখতে থাকেন তবে আপনাকে সাবধানতার দিকে থাকা দরকার, বোবা ভাগ্য বা সত্য যা আপনি এখনও উন্মোচন করেন নি।

লিঙ্কার স্ক্রিপ্ট এবং বুটস্ট্র্যাপ কোডের একটি খুব ঘনিষ্ঠ সম্পর্ক রয়েছে, তারা বিবাহিত, নিতম্বের সাথে যোগ দিয়েছেন, আপনি অন্যটি ব্যতীত এমন একটি বিকাশ করবেন না যা ব্যাপক ব্যর্থতার দিকে পরিচালিত করে। এবং দুর্ভাগ্যক্রমে লিঙ্কার স্ক্রিপ্টটি সংযোগকারী দ্বারা সংজ্ঞায়িতকারী লিঙ্কার এবং সমাবেশ ভাষা দ্বারা সংজ্ঞায়িত করা হয়েছে যাতে আপনি সরঞ্জামচেনগুলি পরিবর্তন করেন যেহেতু উভয়কেই আবার লিখতে হবে expect সমাবেশ ভাষা কেন? এটির জন্য কোনও বুটস্ট্র্যাপ প্রয়োজন নেই, সংকলিত ভাষাগুলি সাধারণত করে। সি যদি আপনি ল্যাঙ্গেজের ব্যবহার সীমাবদ্ধ না রাখতে চান, আপনি খুব সহজ কিছু দিয়ে শুরু করতে পারেন যার মধ্যে ন্যূনতম সরঞ্জামচেন নির্দিষ্ট প্রয়োজনীয়তা রয়েছে, আপনি ধরে নিবেন না। বিএসএস ভেরিয়েবলগুলি শূন্য হয় (কোডটি কম পঠনযোগ্য করে তোলে যদি সেই ভাষাতে ভেরিয়েবলটি আরম্ভ না করা হয় তবে) , এটি এড়াতে চেষ্টা করুন, স্থানীয় ভেরিয়েবলের ক্ষেত্রে এটি সত্য নয় তাই আপনি এটি কখন ব্যবহার করবেন তা বলের উপর থাকতে হবে f লোকেরা যাইহোক গ্লোবালগুলি দূরে সরিয়ে দেয়, তাহলে আমরা .bss এবং .data সম্পর্কে কেন কথা বলছি ??? (গ্লোবালগুলি এই স্তরের কাজের জন্য ভাল তবে এটি অন্য একটি বিষয়)) সাধারণ সমাধানের জন্য অন্যান্য নিয়মটি ঘোষণায় ভেরিয়েবলকে আরম্ভ করতে না দেওয়া, কোডে এটি করুন। হ্যাঁ আরও ফ্ল্যাশ জ্বলে, আপনার সাধারণত প্রচুর পরিমাণে থাকে, সমস্ত ভেরিয়েবলগুলি ধ্রুবকের সাথে আরম্ভ করা হয় না যা গ্রাসকারী নির্দেশাবলী শেষ করে।

আপনি কর্টেক্স-এম ডিজাইন থেকে বলতে পারেন যে তারা ভেবে থাকতে পারে যে কোনও বুটস্ট্র্যাপ কোড নেই তাই .ডাটা বা .bss সমর্থন নেই। বেশিরভাগ লোকেরা যে গ্লোবালগুলি ব্যবহার করতে পারে না তা এখানে না থাকলেই সরাসরি চলে যায়:

আমি gnu সরঞ্জামচেন ব্যবহার করে সমস্ত কর্টেক্স-এমএসের জন্য এটি আরও ন্যূনতম তবে একটি ন্যূনতম কার্যক্ষম উদাহরণ বানাতে পারি, আমি মনে করি না যে আপনি বর্তমান সংস্করণে xx.১০ xx এর সাথে কি শুরু করতে পারেন তবে আমি প্রায় somewhere এর কাছাকাছি লিঙ্কার স্ক্রিপ্টগুলি স্যুইচ করেছি। xx বা 4.xx আমি আরও শিখেছি এবং gnu এর ফলে এমন কিছু পরিবর্তন হয়েছিল যা আমার প্রথমটিকে ভেঙে দেয়।

বুটস্ট্র্যাপ:

.thumb

.thumb_func
.global _start
_start:
stacktop: .word 0x20000800
.word reset
.word done
.word done
.word done

.thumb_func
reset:
    bl centry
    b done

.thumb_func
done:   b .

.thumb_func
.globl bounce
bounce:
    bx lr

সি কোডে প্রবেশের স্থান:

void bounce ( unsigned int );

unsigned int a;

int centry ( void )
{
    a = 7;
    bounce(a);
    return(0);
}

লিঙ্কার স্ক্রিপ্ট।

MEMORY
{
    rom : ORIGIN = 0x00000000, LENGTH = 0x1000
    ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > rom
    .rodata : { *(.rodata*) } > rom
    .bss : { *(.bss*) } > ram
}

এগুলি সবই ছোট এবং এখনও কাজ হতে পারে, কেবল কর্মক্ষেত্রে এটি দেখার জন্য এখানে কিছু অতিরিক্ত জিনিস যুক্ত করা হয়েছে।

অপ্টিমাইজড বিল্ড এবং লিঙ্ক।

00000000 <_start>:
   0:   20001000
   4:   00000015
   8:   0000001b
   c:   0000001b
  10:   0000001b

00000014 <reset>:
  14:   f000 f804   bl  20 <centry>
  18:   e7ff        b.n 1a <done>

0000001a <done>:
  1a:   e7fe        b.n 1a <done>

0000001c <bounce>:
  1c:   4770        bx  lr
    ...

00000020 <centry>:
  20:   2207        movs    r2, #7
  22:   b510        push    {r4, lr}
  24:   4b04        ldr r3, [pc, #16]   ; (38 <centry+0x18>)
  26:   2007        movs    r0, #7
  28:   601a        str r2, [r3, #0]
  2a:   f7ff fff7   bl  1c <bounce>
  2e:   2000        movs    r0, #0
  30:   bc10        pop {r4}
  32:   bc02        pop {r1}
  34:   4708        bx  r1
  36:   46c0        nop         ; (mov r8, r8)
  38:   20000000    andcs   r0, r0, r0

Disassembly of section .bss:

20000000 <a>:
20000000:   00000000    andeq   r0, r0, r0

কিছু বিক্রেতাদের জন্য আপনি 0x08000000 বা 0x01000000 বা অন্যান্য অনুরূপ ঠিকানা ব্যবহার করতে চান কারণ সেখানে ফ্ল্যাশটি ম্যাপ করা হয়েছে এবং কিছু বুট মোডে 0x00000000 এ মিরর করা হয়েছে। কারও কারও কাছে 0x00000000 তে ফ্ল্যাশটি এত বেশি মিররড থাকে যাতে আপনি অ্যাপ্লিকেশন ফ্ল্যাশ স্পেসে ভেক্টর টেবিল পয়েন্টটি শূন্য নয়। যেহেতু এটি ভেক্টর টেবিল ভিত্তিক এটি সমস্ত কাজ করে।

প্রথম দ্রষ্টব্য কর্টেক্স-এমএসগুলি শুধুমাত্র থাম্ব মেশিন এবং যে কোনও কারণেই তারা থাম্ব ফাংশন ঠিকানা প্রয়োগ করেছে, যার অর্থ lsbit বিজোড়। আপনার সরঞ্জামগুলি জানুন, .thumb_func দিকনির্দেশনাগুলি gnu এসেম্বলারকে বলে যে পরবর্তী লেবেলটি একটি থাম্ব ফাংশন ঠিকানা। টেবিলে +1 জিনিস করা ব্যর্থতার দিকে পরিচালিত করে, এটি করার প্রলোভন করবেন না, এটি সঠিকভাবে করুন। ফাংশন ঘোষণার জন্য অন্যান্য gnu এসেম্বলারের উপায় রয়েছে এটি হ'ল ন্যূনতম পদ্ধতি।

   4:   00000015
   8:   0000001b
   c:   0000001b
  10:   0000001b

আপনি ভেক্টর টেবিলটি ডান পেতে না পারলে এটি বুট হবে না।

যুক্তিযুক্তভাবে কেবল স্ট্যাক পয়েন্টার ভেক্টর প্রয়োজন (আপনি যদি স্ট্যাক পয়েন্টারটিকে কোডে নিজেকে সেট করতে চান তবে সেখানে কিছু রাখতে পারেন) এবং রিসেট ভেক্টর প্রয়োজন। আমি কোন নির্দিষ্ট কারণে এখানে চারটি রাখি। সাধারণত 16 টি রাখুন তবে এই উদাহরণটি ছোট করতে চেয়েছিলেন wanted

সুতরাং একটি সি বুটস্ট্র্যাপের ন্যূনতম কী করা দরকার? 1. স্ট্যাক পয়েন্টার 2 সেট করুন 2. শূন্য .বিএস 3. কপি .ডাটা 4. শাখায় শাখা বা কল এন্ট্রি পয়েন্ট

সি প্রবেশের পয়েন্টটিকে সাধারণত প্রধান () বলা হয়। তবে কিছু সরঞ্জামচেনগুলি মূল () দেখায় এবং আপনার কোডগুলিতে অতিরিক্ত আবর্জনা যুক্ত করে। আমি ইচ্ছাকৃতভাবে একটি আলাদা নাম ব্যবহার করি। YMMV।

.data এর অনুলিপি প্রয়োজন হয় না যদি এটি সমস্ত ram ভিত্তিক হয়। কর্টেক্স-এম মাইক্রোকন্ট্রোলার হওয়ায় এটি প্রযুক্তিগতভাবে সম্ভব তবে অসম্ভব তাই ডেটা অনুলিপি প্রয়োজন ..... যদি সেখানে .ডাটা থাকে।

আমার প্রথম উদাহরণ এবং কোডিং শৈলী হল এই উদাহরণ হিসাবে .Data বা .bss উপর নির্ভর না করা। আর্ম স্ট্যাক পয়েন্টারটির যত্ন নিয়েছিল তাই কেবলমাত্র প্রবেশের পয়েন্টটি কল করা বাকি। আমি এটি পেতে চাই যাতে এন্ট্রি পয়েন্টটি ফিরে আসতে পারে, অনেক লোক যুক্তি দেয় যে আপনার কখনই এটি করা উচিত নয়। আপনি ঠিক তখন এটি করতে পারে:

.thumb_func
.global _start
_start:
stacktop: .word 0x20000800
.word centry
.word done
.word done
.word done

এবং সেন্ট্রি () থেকে ফিরে আসবেন না এবং রিসেট হ্যান্ডলার কোডটি নেই।

00000020 <centry>:
  20:   2207        movs    r2, #7
  22:   b510        push    {r4, lr}
  24:   4b04        ldr r3, [pc, #16]   ; (38 <centry+0x18>)
  26:   2007        movs    r0, #7
  28:   601a        str r2, [r3, #0]
  2a:   f7ff fff7   bl  1c <bounce>
  2e:   2000        movs    r0, #0
  30:   bc10        pop {r4}
  32:   bc02        pop {r1}
  34:   4708        bx  r1
  36:   46c0        nop         ; (mov r8, r8)
  38:   20000000    andcs   r0, r0, r0

Disassembly of section .bss:

20000000 <a>:
20000000:   00000000

লিঙ্কার আমাদের যেখানে জিজ্ঞাসা করেছিল সেখানে জিনিস রেখে দিয়েছে। এবং সামগ্রিকভাবে আমাদের একটি সম্পূর্ণ কার্যকরী প্রোগ্রাম রয়েছে।

সুতরাং লিঙ্কার স্ক্রিপ্টে প্রথমে কাজ করুন:

MEMORY
{
    bob : ORIGIN = 0x00000000, LENGTH = 0x1000
    ted : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > bob

    .rodata : { *(.rodata*) } > bob

   __data_rom_start__ = .;
   .data : {
    __data_start__ = .;
    *(.data*)
   } > ted AT > bob
   __data_end__ = .;
   __data_size__ = __data_end__ - __data_start__;

   .bss  : {
   __bss_start__ = .;
   *(.bss*)
   } > ted
   __bss_end__ = .;
   __bss_size__ = __bss_end__ - __bss_start__;

}

নামগুলি রোম এবং রামের কোনও অর্থ নেই বলে জোর দিয়ে তারা কেবল বিভাগগুলির মধ্যে লিঙ্কারের জন্য বিন্দুগুলিকে সংযুক্ত করে।

.thumb

.thumb_func
.global _start
_start:
stacktop: .word 0x20000800
.word reset
.word done
.word done
.word done

.thumb_func
reset:
    bl centry
    b done

.thumb_func
done:   b .

.thumb_func
.globl bounce
bounce:
    bx lr

.align
.word __data_rom_start__
.word __data_start__
.word __data_end__
.word __data_size__

কিছু আইটেম যুক্ত করুন যাতে আমরা দেখতে পাই যে সরঞ্জামগুলি কী করেছে

void bounce ( unsigned int );

unsigned int a;

unsigned int b=4;
unsigned char c=5;

int centry ( void )
{
    a = 7;
    bounce(a);
    return(0);
}

এই বিভাগগুলিতে কিছু আইটেম যুক্ত করুন। এবং পেতে

Disassembly of section .text:

00000000 <_start>:
   0:   20000800    andcs   r0, r0, r0, lsl #16
   4:   00000015    andeq   r0, r0, r5, lsl r0
   8:   0000001b    andeq   r0, r0, r11, lsl r0
   c:   0000001b    andeq   r0, r0, r11, lsl r0
  10:   0000001b    andeq   r0, r0, r11, lsl r0

00000014 <reset>:
  14:   f000 f80c   bl  30 <centry>
  18:   e7ff        b.n 1a <done>

0000001a <done>:
  1a:   e7fe        b.n 1a <done>

0000001c <bounce>:
  1c:   4770        bx  lr
  1e:   46c0        nop         ; (mov r8, r8)
  20:   0000004c    andeq   r0, r0, r12, asr #32
  24:   20000000    andcs   r0, r0, r0
  28:   20000008    andcs   r0, r0, r8
  2c:   00000008    andeq   r0, r0, r8

00000030 <centry>:
  30:   2207        movs    r2, #7
  32:   b510        push    {r4, lr}
  34:   4b04        ldr r3, [pc, #16]   ; (48 <centry+0x18>)
  36:   2007        movs    r0, #7
  38:   601a        str r2, [r3, #0]
  3a:   f7ff ffef   bl  1c <bounce>
  3e:   2000        movs    r0, #0
  40:   bc10        pop {r4}
  42:   bc02        pop {r1}
  44:   4708        bx  r1
  46:   46c0        nop         ; (mov r8, r8)
  48:   20000008    andcs   r0, r0, r8

Disassembly of section .data:

20000000 <c>:
20000000:   00000005    andeq   r0, r0, r5

20000004 <b>:
20000004:   00000004    andeq   r0, r0, r4

Disassembly of section .bss:

20000008 <a>:
20000008:   00000000    andeq   r0, r0, r0

এখানে আমরা সেই পরীক্ষায় যে জিনিসগুলি সন্ধান করছি তা হচ্ছে (আসলে কোনও কোড লোড বা চালানোর কোনও কারণ নোট করুন ... আপনার সরঞ্জামগুলি জানুন, সেগুলি শিখুন)

  1c:   4770        bx  lr
  1e:   46c0        nop         ; (mov r8, r8)
  20:   0000004c    andeq   r0, r0, r12, asr #32
  24:   20000000    andcs   r0, r0, r0
  28:   20000008    andcs   r0, r0, r8
  2c:   00000008    andeq   r0, r0, r8

সুতরাং আমরা এখানে যা শিখেছি তা হল gnu লিঙ্কার স্ক্রিপ্টগুলিতে ভেরিয়েবলের অবস্থান অত্যন্ত সংবেদনশীল। ডেটা_রোম_স্টার্ট বনাম ডেটা_স্টার্টের অবস্থানটি নোট করুন তবে কেন ডেটা_েন্ড কাজ করে? আমি আপনাকে খুঁজে বের করা যাক। ইতিমধ্যে বুঝতে পারে যে কেন কেউ লিঙ্কার স্ক্রিপ্টগুলির সাথে গোলযোগ করতে চান না এবং কেবল সাধারণ প্রোগ্রামিংয়ে যেতে চান ...

সুতরাং এখানে অন্য একটি জিনিস আমরা শিখেছি হ'ল লিঙ্কারটি আমাদের জন্য ডেটা_রোম স্টার্ট প্রান্তিককরণ করে আমাদের সেখানে একটি ALIGN (4) লাগেনি। আমাদের কি ধরে নেওয়া উচিত যে এটি সর্বদা কার্যকর হবে?

এছাড়াও নোট করুন যে এটি যাওয়ার সময় প্যাড করেছিলাম, আমাদের কাছে .ডাটা 5 বাইট রয়েছে তবে এটি আটটি করে আটটি করা হয়েছে any আমরা আজ আমার কম্পিউটারে এই সরঞ্জামচয়ন দিয়ে যা দেখি তার ভিত্তিতে, এটি কি অতীত এবং ভবিষ্যতের জন্য সত্য হতে পারে? কে জানে, এমনকি ALIGN- র সাথে কিছু নতুন সংস্করণ ভেঙে না যায় তা নিশ্চিত করার জন্য পর্যায়ক্রমে পরীক্ষা করা উচিত, তারা সময়ে সময়ে তা করবে।

সেই পরীক্ষা থেকে কেবল নিরাপদ থাকতে এটিকে এগিয়ে যেতে দেয়।

MEMORY
{
    bob : ORIGIN = 0x00000000, LENGTH = 0x1000
    ted : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > bob

    .rodata : { *(.rodata*) } > bob

   . = ALIGN(4);
   __data_rom_start__ = .;
   .data : {
    __data_start__ = .;
    *(.data*)
   . = ALIGN(4);
   __data_end__ = .;
   } > ted AT > bob
   __data_size__ = __data_end__ - __data_start__;

   . = ALIGN(4);
   .bss  : {
   __bss_start__ = .;
   *(.bss*)
   . = ALIGN(4);
   __bss_end__ = .;
   } > ted
   __bss_size__ = __bss_end__ - __bss_start__;

}

অন্যান্য লোকেরা যা করে তার সাথে সামঞ্জস্য রাখতে প্রান্তকে ভিতরে নিয়ে যাওয়া। এবং এটি এটি পরিবর্তন করতে পারে না:

0000001c <bounce>:
  1c:   4770        bx  lr
  1e:   46c0        nop         ; (mov r8, r8)
  20:   0000004c    andeq   r0, r0, r12, asr #32
  24:   20000000    andcs   r0, r0, r0
  28:   20000008    andcs   r0, r0, r8
  2c:   00000008    andeq   r0, r0, r8

আরও একটি দ্রুত পরীক্ষা:

.globl bounce
bounce:
    nop
    bx lr

দান

0000001c <bounce>:
  1c:   46c0        nop         ; (mov r8, r8)
  1e:   4770        bx  lr
  20:   0000004c    andeq   r0, r0, r12, asr #32
  24:   20000000    andcs   r0, r0, r0
  28:   20000008    andcs   r0, r0, r8
  2c:   00000008    andeq   r0, r0, r8

বাউন্স এবং .lign এর মধ্যে প্যাডের দরকার নেই

ওহ, ঠিক আছে, আমার এখন মনে আছে কেন আমি _যে ___ ভিতরে রাখি না। কারণ এটি কাজ করে না।

MEMORY
{
    bob : ORIGIN = 0x00000000, LENGTH = 0x1000
    ted : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > bob

    .rodata : { *(.rodata*) } > bob

   . = ALIGN(4);
   __data_rom_start__ = .;
   .data : {
    __data_start__ = .;
    *(.data*)
   } > ted AT > bob
   . = ALIGN(4);
   __data_end__ = .;
   __data_size__ = __data_end__ - __data_start__;

   . = ALIGN(4);
   .bss  : {
   __bss_start__ = .;
   *(.bss*)
   } > ted
   . = ALIGN(4);
   __bss_end__ = .;
   __bss_size__ = __bss_end__ - __bss_start__;

}

এই লিঙ্কার স্ক্রিপ্টে বিবাহ করার জন্য কিছু সাধারণ, তবে খুব বহনযোগ্য কোড

.thumb

.thumb_func
.global _start
_start:
stacktop: .word 0x20000800
.word reset
.word done
.word done
.word done

.thumb_func
reset:

    ldr r0,blen
    cmp r0,#0
    beq bss_zero_done
    ldr r1,bstart
    mov r2,#0
bss_zero:
    stmia r1!,{r2}
    sub r0,#4
    bne bss_zero
bss_zero_done:

    ldr r0,dlen
    cmp r0,#0
    beq data_copy_done
    ldr r1,rstart
    ldr r2,dstart
data_copy:
    ldmia r1!,{r3}
    stmia r2!,{r3}
    sub r0,#4
    bne data_copy
data_copy_done:

    bl centry
    b done

.thumb_func
done:   b .

.thumb_func
.globl bounce
bounce:
    nop
    bx lr

.align
bstart: .word __bss_start__
blen:   .word __bss_size__
rstart: .word __data_rom_start__
dstart: .word __data_start__
dlen:   .word __data_size__

দান

Disassembly of section .text:

00000000 <_start>:
   0:   20000800    andcs   r0, r0, r0, lsl #16
   4:   00000015    andeq   r0, r0, r5, lsl r0
   8:   0000003d    andeq   r0, r0, sp, lsr r0
   c:   0000003d    andeq   r0, r0, sp, lsr r0
  10:   0000003d    andeq   r0, r0, sp, lsr r0

00000014 <reset>:
  14:   480c        ldr r0, [pc, #48]   ; (48 <blen>)
  16:   2800        cmp r0, #0
  18:   d004        beq.n   24 <bss_zero_done>
  1a:   490a        ldr r1, [pc, #40]   ; (44 <bstart>)
  1c:   2200        movs    r2, #0

0000001e <bss_zero>:
  1e:   c104        stmia   r1!, {r2}
  20:   3804        subs    r0, #4
  22:   d1fc        bne.n   1e <bss_zero>

00000024 <bss_zero_done>:
  24:   480b        ldr r0, [pc, #44]   ; (54 <dlen>)
  26:   2800        cmp r0, #0
  28:   d005        beq.n   36 <data_copy_done>
  2a:   4908        ldr r1, [pc, #32]   ; (4c <rstart>)
  2c:   4a08        ldr r2, [pc, #32]   ; (50 <dstart>)

0000002e <data_copy>:
  2e:   c908        ldmia   r1!, {r3}
  30:   c208        stmia   r2!, {r3}
  32:   3804        subs    r0, #4
  34:   d1fb        bne.n   2e <data_copy>

00000036 <data_copy_done>:
  36:   f000 f80f   bl  58 <centry>
  3a:   e7ff        b.n 3c <done>

0000003c <done>:
  3c:   e7fe        b.n 3c <done>

0000003e <bounce>:
  3e:   46c0        nop         ; (mov r8, r8)
  40:   4770        bx  lr
  42:   46c0        nop         ; (mov r8, r8)

00000044 <bstart>:
  44:   20000008    andcs   r0, r0, r8

00000048 <blen>:
  48:   00000004    andeq   r0, r0, r4

0000004c <rstart>:
  4c:   00000074    andeq   r0, r0, r4, ror r0

00000050 <dstart>:
  50:   20000000    andcs   r0, r0, r0

00000054 <dlen>:
  54:   00000008    andeq   r0, r0, r8

00000058 <centry>:
  58:   2207        movs    r2, #7
  5a:   b510        push    {r4, lr}
  5c:   4b04        ldr r3, [pc, #16]   ; (70 <centry+0x18>)
  5e:   2007        movs    r0, #7
  60:   601a        str r2, [r3, #0]
  62:   f7ff ffec   bl  3e <bounce>
  66:   2000        movs    r0, #0
  68:   bc10        pop {r4}
  6a:   bc02        pop {r1}
  6c:   4708        bx  r1
  6e:   46c0        nop         ; (mov r8, r8)
  70:   20000008    andcs   r0, r0, r8

Disassembly of section .data:

20000000 <c>:
20000000:   00000005    andeq   r0, r0, r5

20000004 <b>:
20000004:   00000004    andeq   r0, r0, r4

Disassembly of section .bss:

20000008 <a>:
20000008:   00000000    andeq   r0, r0, r0

আমরা সেখানে থামতে বা চালিয়ে যেতে পারি আমরা যদি লিঙ্কার স্ক্রিপ্টের মতো একই ক্রমে সূচনা করি তবে ঠিক আছে যে আমরা এখনও সেখানে না পাওয়ায় পরের জিনিসটির দিকে চলে যাই। এবং স্টেম / এলডিএম কেবলমাত্র শব্দ প্রান্তিক ঠিকানাগুলি ব্যবহার করতে প্রয়োজনীয় / আকাঙ্ক্ষিত, তাই আপনি যদি এতে পরিবর্তন করেন:

    ldr r0,blen
    cmp r0,#0
    beq bss_zero_done
    ldr r1,bstart
    mov r2,#0
    mov r3,#0
    mov r4,#0
    mov r5,#0
bss_zero:
    stmia r1!,{r2,r3,r4,r5}
    sub r0,#16
    ble bss_zero
bss_zero_done:

লিঙ্কার স্ক্রিপ্টে প্রথমে বিএস সহ, এবং হ্যাঁ আপনি ব্লাড না চান।

Disassembly of section .text:

00000000 <_start>:
   0:   20000800    andcs   r0, r0, r0, lsl #16
   4:   00000015    andeq   r0, r0, r5, lsl r0
   8:   00000043    andeq   r0, r0, r3, asr #32
   c:   00000043    andeq   r0, r0, r3, asr #32
  10:   00000043    andeq   r0, r0, r3, asr #32

00000014 <reset>:
  14:   480d        ldr r0, [pc, #52]   ; (4c <blen>)
  16:   2800        cmp r0, #0
  18:   d007        beq.n   2a <bss_zero_done>
  1a:   490b        ldr r1, [pc, #44]   ; (48 <bstart>)
  1c:   2200        movs    r2, #0
  1e:   2300        movs    r3, #0
  20:   2400        movs    r4, #0
  22:   2500        movs    r5, #0

00000024 <bss_zero>:
  24:   c13c        stmia   r1!, {r2, r3, r4, r5}
  26:   3804        subs    r0, #4
  28:   ddfc        ble.n   24 <bss_zero>

0000002a <bss_zero_done>:
  2a:   480b        ldr r0, [pc, #44]   ; (58 <dlen>)
  2c:   2800        cmp r0, #0
  2e:   d005        beq.n   3c <data_copy_done>
  30:   4907        ldr r1, [pc, #28]   ; (50 <rstart>)
  32:   4a08        ldr r2, [pc, #32]   ; (54 <dstart>)

00000034 <data_copy>:
  34:   c978        ldmia   r1!, {r3, r4, r5, r6}
  36:   c278        stmia   r2!, {r3, r4, r5, r6}
  38:   3810        subs    r0, #16
  3a:   ddfb        ble.n   34 <data_copy>

0000003c <data_copy_done>:
  3c:   f000 f80e   bl  5c <centry>
  40:   e7ff        b.n 42 <done>

00000042 <done>:
  42:   e7fe        b.n 42 <done>

00000044 <bounce>:
  44:   46c0        nop         ; (mov r8, r8)
  46:   4770        bx  lr

00000048 <bstart>:
  48:   20000000    andcs   r0, r0, r0

0000004c <blen>:
  4c:   00000004    andeq   r0, r0, r4

00000050 <rstart>:
  50:   20000004    andcs   r0, r0, r4

00000054 <dstart>:
  54:   20000004    andcs   r0, r0, r4

00000058 <dlen>:
  58:   00000008    andeq   r0, r0, r8

0000005c <centry>:
  5c:   2207        movs    r2, #7
  5e:   b510        push    {r4, lr}
  60:   4b04        ldr r3, [pc, #16]   ; (74 <centry+0x18>)
  62:   2007        movs    r0, #7
  64:   601a        str r2, [r3, #0]
  66:   f7ff ffed   bl  44 <bounce>
  6a:   2000        movs    r0, #0
  6c:   bc10        pop {r4}
  6e:   bc02        pop {r1}
  70:   4708        bx  r1
  72:   46c0        nop         ; (mov r8, r8)
  74:   20000000    andcs   r0, r0, r0

Disassembly of section .bss:

20000000 <a>:
20000000:   00000000    andeq   r0, r0, r0

Disassembly of section .data:

20000004 <c>:
20000004:   00000005    andeq   r0, r0, r5

20000008 <b>:
20000008:   00000004    andeq   r0, r0, r4

এই লুপগুলি দ্রুত যাবে। আমি জানি না আহ্ব বাসগুলি 64৪ বিট প্রশস্ত হতে পারে কি না তবে পুরো আকারের বাহুর জন্য আপনি এই জিনিসগুলি bit৪ বিটের সীমানায় সারিবদ্ধ করতে চান। ৩২ বিট বাউন্ডারে চারটি রেজিস্ট্রার এলডিএম / স্টেম কিন্তু একটি 64৪ বিট বাউন্ডারি নয় তিনটি পৃথক বাস লেনদেন হয়, যেখানে bit৪ বিটের বাউন্ডারে সারিবদ্ধভাবে থাকা একক লেনদেন নির্দেশ অনুসারে বেশ কয়েকটি ঘড়ি সাশ্রয় করে।

যেহেতু আমরা বেয়ারমেটাল করছি এবং আমরা প্রথমে বিএসএস বলতে পারি তার জন্য আমরা পুরোপুরি দায়বদ্ধ তখন আমাদের কাছে যদি স্তূপ থাকে তবে স্ট্যাকটি উপরের থেকে নীচে থেকে বাড়তে থাকে, তাই আমরা যদি শূন্য বিএসএস করি এবং এতক্ষণে কিছুটা ছড়িয়ে দিই যে আমরা শুরু করি সঠিক জায়গাটি ঠিক আছে আমরা এখনও সেই স্মৃতি ব্যবহার করছি না। তারপরে আমরা .ডাটা ওপরে অনুলিপি করতে পারি এবং জরিমানার জরিমানা intoুকে যায়, গাদা বা স্ট্যাকের জন্য প্রচুর জায়গা নেই তাই আমরা কারও / কিছুতেই পদক্ষেপ নিচ্ছি না (যতক্ষণ আমরা লিঙ্কার স্ক্রিপ্টটিতে নিশ্চিত হয়েছি যে আমরা এটি করি। যদি কোনও উদ্বেগ থাকে তবে ALIGN () কে আরও বড় করে তুলুন যাতে আমরা এই স্থানগুলি পূরণের জন্য সর্বদা আমাদের স্থানের মধ্যে থাকি।

সুতরাং আমার সহজ সমাধান, এটি নিতে বা এটি ছেড়ে। কোনও বাগ ঠিক করতে স্বাগত জানাই, আমি এটি হার্ডওয়ার বা আমার সিমুলেটরটিতে চালাতাম না ...

MEMORY
{
    bob : ORIGIN = 0x00000000, LENGTH = 0x1000
    ted : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > bob

    .rodata : { *(.rodata*) } > bob

   . = ALIGN(8);
   .bss  : {
   __bss_start__ = .;
   *(.bss*)
   } > ted
   . = ALIGN(4);
   __bss_end__ = .;
   __bss_size__ = __bss_end__ - __bss_start__;

   . = ALIGN(8);
   __data_rom_start__ = .;
   .data : {
    __data_start__ = .;
    *(.data*)
   } > ted AT > bob
   . = ALIGN(4);
   __data_end__ = .;
   __data_size__ = __data_end__ - __data_start__;

}



.thumb

.thumb_func
.global _start
_start:
stacktop: .word 0x20000800
.word reset
.word done
.word done
.word done

.thumb_func
reset:

    ldr r0,blen
    cmp r0,#0
    beq bss_zero_done
    ldr r1,bstart
    mov r2,#0
    mov r3,#0
    mov r4,#0
    mov r5,#0
bss_zero:
    stmia r1!,{r2,r3,r4,r5}
    sub r0,#16
    ble bss_zero
bss_zero_done:

    ldr r0,dlen
    cmp r0,#0
    beq data_copy_done
    ldr r1,rstart
    ldr r2,dstart
data_copy:
    ldmia r1!,{r3,r4,r5,r6}
    stmia r2!,{r3,r4,r5,r6}
    sub r0,#16
    ble data_copy
data_copy_done:

    bl centry
    b done

.thumb_func
done:   b .

.thumb_func
.globl bounce
bounce:
    nop
    bx lr

.align
bstart: .word __bss_start__
blen:   .word __bss_size__
rstart: .word __data_rom_start__
dstart: .word __data_start__
dlen:   .word __data_size__


void bounce ( unsigned int );

unsigned int a;

unsigned int b=4;
unsigned char c=5;

int centry ( void )
{
    a = 7;
    bounce(a);
    return(0);
}

arm-none-eabi-as --warn --fatal-warnings flash.s -o flash.o
arm-none-eabi-ld -o hello.elf -T flash.ld flash.o centry.o
arm-none-eabi-objdump -D hello.elf > hello.list
arm-none-eabi-objcopy hello.elf hello.bin -O binary

সব একসাথে রাখুন এবং আপনি পাবেন:

Disassembly of section .text:

00000000 <_start>:
   0:   20000800    andcs   r0, r0, r0, lsl #16
   4:   00000015    andeq   r0, r0, r5, lsl r0
   8:   00000043    andeq   r0, r0, r3, asr #32
   c:   00000043    andeq   r0, r0, r3, asr #32
  10:   00000043    andeq   r0, r0, r3, asr #32

00000014 <reset>:
  14:   480d        ldr r0, [pc, #52]   ; (4c <blen>)
  16:   2800        cmp r0, #0
  18:   d007        beq.n   2a <bss_zero_done>
  1a:   490b        ldr r1, [pc, #44]   ; (48 <bstart>)
  1c:   2200        movs    r2, #0
  1e:   2300        movs    r3, #0
  20:   2400        movs    r4, #0
  22:   2500        movs    r5, #0

00000024 <bss_zero>:
  24:   c13c        stmia   r1!, {r2, r3, r4, r5}
  26:   3810        subs    r0, #16
  28:   ddfc        ble.n   24 <bss_zero>

0000002a <bss_zero_done>:
  2a:   480b        ldr r0, [pc, #44]   ; (58 <dlen>)
  2c:   2800        cmp r0, #0
  2e:   d005        beq.n   3c <data_copy_done>
  30:   4907        ldr r1, [pc, #28]   ; (50 <rstart>)
  32:   4a08        ldr r2, [pc, #32]   ; (54 <dstart>)

00000034 <data_copy>:
  34:   c978        ldmia   r1!, {r3, r4, r5, r6}
  36:   c278        stmia   r2!, {r3, r4, r5, r6}
  38:   3810        subs    r0, #16
  3a:   ddfb        ble.n   34 <data_copy>

0000003c <data_copy_done>:
  3c:   f000 f80e   bl  5c <centry>
  40:   e7ff        b.n 42 <done>

00000042 <done>:
  42:   e7fe        b.n 42 <done>

00000044 <bounce>:
  44:   46c0        nop         ; (mov r8, r8)
  46:   4770        bx  lr

00000048 <bstart>:
  48:   20000000    andcs   r0, r0, r0

0000004c <blen>:
  4c:   00000004    andeq   r0, r0, r4

00000050 <rstart>:
  50:   20000008    andcs   r0, r0, r8

00000054 <dstart>:
  54:   20000004    andcs   r0, r0, r4

00000058 <dlen>:
  58:   00000008    andeq   r0, r0, r8

0000005c <centry>:
  5c:   2207        movs    r2, #7
  5e:   b510        push    {r4, lr}
  60:   4b04        ldr r3, [pc, #16]   ; (74 <centry+0x18>)
  62:   2007        movs    r0, #7
  64:   601a        str r2, [r3, #0]
  66:   f7ff ffed   bl  44 <bounce>
  6a:   2000        movs    r0, #0
  6c:   bc10        pop {r4}
  6e:   bc02        pop {r1}
  70:   4708        bx  r1
  72:   46c0        nop         ; (mov r8, r8)
  74:   20000000    andcs   r0, r0, r0

Disassembly of section .bss:

20000000 <a>:
20000000:   00000000    andeq   r0, r0, r0

Disassembly of section .data:

20000004 <c>:
20000004:   00000005    andeq   r0, r0, r5

20000008 <b>:
20000008:   00000004    andeq   r0, r0, r4

নোট করুন যে এটি আর্ম-নন-ইবি- এবং আর্ম-লিনাক্স-জ্ঞুয়াবি এবং অন্যান্য ভেরিয়েন্টগুলির সাথে কাজ করে কারণ কোনও ঘি হুইস স্টাফ ব্যবহার করা হয়নি।

আপনি যখন আশেপাশে দেখবেন যে লোকেরা তাদের লিঙ্কার স্ক্রিপ্টগুলিতে ঘি হুইস স্টাফগুলি সহ বিশাল পাগল রান্নাঘরের সিঙ্ক জিনিসগুলি পাগল হয়ে যাবে। কারও এলেসের স্টাফের উপর নির্ভর করার চেয়ে আপনি কী করতে চান তা জানেন (বা কীভাবে সরঞ্জামগুলি আয়ত্ত করতে হবে তার চেয়ে ভাল কী কী করে আপনি কী নিয়ন্ত্রণ করতে পারেন) এবং এটি কোথায় ভেঙে যাচ্ছে তা জানেন না কারণ আপনি বুঝতে পারবেন না এবং / অথবা গবেষণা করতে চান না এটা।

সাধারণ নিয়মে কোনও ভাষা একই ভাষার সাথে বুটস্ট্র্যাপ না করে (এই অর্থে বুটস্ট্র্যাপের অর্থ চলমান কোড একই সংকলক দিয়ে সংকলক সংকলন করে না) আপনি একটি বুটস্ট্র্যাপ কম দিয়েই একটি সহজ ভাষা ব্যবহার করতে চান। এজন্য সি সমাবেশে করা হয়, এর কোনও বুটস্ট্র্যাপ প্রয়োজনীয়তা নেই যা আপনি পুনরায় সেট করার পরে প্রথম নির্দেশিকা থেকে শুরু করে। জাভা, নিশ্চিত যে আপনি সিতে জেভিএম লিখতে পারেন এবং যে সিটি asm সহ বুটস্ট্র্যাপ করে তারপরে JAVA বুটস্ট্র্যাপ করুন যদি আপনি সি এর সাথে থাকেন তবে জেভিএ সি তেও কার্যকর করেন।

যেহেতু আমরা এই অনুলিপি লুপগুলিতে অনুমানগুলি নিয়ন্ত্রণ করি সেগুলি হ্যান্ড টিউনড মেমকি / মেমসেটের তুলনায় আরও কঠোর এবং ক্লিনার।

নোট করুন আপনার অন্যান্য সমস্যাটি ছিল:

unsigned int * bss_start_p = &_BSS_START; 
unsigned int * bss_end_p = &_BSS_END;

এগুলি যদি স্থানীয় জরিমানা হয়, সমস্যা নেই, যদি এগুলি বিশ্বব্যাপী হয় তবে আপনার কাজ করার জন্য প্রথমে আপনার ডেটা শুরু করতে হবে এবং আপনি যদি সেই কৌশলটি ব্যবহার করার চেষ্টা করেন তবে ডেটা আপনি ব্যর্থ হবেন। স্থানীয় পরিবর্তনশীল, সূক্ষ্ম যে কাজ করবে। যদি আপনি কোনও কারণে স্থির স্থানীয় (স্থানীয় গ্লোবালগুলি আমি তাদের কল করতে পছন্দ করি) করার সিদ্ধান্ত নিয়েছেন তবে আপনি আবার সমস্যায় ফিরবেন। প্রতিবার আপনি যখন কোনও ঘোষণায় একটি অ্যাসাইনমেন্ট করেন তবে আপনার এটি সম্পর্কে চিন্তা করা উচিত, এটি কীভাবে কার্যকর হয় এবং এটি নিরাপদ / বুদ্ধিমান। প্রতিবার যখন আপনি কোনও ভেরিয়েবল শূন্য হয় তখন অঘোষিত, একই চুক্তি, কোনও স্থানীয় ভেরিয়েবল যদি এটি শূন্য হিসাবে ধরে না নেওয়া হয় তবে এটি যদি বিশ্বব্যাপী হয়। আপনি যদি এগুলিকে কখনই শূন্য বলে ধরে না নেন তবে আপনার কখনই চিন্তা করার দরকার নেই।


দুর্দান্ত, আমি উত্তরে দ্বিতীয়বারের চেয়ে সর্বোচ্চ চরিত্রের সংখ্যাটি ছাড়িয়ে গেলাম ....
old_timer

এই প্রশ্নটি বৈদ্যুতিক প্রকৌশল নয় স্ট্যাকওভারফ্লো সম্পর্কিত।
old_timer

এছাড়াও আপনার প্রশ্নের কোনও বাহ্যিক লিঙ্কের উপর নির্ভর করা ভাল ফর্ম নয়, যদি লিঙ্কটি প্রশ্নের আগে চলে যায় তবে প্রশ্নের কোনও অর্থ হতে পারে না।
old_timer

এই ক্ষেত্রে আপনার শিরোনাম এবং বিষয়বস্তু জানতে যথেষ্ট যে আপনি একটি নির্দিষ্ট মাইক্রোকন্ট্রোলার সি সি বুটস্ট্র্যাপ করার চেষ্টা করছেন এবং। বিএসএস এবং .ডাটা সূচনাতে ঘুরে বেড়াচ্ছেন
old_timer

তবে এক্ষেত্রে অন্যথায় খুব তথ্যপূর্ণ ওয়েবসাইট দ্বারা বিভ্রান্ত করা হয়েছে।
old_timer
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.