ධාවනය කළ හැකි උදාහරණ
තාක්ෂණික වශයෙන්, මෙහෙයුම් පද්ධතියක් නොමැතිව ක්රියාත්මක වන වැඩසටහනක් යනු මෙහෙයුම් පද්ධතියකි. එබැවින් අවම ආයුබෝවන් ලෝක මෙහෙයුම් පද්ධති නිර්මාණය කර ක්රියාත්මක කරන්නේ කෙසේදැයි බලමු.
පහත දැක්වෙන සියලුම උදාහරණ වල කේතය මෙම GitHub repo හි ඇත.
ඇරඹුම් අංශය
X86 මත, ඔබට සිදු කළ හැකි සරළ හා අවම මට්ටමේ දෙයක් නිර්මාණය කිරීමට වන ප්රධාන ඇරඹුම් අංශය (MBR) වර්ගයක් වන, ඇරඹුම් අංශයේ , පසුව තැටියට එය ස්ථාපනය කරන්න.
මෙන්න අපි තනි printf
ඇමතුමකින් එකක් නිර්මාණය කරමු :
printf '\364%509s\125\252' > main.img
sudo apt-get install qemu-system-x86
qemu-system-x86_64 -hda main.img
ප්රති come ලය:
උබුන්ටු 18.04, QEMU 2.11.1 හි පරීක්ෂා කර ඇත.
main.img
පහත සඳහන් දෑ අඩංගු වේ:
\364
octal == 0xf4
in hex: hlt
උපදෙස් සඳහා කේතන ක්රමය , වැඩ කිරීම නවත්වන ලෙස CPU ට පවසයි.
එබැවින් අපගේ වැඩසටහන කිසිවක් නොකරනු ඇත: ආරම්භ කර නතර කරන්න.
\x
හෙක්ස් අංක POSIX මගින් නිශ්චිතව දක්වා නොමැති නිසා අපි අෂ්ටක භාවිතා කරමු .
අපට මෙම කේතනය පහසුවෙන් ලබා ගත හැකිය:
echo hlt > a.asm
nasm -f bin a.asm
hd a
නමුත් 0xf4
කේතන ක්රමය ඇත්ත වශයෙන්ම ඉන්ටෙල් අත්පොතෙහි ලේඛනගත කර ඇත.
%509s
අවකාශ 509 ක් නිපදවන්න. බයිට් 510 වන තෙක් ගොනුව පිරවීම අවශ්ය වේ.
\125\252
octal == 0x55
ඉන්පසු 0xaa
: දෘඩාංගයට අවශ්ය මැජික් බයිට්. ඒවා 511 සහ 512 බයිට් විය යුතුය.
නොමැති නම්, දෘඩාංග මෙය ආරම්භ කළ හැකි තැටියක් ලෙස සලකන්නේ නැත.
කිසිවක් නොකර, අක්ෂර කිහිපයක් දැනටමත් තිරය මත මුද්රණය කර ඇති බව සලකන්න. ඒවා ස්ථිරාංග මඟින් මුද්රණය කර ඇති අතර පද්ධතිය හඳුනා ගැනීමට සේවය කරයි.
සැබෑ දෘඩාංග මත ධාවනය කරන්න
ඉමියුලේටර් විනෝදජනකයි, නමුත් දෘඩාංග යනු සැබෑ ගනුදෙනුවයි.
කෙසේ වෙතත් මෙය භයානක බව සලකන්න, ඔබට වැරදීමකින් ඔබේ තැටිය අතුගා දැමිය හැකිය: විවේචනාත්මක දත්ත අඩංගු නොවන පැරණි යන්ත්රවල පමණක් මෙය කරන්න! හෝ ඊටත් වඩා හොඳ, රාස්ප්බෙරි පයි වැනි ඩිවෝබෝඩ්, පහත ARM උදාහරණය බලන්න.
සාමාන්ය ලැප්ටොප් පරිගණකයක් සඳහා, ඔබ මෙවැනි දෙයක් කළ යුතුය:
රූපය USB පොල්ලකට පුළුස්සා දමන්න (ඔබගේ දත්ත විනාශ කරයි!):
sudo dd if=main.img of=/dev/sdX
පරිගණකයක් මත USB ප්ලග් කරන්න
එය සක්රිය කරන්න
USB වෙතින් ආරම්භ කිරීමට එය කියන්න.
මෙයින් අදහස් කරන්නේ දෘඩ තැටියට පෙර ස්ථිරාංග USB තෝරා ගැනීමයි.
එය ඔබගේ යන්ත්රයේ සුපුරුදු හැසිරීම නොවේ නම්, ඔබ USB වෙතින් ආරම්භ කිරීමට තෝරා ගත හැකි ඇරඹුම් මෙනුවක් ලබා ගන්නා තෙක් බලය ක්රියාත්මක කිරීමෙන් පසු Enter, F12, ESC හෝ වෙනත් අමුතු යතුරු එබීම දිගටම කරගෙන යන්න.
බොහෝ විට එම මෙනු වල සෙවුම් අනුපිළිවෙල වින්යාස කිරීමට හැකිය.
උදාහරණයක් ලෙස, මගේ පැරණි ලෙනොවෝ තින්ක්පැඩ් T430, UEFI BIOS 1.16 හි මට දැකිය හැකිය:
හෙලෝ වර්ල්ඩ්
දැන් අපි අවම වැඩසටහනක් කර ඇති නිසා, අපි ආයුබෝවන් ලෝකයකට යමු.
පැහැදිලිව පෙනෙන ප්රශ්නය නම්: IO කරන්නේ කෙසේද? විකල්ප කිහිපයක්:
- ස්ථිරාංග වලින් විමසන්න, උදා: BIOS හෝ UEFI, අප වෙනුවෙන් නම් කරන්න
- VGA: විශේෂ මතක කලාපයක් ලියා ඇත්නම් තිරයට මුද්රණය වේ. ආරක්ෂිත මාදිලියේ භාවිතා කළ හැකිය.
- ධාවකයක් ලියන්න සහ දර්ශන දෘඩාංග සමඟ කෙලින්ම කතා කරන්න. මෙය කිරීමට “නිසි” ක්රමය මෙයයි: වඩා බලවත්, නමුත් වඩා සංකීර්ණ.
අනුක්රමික වරාය . මෙය ඉතා සරල ප්රමිතිගත ප්රොටෝකෝලයක් වන අතර එය ධාරක පර්යන්තයකින් අක්ෂර යවා ලබා ගනී.
මූලාශ්රය .
අවාසනාවකට එය බොහෝ නවීන ලැප්ටොප් පරිගණකවල නිරාවරණය වී නැත, නමුත් සංවර්ධන මණ්ඩල සඳහා යා හැකි පොදු ක්රමය මෙයයි, පහත ARM උදාහරණ බලන්න.
උදාහරණයක් ලෙස ලිනක්ස් කර්නලය නිදොස් කිරීමට එවැනි අතුරුමුහුණත් ඇත්තෙන්ම ප්රයෝජනවත් බැවින් මෙය ඇත්තෙන්ම ලැජ්ජාවකි .
චිප්ස් වල නිදොස් කිරීමේ අංග භාවිතා කරන්න. ARM ඔවුන්ගේ අර්ධ හොස්ටින් ලෙස හැඳින්වේ . සැබෑ දෘඩාංග මත, එයට අමතර දෘඩාංග හා මෘදුකාංග සහාය අවශ්ය වේ, නමුත් ඉමුලේටර් මත එය නොමිලේ පහසු විකල්පයක් විය හැකිය. උදාහරණය .
X86 මත සරල වන බැවින් මෙන්න අපි BIOS උදාහරණයක් කරන්නෙමු. නමුත් එය වඩාත්ම ශක්තිමත් ක්රමය නොවන බව සලකන්න.
main.S
.code16
mov $msg, %si
mov $0x0e, %ah
loop:
lodsb
or %al, %al
jz halt
int $0x10
jmp loop
halt:
hlt
msg:
.asciz "hello world"
link.ld
SECTIONS
{
. = 0x7c00;
.text :
{
__start = .;
*(.text)
. = 0x1FE;
SHORT(0xAA55)
}
}
එකලස් කර සම්බන්ධ කරන්න:
gcc -c -g -o main.o main.S
ld --oformat binary -o main.img -T linker.ld main.o
ප්රති come ලය:
පරීක්ෂා කර ඇත්තේ: ලෙනොවෝ තින්ක්පැඩ් T430, UEFI BIOS 1.16. උබුන්ටු 18.04 ධාරකයක තැටිය ජනනය කර ඇත.
සම්මත පරිශීලක එක්රැස්වීමේ උපදෙස් වලට අමතරව, අපට ඇත්තේ:
.code16
: බිට් 16 කේතය ප්රතිදානය කිරීමට GAS ට කියයි
cli
: මෘදුකාංග බාධා කිරීම් අක්රීය කරන්න. එමඟින් ප්රොසෙසරය නැවත ක්රියාත්මක වීමට පටන් ගත හැකියhlt
int $0x10
: BIOS ඇමතුමක් දෙයි. අක්ෂර එකින් එක මුද්රණය කරන්නේ මෙයයි.
වැදගත් සම්බන්ධක කොඩි:
--oformat binary
: අමු ද්විමය එකලස් කිරීමේ කේතය ප්රතිදානය කරන්න, සාමාන්ය පරිශීලක ක්රියාකරවන්නන් සඳහා වන පරිදි ඊඑල්එෆ් ගොනුවක් තුළ එය උණුසුම් නොකරන්න.
එකලස් කිරීම වෙනුවට C භාවිතා කරන්න
සී එකලස් කිරීම සඳහා සම්පාදනය කරන බැවින්, සම්මත පුස්තකාලයක් නොමැතිව සී භාවිතා කිරීම ඉතා සරල බැවින් ඔබට මූලික වශයෙන් අවශ්ය වන්නේ:
- දේවල් මතකයේ තබා ගැනීමට සම්බන්ධක පිටපතක්
- සම්මත පුස්තකාලය භාවිතා නොකරන ලෙස GCC ට පවසන ධජ
- අවශ්ය සී තත්වය සකසන ඉතා කුඩා එකලස් කිරීමේ ස්ථානයක්
main
, විශේෂයෙන්:
- තොගය
- බීඑස්එස් වලින් බිංදුව
TODO: GitHub හි x86 උදාහරණයක් සම්බන්ධ කරන්න. මෙන්න මම නිර්මාණය කළ ARM එකක් .
කෙසේ වෙතත් ඔබට සම්මත පුස්තකාලය භාවිතා කිරීමට අවශ්ය නම් දේවල් වඩාත් විනෝදජනක වේ, මන්ද අප සතුව ලිනක්ස් කර්නලය නොමැති බැවින් POSIX හරහා C සම්මත පුස්තකාල ක්රියාකාරිත්වය බොහෝමයක් ක්රියාත්මක කරයි .
ලිනක්ස් වැනි පූර්ණ මෙහෙයුම් පද්ධතියකට නොයා හැකියාවන් කිහිපයක්,
නිව්ලිබ්
විස්තරාත්මක උදාහරණ: /electronics/223929/c-standard-libraries-on-bare-metal/223931
නිව්ලිබ් හි, ඔබ විසින්ම සිස්කල් ක්රියාත්මක කළ යුතු නමුත් ඔබට ඉතා අවම පද්ධතියක් ලැබෙන අතර ඒවා ක්රියාත්මක කිරීම ඉතා පහසුය.
උදාහරණයක් ලෙස, ඔබට printf
UART හෝ ARM පද්ධති වෙත හරවා යැවිය හැකිය , නැතහොත් අර්ධ හොස්ටිංexit()
සමඟ ක්රියාත්මක කළ හැකිය .
FreeRTOS සහ Zephyr වැනි කාවැද්දූ මෙහෙයුම් පද්ධති .
එවැනි මෙහෙයුම් පද්ධති සාමාන්යයෙන් ඔබට පූර්වභංග කාලසටහන අක්රිය කිරීමට ඉඩ සලසයි, එම නිසා වැඩසටහනේ ධාවන කාලය පිළිබඳ පූර්ණ පාලනය ඔබට ලබා දේ.
ඒවා කලින් ක්රියාත්මක කළ නිව්ලිබ් වර්ගයක් ලෙස දැකිය හැකිය.
ARM
ARM හි, සාමාන්ය අදහස් සමාන වේ. මම උඩුගත කර ඇත:
රාස්ප්බෙරි පයි සඳහා, https://github.com/dwelch67/raspberrypi අද පවතින වඩාත්ම ජනප්රිය නිබන්ධනය ලෙස පෙනේ.
X86 හි සමහර වෙනස්කම් වලට ඇතුළත් වන්නේ:
IO සිදු කරනු ලබන්නේ මැජික් ලිපින වලට කෙලින්ම ලිවීමෙනි, උපදෙස් in
හා out
උපදෙස් නොමැත .
මෙය මතක සිතියම්ගත කළ IO ලෙස හැඳින්වේ .
රාස්ප්බෙරි පයි වැනි සමහර සැබෑ දෘඩාංග සඳහා, ඔබට ස්ථිරාංග (BIOS) තැටි රූපයට එක් කළ හැකිය.
එය හොඳ දෙයක්, එමගින් එම ස්ථිරාංග යාවත්කාලීන කිරීම වඩාත් විනිවිද පෙනෙන බවට පත් කරයි.
ස්ථිරාංග
ඇත්ත වශයෙන්ම, ඔබේ ඇරඹුම් අංශය පද්ධතියේ CPU මත ක්රියාත්මක වන පළමු මෘදුකාංගය නොවේ.
මුලින්ම ක්රියාත්මක වන්නේ මෘදුකාංගයක් වන ඊනියා ස්ථිරාංග වේ:
- දෘඩාංග නිෂ්පාදකයින් විසින් සාදන ලදී
- සාමාන්යයෙන් සංවෘත ප්රභවයක් නමුත් බොහෝ විට සී මත පදනම් වේ
- කියවීමට-පමණක් මතකයේ ගබඩා කර ඇති අතර එම නිසා විකුණුම්කරුගේ අවසරයකින් තොරව වෙනස් කිරීමට අපහසු / කළ නොහැකි ය.
ප්රසිද්ධ ස්ථිරාංග වලට ඇතුළත් වන්නේ:
- BIOS : පැරණි සියලුම වර්තමාන x86 ස්ථිරාංග. සීබියොස් යනු QEMU විසින් භාවිතා කරන සුපුරුදු විවෘත කේත ක්රියාත්මක කිරීමකි.
- UEFI : BIOS අනුප්රාප්තිකයා, වඩා හොඳ ප්රමිතිගත, නමුත් වඩා දක්ෂ, සහ ඇදහිය නොහැකි තරම් පුපුරා ගියේය.
- Coreboot : උතුම් හරස් ආරුක්කු විවෘත මූලාශ්ර උත්සාහය
ස්ථිරාංග වැනි දේ කරයි:
ඔබ ආරම්භ කළ හැකි යමක් සොයා ගන්නා තෙක් එක් එක් දෘඩ තැටිය, USB, ජාලය ආදිය හරහා ලූප කරන්න.
අපි QEMU ධාවනය කරන විට, එය දෘඩාංගයට සම්බන්ධ දෘඩ තැටියක් -hda
බව පවසයි main.img
, සහ
hda
උත්සාහ කළ පළමු එක වන අතර එය භාවිතා වේ.
පළමු බයිට් 512 RAM මතක ලිපිනයට 0x7c00
පටවන්න, CPU හි RIP එහි දමා එය ක්රියාත්මක වීමට ඉඩ දෙන්න
ඇරඹුම් මෙනුව හෝ BIOS මුද්රණ ඇමතුම් වැනි දේ දර්ශනයේ පෙන්වන්න
ෆර්ම්වෙයාර් බොහෝ ඕඑස්-එස් රඳා පවතින ඕඑස් වැනි ක්රියාකාරීත්වයක් ලබා දෙයි. උදා: BIOS / UEFI මත ධාවනය කිරීම සඳහා පයිතන් උප කුලකයක් වරාය කර ඇත: https://www.youtube.com/watch?v=bYQ_lq5dcvM
ස්ථිරාංග OS වලින් වෙන් කොට හඳුනාගත නොහැකි බවත්, කෙනෙකුට කළ හැකි එකම “සත්ය” හිස් ලෝහ ක්රමලේඛය ස්ථිරාංග බවත් තර්ක කළ හැකිය.
මෙම CoreOS dev පවසන පරිදි :
අමාරු කොටස
ඔබ පරිගණකයක් බලගන්වන විට, චිප්සෙට් (නෝර්ත්බ්රිජ්, සවුත්බ්රිජ් සහ සුපර් අයිඕ) සෑදෙන චිප්ස් තවමත් නිසි ලෙස ආරම්භ කර නොමැත. BIOS ROM CPU වෙතින් දුරස්ථව ඉවත් කළද, මෙය CPU වෙත ප්රවේශ විය හැකිය, මන්ද එය එසේ විය යුතුය, එසේ නොමැතිනම් CPU ක්රියාත්මක කිරීමට උපදෙස් නොමැත. මෙයින් අදහස් කරන්නේ BIOS ROM සම්පූර්ණයෙන්ම සිතියම් ගත කර ඇති බවයි, සාමාන්යයෙන් නොවේ. ඇරඹුම් ක්රියාවලිය ඉදිරියට ගෙන යාමට ප්රමාණවත් තරම් සිතියම් ගත කර ඇත. වෙනත් ඕනෑම උපාංගයක්, එය අමතක කරන්න.
ඔබ QEMU යටතේ Coreboot ධාවනය කරන විට, ඔබට Coreboot හි ඉහළ ස්ථර සමඟ සහ ගෙවීම් සමඟ අත්හදා බැලිය හැකිය, නමුත් QEMU අඩු මට්ටමේ ආරම්භක කේතය සමඟ අත්හදා බැලීමට සුළු අවස්ථාවක් ලබා දෙයි. එක් දෙයක් නම්, RAM ආරම්භයේ සිටම ක්රියාත්මක වේ.
පශ්චාත් BIOS ආරම්භක තත්වය
දෘඩාංග බොහෝ දේවල් වගේ, ප්රමිතිකරණය දුර්වල වන අතර, ඔබ කළ යුතු දේවල් එක් නොවන මත රඳා ලේඛන මූලික රාජ්ය ඔබගේ කේතය පරිගණකයේ BIOS පසුපස දිව ආරම්භ වන විට ය.
එබැවින් ඔබට උදව්වක් කර පහත සඳහන් ආකාරයේ ආරම්භක කේතයක් භාවිතා කරන්න: https://stackoverflow.com/a/32509555/895245
රෙජිස්ටාර් කැමති %ds
හා %es
වැදගත් අතුරු ආබාධ ඇති කරයි, එබැවින් ඔබ ඒවා පැහැදිලිව භාවිතා නොකලත් ඒවා ශුන්ය කළ යුතුය.
සමහර ඉමුලේටර් සැබෑ දෘඩාංග වලට වඩා හොඳ බවත් ඔබට හොඳ ආරම්භක තත්වයක් ලබා දෙන බවත් සලකන්න. ඔබ සැබෑ දෘඩාංග මත ධාවනය වන විට, සියල්ල කැඩී යයි.
GNU GRUB Multiboot
ඇරඹුම් අංශ සරල ය, නමුත් ඒවා එතරම් පහසු නැත:
- ඔබට තිබිය හැක්කේ එක් තැටියකට එක් මෙහෙයුම් පද්ධතියක් පමණි
- පැටවුම් කේතය සැබවින්ම කුඩා විය යුතු අතර බයිට් 512 ට ගැලපේ. මෙය int 0x13 BIOS ඇමතුම සමඟ විසඳා ගත හැකිය .
- ආරක්ෂිත මාදිලියකට ගමන් කිරීම වැනි ආරම්භයක් ඔබ විසින්ම කළ යුතුය
GNU GRUB විසින් බහු බූට් නමින් වඩාත් පහසු ගොනු ආකෘතියක් නිර්මාණය කළේ එම හේතු නිසා ය .
අවම වැඩ කරන උදාහරණය: https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0/multiboot/hello-world
USB මිලියනය වතාවක් දහනය නොකර සැබෑ දෘඩාංග මත සියලු උදාහරණ පහසුවෙන් ධාවනය කිරීමට හැකි වන පරිදි මම එය මගේ GitHub උදාහරණ repo හි භාවිතා කරමි . QEMU හි එය මේ ආකාරයෙන් පෙනේ:
ඔබ ඔබේ මෙහෙයුම් පද්ධතිය බහු බූට් ගොනුවක් ලෙස සකස් කරන්නේ නම්, සාමාන්ය ගොනු පද්ධතියක් තුළ එය සොයා ගැනීමට GRUB ට හැකි වේ.
බොහෝ ඩිස්ට්රෝස් කරන්නේ මෙයයි /boot
.
බහු බූට් ගොනු මූලික වශයෙන් විශේෂ ශීර්ෂයක් සහිත ඊඑල්එෆ් ගොනුවකි. ඒවා GRUB විසින් මෙහි දක්වා ඇත: https://www.gnu.org/software/grub/manual/multiboot/multiboot.html
ඔබට බහු බූට් ගොනුවක් ආරම්භ කළ හැකි තැටියක් බවට පත් කළ හැකිය grub-mkrescue
.
එල් ටොරිටෝ
සංයුක්ත තැටිවලට පුළුස්සා දැමිය හැකි ආකෘතිය: https://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29
ISO හෝ USB මත ක්රියා කරන දෙමුහුන් රූපයක් නිෂ්පාදනය කිරීමට ද හැකිය. මෙය grub-mkrescue
( උදාහරණ ) සමඟ කළ හැකි අතර, ලිනක්ස් කර්නලය make isoimage
භාවිතා කිරීමෙන් ද එය සිදු කරයි isohybrid
.
සම්පත්