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