0x0A DC7831 රැස්වීමේ කොටසක් ලෙස
මෙම ලිපියෙන් අපි emulator තුළ උපාංග ස්ථිරාංග ධාවනය කරන්නේ කෙසේද, දෝශ නිරාකරණය සමඟ අන්තර්ක්රියා නිරූපණය කරන්නේ කෙසේද සහ ස්ථිරාංග පිළිබඳ කුඩා ගතික විශ්ලේෂණයක් සිදු කරන්නේ කෙසේද යන්න විස්තර කරමු.
මුදලටය
බොහෝ කලකට පෙර දුර ඈත මන්දාකිණියක
මීට වසර කිහිපයකට පෙර, අපගේ රසායනාගාරයේ උපාංගයක ස්ථිරාංග පරීක්ෂා කිරීමේ අවශ්යතාවයක් තිබුණි. ස්ථිරාංග සම්පීඩනය කර ඇරඹුම් කාරකයක් සමඟ ඇසුරුම් කර ඇත. ඔහු මෙය කළේ ඉතා සංකීර්ණ ආකාරයෙන්, මතකයේ ඇති දත්ත කිහිප වතාවක් මාරු කරමිනි. ස්ථිරාංගම පසුව පර්යන්ත සමඟ ක්රියාකාරීව අන්තර් ක්රියා කළේය. මේ සියල්ල MIPS හරය මත.
වෛෂයික හේතූන් මත, පවතින ඉමුලේටර් අපට නොගැලපේ, නමුත් අපට තවමත් කේතය ධාවනය කිරීමට අවශ්ය විය. ඉන්පසුව අපි අපගේම ඉමුලේටරය සෑදීමට තීරණය කළෙමු, එය අවම වශයෙන් සිදු කරන අතර ප්රධාන ස්ථිරාංග ඉවත් කිරීමට අපට ඉඩ සලසයි. අපි එය උත්සාහ කළ අතර එය සාර්ථක විය. අපි හිතුවා, අපි ප්රධාන ස්ථිරාංග ක්රියාත්මක කිරීමට පර්යන්ත එකතු කළහොත් කුමක් කළ යුතුද කියා. එය එතරම් හානියක් නොවීය - එයද සාර්ථක විය. අපි නැවතත් කල්පනා කර සම්පූර්ණ ඉමුලේටරයක් සෑදීමට තීරණය කළෙමු.
එහි ප්රතිඵලය වූයේ පරිගණක පද්ධති ඉමුලේටරයයි
ඇයි කොපිකැට්?
වචන සෙල්ලමක් තියෙනවා.
- හාස්යොත්පාදක (ඉංග්රීසි, නාම පදය [ˈkɒpɪkæt]) - අනුකරණය කරන්නා, අනුකරණය කරන්නා
- බළලා (ඉංග්රීසි, නාම පදය [ˈkæt]) - cat, cat - ව්යාපෘතියේ නිර්මාතෘවරයෙකුගේ ප්රියතම සත්වයා
- "K" අක්ෂරය Kotlin ක්රමලේඛන භාෂාවෙන්
පිටපත් කිරීම
ඉමුලේටරය නිර්මාණය කිරීමේදී, ඉතා නිශ්චිත ඉලක්ක තබා ඇත:
- නව පර්යන්ත, මොඩියුල, ප්රොසෙසර් කෝර් ඉක්මනින් නිර්මාණය කිරීමේ හැකියාව;
- විවිධ මොඩියුල වලින් අථත්ය උපාංගයක් එකලස් කිරීමේ හැකියාව;
- අථත්ය උපාංගයක මතකයට ඕනෑම ද්විමය දත්ත (ස්ථිරාංග) පැටවීමේ හැකියාව;
- ස්නැප්ෂොට් සමඟ වැඩ කිරීමේ හැකියාව (පද්ධති තත්වයේ ස්නැප්ෂොට්);
- සාදන ලද නිදොස්කරණය හරහා ඉමුලේටරය සමඟ අන්තර් ක්රියා කිරීමේ හැකියාව;
- සංවර්ධනය සඳහා ලස්සන නවීන භාෂාවක්.
එහි ප්රතිඵලයක් ලෙස, ක්රියාත්මක කිරීම සඳහා Kotlin තෝරා ගන්නා ලදී, බස් ගෘහ නිර්මාණ ශිල්පය (මෙය මොඩියුල අථත්ය දත්ත බස්රථ හරහා එකිනෙකා සමඟ සන්නිවේදනය කරන විට), උපාංග විස්තර ආකෘතිය ලෙස JSON සහ දෝශ නිරාකරණ සමඟ අන්තර්ක්රියා කිරීමේ ප්රොටෝකෝලය ලෙස GDB RSP.
සංවර්ධනය වසර දෙකකට මඳක් වැඩි කාලයක් තිස්සේ සිදුවෙමින් පවතින අතර සක්රීයව සිදුවෙමින් පවතී. මෙම කාලය තුළ, MIPS, x86, V850ES, ARM, සහ PowerPC ප්රොසෙසර් කෝර් ක්රියාත්මක කරන ලදී.
ව්යාපෘතිය වර්ධනය වෙමින් පවතින අතර එය පුළුල් මහජනතාවට ඉදිරිපත් කිරීමට කාලයයි. අපි පසුව ව්යාපෘතිය පිළිබඳ සවිස්තරාත්මක විස්තරයක් කරන්නෙමු, නමුත් දැනට අපි Kopycat භාවිතා කිරීම කෙරෙහි අවධානය යොමු කරමු.
වඩාත්ම නොඉවසිලිමත් අය සඳහා, ඉමුලේටරයේ ප්රවර්ධන අනුවාදයක් බාගත කළ හැකිය
ඉමුලේටරයේ රයිනෝ
මීට පෙර SMARTRHINO-2018 සමුළුව සඳහා ප්රතිලෝම ඉංජිනේරු කුසලතා ඉගැන්වීම සඳහා "රයිනෝසිරස්" පරීක්ෂණ උපකරණයක් නිර්මාණය කරන ලද බව අපි සිහිපත් කරමු. ස්ථිතික ස්ථිරාංග විශ්ලේෂණය කිරීමේ ක්රියාවලිය විස්තර කර ඇත
දැන් අපි "ස්පීකර්" එකතු කිරීමට උත්සාහ කරමු සහ ඉමුලේටරයේ ස්ථිරාංග ක්රියාත්මක කරන්න.
අපට අවශ්ය වනු ඇත:
1) ජාවා 1.8
2) පයිතන් සහ මොඩියුලය
වින්ඩෝස් සඳහා:
1)
2)
Linux සඳහා:
1) socat
ඔබට GDB සේවාලාභියෙකු ලෙස Eclipse, IDA Pro හෝ radare2 භාවිතා කළ හැක.
එය ක්රියාත්මක වන්නේ කෙසේද?
ඉමුලේටරය තුළ ස්ථිරාංග සිදු කිරීම සඳහා, සැබෑ උපාංගයක ප්රතිසමයක් වන අථත්ය උපාංගයක් "එකලස්" කිරීම අවශ්ය වේ.
සැබෑ උපාංගය ("රයිනෝ") බ්ලොක් රූප සටහනේ පෙන්විය හැක:
ඉමුලේටරයට මොඩියුලර් ව්යුහයක් ඇති අතර අවසාන අථත්ය උපාංගය JSON ගොනුවක විස්තර කළ හැක.
JSON 105 රේඛා
{
"top": true,
// Plugin name should be the same as file name (or full path from library start)
"plugin": "rhino",
// Directory where plugin places
"library": "user",
// Plugin parameters (constructor parameters if jar-plugin version)
"params": [
{ "name": "tty_dbg", "type": "String"},
{ "name": "tty_bt", "type": "String"},
{ "name": "firmware", "type": "String", "default": "NUL"}
],
// Plugin outer ports
"ports": [ ],
// Plugin internal buses
"buses": [
{ "name": "mem", "size": "BUS30" },
{ "name": "nand", "size": "4" },
{ "name": "gpio", "size": "BUS32" }
],
// Plugin internal components
"modules": [
{
"name": "u1_stm32",
"plugin": "STM32F042",
"library": "mcu",
"params": {
"firmware:String": "params.firmware"
}
},
{
"name": "usart_debug",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_dbg"
}
},
{
"name": "term_bt",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_bt"
}
},
{
"name": "bluetooth",
"plugin": "BT",
"library": "mcu"
},
{ "name": "led_0", "plugin": "LED", "library": "mcu" },
{ "name": "led_1", "plugin": "LED", "library": "mcu" },
{ "name": "led_2", "plugin": "LED", "library": "mcu" },
{ "name": "led_3", "plugin": "LED", "library": "mcu" },
{ "name": "led_4", "plugin": "LED", "library": "mcu" },
{ "name": "led_5", "plugin": "LED", "library": "mcu" },
{ "name": "led_6", "plugin": "LED", "library": "mcu" },
{ "name": "led_7", "plugin": "LED", "library": "mcu" },
{ "name": "led_8", "plugin": "LED", "library": "mcu" },
{ "name": "led_9", "plugin": "LED", "library": "mcu" },
{ "name": "led_10", "plugin": "LED", "library": "mcu" },
{ "name": "led_11", "plugin": "LED", "library": "mcu" },
{ "name": "led_12", "plugin": "LED", "library": "mcu" },
{ "name": "led_13", "plugin": "LED", "library": "mcu" },
{ "name": "led_14", "plugin": "LED", "library": "mcu" },
{ "name": "led_15", "plugin": "LED", "library": "mcu" }
],
// Plugin connection between components
"connections": [
[ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"],
[ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"],
[ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"],
[ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"],
[ "bluetooth.ports.bt_s", "term_bt.ports.term_m"],
[ "bluetooth.ports.bt_m", "term_bt.ports.term_s"],
[ "led_0.ports.pin", "u1_stm32.buses.pin_output_a", "0x00"],
[ "led_1.ports.pin", "u1_stm32.buses.pin_output_a", "0x01"],
[ "led_2.ports.pin", "u1_stm32.buses.pin_output_a", "0x02"],
[ "led_3.ports.pin", "u1_stm32.buses.pin_output_a", "0x03"],
[ "led_4.ports.pin", "u1_stm32.buses.pin_output_a", "0x04"],
[ "led_5.ports.pin", "u1_stm32.buses.pin_output_a", "0x05"],
[ "led_6.ports.pin", "u1_stm32.buses.pin_output_a", "0x06"],
[ "led_7.ports.pin", "u1_stm32.buses.pin_output_a", "0x07"],
[ "led_8.ports.pin", "u1_stm32.buses.pin_output_a", "0x08"],
[ "led_9.ports.pin", "u1_stm32.buses.pin_output_a", "0x09"],
[ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"],
[ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"],
[ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"],
[ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"],
[ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"],
[ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"]
]
}
පරාමිතිය කෙරෙහි අවධානය යොමු කරන්න ස්ථිරාංගය කොටස පරාමිති ෆර්ම්වෙයාර් ලෙස අතථ්ය උපාංගයකට පූරණය කළ හැකි ගොනුවක නම වේ.
අතථ්ය උපාංගය සහ ප්රධාන මෙහෙයුම් පද්ධතිය සමඟ එහි අන්තර්ක්රියා පහත රූප සටහන මගින් නිරූපණය කළ හැක:
ඉමුලේටරයේ වත්මන් පරීක්ෂණ අවස්ථාවට ප්රධාන OS හි COM වරායන් සමඟ අන්තර්ක්රියා ඇතුළත් වේ (බ්ලූටූත් මොඩියුලය සඳහා UART සහ UART නිදොස් කිරීම). මේවා උපාංග සම්බන්ධ කර ඇති සැබෑ වරායන් හෝ අතථ්ය COM වරායන් විය හැකිය (මේ සඳහා ඔබට අවශ්ය වේ com0com/socat).
පිටත සිට ඉමුලේටරය සමඟ අන්තර් ක්රියා කිරීමට දැනට ප්රධාන ක්රම දෙකක් තිබේ:
- GDB RSP ප්රොටෝකෝලය (ඒ අනුව, මෙම ප්රොටෝකෝලය සඳහා සහය දක්වන මෙවලම් Eclipse / IDA / radare2 වේ);
- අභ්යන්තර ඉමුලේටර් විධාන රේඛාව (Argparse හෝ Python).
අතථ්ය COM වරායන්
පර්යන්තයක් හරහා දේශීය යන්ත්රයේ අතථ්ය උපාංගයක UART සමඟ අන්තර් ක්රියා කිරීම සඳහා, ඔබ සම්බන්ධිත අථත්ය COM වරායන් යුගලයක් සෑදිය යුතුය. අපගේ නඩුවේදී, එක් වරායක් ඉමුලේටරය විසින් භාවිතා කරනු ලබන අතර, දෙවැන්න පර්යන්ත වැඩසටහනක් (PuTTY හෝ තිරය):
com0com භාවිතා කරමින්
අතථ්ය COM වරායන් වින්යාස කර ඇත්තේ com0com කට්ටලයේ සිට පිහිටුවීමේ උපයෝගීතාව භාවිතා කරමිනි (කොන්සෝල අනුවාදය - C: වැඩසටහන් ගොනු (x86)com0comsetupс.exe, හෝ GUI අනුවාදය - C:Program Files (x86)com0comsetupg.exe):
පෙට්ටි පරීක්ෂා කරන්න බෆරය ඉක්මවා යාම සබල කරන්න සාදන ලද සියලුම අථත්ය වරායන් සඳහා, එසේ නොමැතිනම් ඉමුලේටරය COM වරායෙන් ප්රතිචාරයක් එනතෙක් බලා සිටිනු ඇත.
Socat භාවිතා කිරීම
UNIX පද්ධතිවල, socat උපයෝගීතාව භාවිතයෙන් ඉමුලේටරය විසින් අතථ්ය COM වරායන් ස්වයංක්රීයව නිර්මාණය වේ; මෙය සිදු කිරීම සඳහා, ඉමුලේටරය ආරම්භ කිරීමේදී වරාය නාමයේ උපසර්ගය සඳහන් කරන්න. socat:
.
අභ්යන්තර විධාන රේඛා අතුරුමුහුණත (Argparse හෝ Python)
Kopycat යනු කොන්සෝල යෙදුමක් බැවින්, emulator එහි වස්තු සහ විචල්යයන් සමඟ අන්තර්ක්රියා කිරීම සඳහා විධාන රේඛා අතුරුමුහුණත් විකල්ප දෙකක් සපයයි: Argparse සහ Python.
Argparse යනු Kopycat තුළ ගොඩනගා ඇති CLI එකක් වන අතර සෑම විටම සෑම කෙනෙකුටම ලබා ගත හැකිය.
විකල්ප CLI යනු පයිතන් පරිවර්තකයයි. එය භාවිතා කිරීම සඳහා, ඔබ Jep Python මොඩියුලය ස්ථාපනය කර Python සමඟ වැඩ කිරීමට ඉමුලේටරය වින්යාසගත කළ යුතුය (පරිශීලකයාගේ ප්රධාන පද්ධතියේ ස්ථාපනය කර ඇති Python පරිවර්තකය භාවිතා කරනු ඇත).
Python මොඩියුලය Jep ස්ථාපනය කිරීම
Linux Jep යටතේ Pip හරහා ස්ථාපනය කල හැක:
pip install jep
Windows මත Jep ස්ථාපනය කිරීමට, ඔබ මුලින්ම Windows SDK සහ ඊට අනුරූප Microsoft Visual Studio ස්ථාපනය කළ යුතුය. අපි ඔබට සහ එය ටිකක් පහසු කර ඇත
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Jep ස්ථාපනය පරීක්ෂා කිරීම සඳහා, ඔබ විධාන රේඛාව මත ධාවනය කළ යුතුය:
python -c "import jep"
ප්රතිචාර වශයෙන් පහත පණිවිඩය ලැබිය යුතුය.
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
ඔබේ පද්ධතිය සඳහා ඉමුලේටර් කාණ්ඩ ගොනුවේ (copycat.bat - වින්ඩෝස් සඳහා, පිටපත් කිරීම - ලිනක්ස් සඳහා) පරාමිති ලැයිස්තුවට DEFAULT_JVM_OPTS
අමතර පරාමිතියක් එක් කරන්න Djava.library.path
— එහි ස්ථාපිත Jep මොඩියුලයට යන මාර්ගය අඩංගු විය යුතුය.
Windows සඳහා ප්රතිඵලය මෙවැනි රේඛාවක් විය යුතුය:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Kopycat දියත් කිරීම
ඉමුලේටරය යනු කොන්සෝල JVM යෙදුමකි. දියත් කිරීම මෙහෙයුම් පද්ධතියේ විධාන රේඛා ස්ක්රිප්ට් (sh/cmd) හරහා සිදු කෙරේ.
වින්ඩෝස් යටතේ ධාවනය කිරීමට විධානය:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Socat උපයෝගීතාව භාවිතයෙන් Linux යටතේ ධාවනය කිරීමට විධානය:
./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28
-g 23646
- GDB සේවාදායකයට ප්රවේශය සඳහා විවෘත වන TCP වරාය;-n rhino
- ප්රධාන පද්ධති මොඩියුලයේ නම (එකලස් කරන ලද උපාංගය);-l user
- ප්රධාන මොඩියුලය සෙවීමට පුස්තකාලයේ නම;-y library
- උපාංගයේ ඇතුළත් කර ඇති මොඩියුල සෙවීමට මාර්ගය;firmwarerhino_pass.bin
- ස්ථිරාංග ගොනුව වෙත මාර්ගය;- COM26 සහ COM28 යනු අතථ්ය COM ports වේ.
එහි ප්රතිඵලයක් වශයෙන්, විමසුමක් දර්ශණය වනු ඇත Python >
(හෝ Argparse >
):
18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top
18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top
18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top
18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top...
18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it...
18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell!
18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true)
Python >
IDA Pro සමඟ අන්තර්ක්රියා
පරීක්ෂණ සරල කිරීම සඳහා, අපි ආකෘතියේ IDA හි විශ්ලේෂණය සඳහා මූලාශ්ර ගොනුව ලෙස Rhino ස්ථිරාංග භාවිතා කරමු.
ඔබට මෙටා තොරතුරු නොමැතිව ප්රධාන ස්ථිරාංග භාවිතා කළ හැකිය.
IDA Pro හි Kopycat දියත් කිරීමෙන් පසු, Debugger මෙනුවේ අයිතමයට යන්න "නිදොස්කරණය මාරු කරන්න..."සහ තෝරන්න"දුරස්ථ GDB නිදොස්කරණය". ඊළඟට, සම්බන්ධතාවය සකසන්න: මෙනුව නිදොස්කරණය - ක්රියාවලි විකල්ප...
අගයන් සකසන්න:
- යෙදුම - ඕනෑම අගයක්
- සත්කාරක නාමය: 127.0.0.1 (හෝ Kopycat ධාවනය වන දුරස්ථ යන්ත්රයේ IP ලිපිනය)
- වරාය: 23946
දැන් නිදොස් කිරීමේ බොත්තම ලබා ගත හැකිය (F9 යතුර):
ඉමුලේටරයේ දෝශ නිරාකරණ මොඩියුලයට සම්බන්ධ වීමට එය ක්ලික් කරන්න. IDA නිදොස් කිරීමේ මාදිලියට යයි, අමතර කවුළු ලබා ගත හැකිය: රෙජිස්ටර් පිළිබඳ තොරතුරු, තොගය පිළිබඳ තොරතුරු.
දැන් අපට නිදොස්කරණයේ සියලුම සම්මත විශේෂාංග භාවිතා කළ හැකිය:
- උපදෙස් පියවරෙන් පියවර ක්රියාත්මක කිරීම (ඇතුල් වෙන්න и පියවරෙන් පියවර - යතුරු F7 සහ F8, පිළිවෙලින්);
- ක්රියාත්මක කිරීම ආරම්භ කිරීම සහ විරාම කිරීම;
- කේත සහ දත්ත යන දෙකටම බිඳුම් ලක්ෂ්ය නිර්මාණය කිරීම (F2 යතුර).
නිදොස්කරණයකට සම්බන්ධ වීම යනු ස්ථිරාංග කේතය ධාවනය කිරීම නොවේ. වත්මන් ක්රියාත්මක කිරීමේ ස්ථානය ලිපිනය විය යුතුය 0x08006A74
- කාර්යයේ ආරම්භය Reset_Handler. ඔබ ලැයිස්තුගත කිරීම පහළට අනුචලනය කළහොත්, ඔබට කාර්යය ඇමතුම දැකිය හැක ප්රධාන. ඔබට මෙම රේඛාව මත කර්සරය තැබිය හැකිය (ලිපිනය 0x08006ABE
) සහ මෙහෙයුම සිදු කරන්න කර්සරය දක්වා ධාවනය කරන්න (යතුර F4).
මීලඟට, ඔබට F7 එබීමෙන් කාර්යයට ඇතුල් විය හැක ප්රධාන.
ඔබ විධානය ක්රියාත්මක කරන්නේ නම් ක්රියාවලිය දිගටම කරගෙන යන්න (F9 යතුර), එවිට "කරුණාකර රැඳී සිටින්න" කවුළුව තනි බොත්තමකින් දිස්වනු ඇත අත්හිටුවන්න:
ඔබ එබූ විට අත්හිටුවන්න ස්ථිරාංග කේතය ක්රියාත්මක කිරීම අත්හිටුවා ඇති අතර එය බාධා කළ කේතයේ එකම ලිපිනයෙන් දිගටම කරගෙන යා හැක.
ඔබ කේතය දිගටම ක්රියාත්මක කරන්නේ නම්, අතථ්ය COM වරායට සම්බන්ධ පර්යන්තවල පහත රේඛා ඔබට පෙනෙනු ඇත:
"රාජ්ය බයිපාස්" රේඛාවේ පැවැත්ම පෙන්නුම් කරන්නේ අථත්ය බ්ලූටූත් මොඩියුලය පරිශීලකයාගේ COM වරායෙන් දත්ත ලබා ගැනීමේ ක්රමයට මාරු වී ඇති බවයි.
දැන් බ්ලූටූත් පර්යන්තයේ (පින්තූරයේ COM29) ඔබට Rhino ප්රොටෝකෝලය අනුව විධාන ඇතුළත් කළ හැකිය. උදාහරණයක් ලෙස, "MEOW" විධානය "mur-mur" තන්තුව බ්ලූටූත් පර්යන්තයට ආපසු ලබා දෙනු ඇත:
මාව සම්පූර්ණයෙන්ම අනුකරණය කරන්න
ඉමුලේටරයක් තැනීමේදී, ඔබට යම් උපාංගයක විස්තර / අනුකරණයේ මට්ටම තෝරාගත හැක. උදාහරණයක් ලෙස, බ්ලූටූත් මොඩියුලය විවිධ ආකාරවලින් අනුකරණය කළ හැකිය:
- සම්පූර්ණ විධාන කට්ටලයක් සමඟ උපාංගය සම්පූර්ණයෙන්ම අනුකරණය කර ඇත;
- AT විධාන අනුකරණය කර ඇති අතර, ප්රධාන පද්ධතියේ COM වරායෙන් දත්ත ප්රවාහය ලැබේ;
- අතථ්ය උපාංගය සැබෑ උපාංගය වෙත සම්පූර්ණ දත්ත හරවා යැවීමක් සපයයි;
- සෑම විටම "OK" ලබා දෙන සරල අංකුරයක් ලෙස.
ඉමුලේටරයේ වත්මන් අනුවාදය දෙවන ප්රවේශය භාවිතා කරයි - අතථ්ය බ්ලූටූත් මොඩියුලය වින්යාසය සිදු කරයි, ඉන්පසු එය ප්රධාන පද්ධතියේ COM වරායේ සිට ඉමුලේටරයේ UART වරායට දත්ත “ප්රොක්සි කිරීමේ” මාදිලියට මාරු වේ.
පරිධියේ යම් කොටසක් ක්රියාත්මක නොකළහොත් කේතයේ සරල උපකරණ සැකසීමේ හැකියාව සලකා බලමු. උදාහරණයක් ලෙස, DMA වෙත දත්ත හුවමාරුව පාලනය කිරීම සඳහා වගකිව යුතු ටයිමරයක් නිර්මාණය කර නොමැති නම් (පරීක්ෂා කිරීම ශ්රිතයේ සිදු කෙරේ. ws2812b_waitහි පිහිටා ඇත 0x08006840
), එවිට ස්ථිරාංග සෑම විටම ධජය නැවත සැකසීමට බලා සිටිනු ඇත කාර්යබහුලයිහි පිහිටා ඇත 0x200004C4
DMA දත්ත රේඛාවේ පදිංචිය පෙන්නුම් කරයි:
ධජය අතින් නැවත සැකසීමෙන් අපට මෙම තත්වය මඟ හැරිය හැක කාර්යබහුලයි එය ස්ථාපනය කිරීමෙන් පසු වහාම. IDA Pro වලදී, ඔබට Python ශ්රිතයක් සාදා එය බිඳවැටීමකදී ඇමතීමට හැකි අතර, ධජයේ අගය 1 ලිවීමෙන් පසු බ්රේක්පොයින්ට් එකම කේතයට දමන්න. කාර්යබහුලයි.
බ්රේක්පොයින්ට් හසුරුවන්නා
පළමුව, IDA හි Python ශ්රිතයක් නිර්මාණය කරමු. මෙනු ගොනුව - ස්ක්රිප්ට් විධානය...
වම් පස ඇති ලැයිස්තුවේ නව ස්නිපටයක් එක් කරන්න, එයට නමක් දෙන්න (උදාහරණයක් ලෙස, බීපීටී),
දකුණු පස ඇති පෙළ ක්ෂේත්රයේ, ක්රියාකාරී කේතය ඇතුලත් කරන්න:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
ඊට පස්සේ අපි ඔබන්න දුවන්න සහ ස්ක්රිප්ට් කවුළුව වසන්න.
දැන් අපි කේතය වෙත යමු 0x0800688A
, කඩඉමක් (F2 යතුර) සකසන්න, එය සංස්කරණය කරන්න (සන්දර්භය මෙනුව බිඳුම් ලක්ෂ්යය සංස්කරණය කරන්න...), ස්ක්රිප්ට් වර්ගය Python ලෙස සැකසීමට අමතක නොකරන්න:
වත්මන් කොඩි අගය නම් කාර්යබහුලයි 1 ට සමාන වේ, එවිට ඔබ ශ්රිතය ක්රියාත්මක කළ යුතුය skip_dma ස්ක්රිප්ට් පේළියේ:
ඔබ ක්රියාත්මක කිරීම සඳහා ස්ථිරාංග ධාවනය කරන්නේ නම්, බ්රේක්පොයින්ට් හැන්ඩ්ලර් කේතය ප්රේරණය කිරීම IDA කවුළුවෙහි දැකිය හැක. ප්රතිදාන රේඛාව මගින් Skipping wait ws2812...
. දැන් ස්ථිරාංග ධජය යළි පිහිටුවීම සඳහා බලා නොසිටිනු ඇත කාර්යබහුලයි.
ඉමුලේටරය සමඟ අන්තර් ක්රියා කිරීම
අනුකරණය සඳහා අනුකරණය කිරීම සතුටක් හා ප්රීතියක් ඇති කළ නොහැක. ඉමුලේටරය පර්යේෂකයාට මතකයේ ඇති දත්ත බැලීමට හෝ නූල්වල අන්තර්ක්රියා ස්ථාපිත කිරීමට උපකාර කරයි නම් එය වඩාත් සිත්ගන්නා සුළුය.
RTOS කාර්යයන් අතර අන්තර්ක්රියා ගතිකව ස්ථාපනය කරන්නේ කෙසේදැයි අපි ඔබට පෙන්වන්නෙමු. කේතය ක්රියාත්මක වන්නේ නම් ඔබ ප්රථමයෙන් එය ක්රියාත්මක කිරීම විරාම කළ යුතුය. Function එකට ගියොත් bluetooth_task_entry "LED" විධානයේ සැකසුම් ශාඛාව වෙත (ලිපිනය 0x080057B8
), එවිට ඔබට මුලින්ම සාදා ඇති දේ දැක ගත හැකි අතර පසුව පද්ධති පෝලිමට යවනු ලැබේ ledControlQueueHandle යම් පණිවිඩයක්.
විචල්යයට ප්රවේශ වීමට ඔබ කඩඉමක් සැකසිය යුතුය ledControlQueueHandleහි පිහිටා ඇත 0x20000624
සහ කේතය දිගටම ක්රියාත්මක කරන්න:
එහි ප්රතිඵලයක් වශයෙන්, නැවතුම මුලින්ම ලිපිනයෙහි සිදුවනු ඇත 0x080057CA
කාර්යය ඇමතීමට පෙර osMailAlloc, පසුව ලිපිනයේ 0x08005806
කාර්යය ඇමතීමට පෙර osMailPut, පසුව ටික වේලාවකට පසු - ලිපිනයට 0x08005BD4
(කාර්යය ඇමතීමට පෙර osMailGet), ශ්රිතයට අයත් වේ leds_task_entry (LED-කාර්යය), එනම්, කාර්යයන් මාරු වූ අතර, දැන් LED-කාර්යය පාලනය ලැබී ඇත.
මෙම සරල ආකාරයෙන් ඔබට RTOS කාර්යයන් එකිනෙකා සමඟ අන්තර් ක්රියා කරන ආකාරය තහවුරු කළ හැක.
ඇත්ත වශයෙන්ම, යථාර්ථයේ දී, කාර්යයේ අන්තර්ක්රියා වඩාත් සංකීර්ණ විය හැකි නමුත්, ඉමුලේටරයක් භාවිතා කරමින්, මෙම අන්තර්ක්රියා නිරීක්ෂණය කිරීම අඩු වෙහෙසකාරී වේ.
Radare2 සමඟ දියත් කරන්න
Radare2 වැනි විශ්වීය මෙවලමක් ඔබට නොසලකා හැරිය නොහැක.
r2 භාවිතයෙන් ඉමුලේටරය වෙත සම්බන්ධ වීමට, විධානය මේ ආකාරයෙන් පෙනෙනු ඇත:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
දියත් කිරීම දැන් තිබේ (dc
) සහ විරාම ක්රියාත්මක කිරීම (Ctrl+C).
අවාසනාවකට මෙන්, මේ මොහොතේ, දෘඪාංග gdb සේවාදායකය සහ මතක පිරිසැලසුම සමඟ වැඩ කිරීමේදී r2 හට ගැටළු ඇත; මේ නිසා, බිඳීම් සහ පියවර ක්රියා නොකරයි (විධානය ds
) මෙය ඉක්මනින් නිවැරදි වනු ඇතැයි අපි බලාපොරොත්තු වෙමු.
Eclipse සමඟ ධාවනය
ඉමුලේටරය භාවිතා කිරීම සඳහා වන එක් විකල්පයක් වන්නේ සංවර්ධනය වෙමින් පවතින උපාංගයේ ස්ථිරාංග නිදොස් කිරීමයි. පැහැදිලිකම සඳහා, අපි Rhino ස්ථිරාංග ද භාවිතා කරන්නෙමු. ඔබට ස්ථිරාංග මූලාශ්ර බාගත කළ හැකිය
අපි සෙට් එකෙන් Eclipse එක IDE එකක් විදියට පාවිච්චි කරනවා
Eclipse හි සෘජුවම සම්පාදනය කරන ලද ස්ථිරාංග පූරණය කිරීමට ඉමුලේටරය සඳහා, ඔබ පරාමිතිය එක් කළ යුතුය firmware=null
ඉමුලේටර් දියත් කිරීමේ විධානයට:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
නිදොස් කිරීමේ වින්යාසය සැකසීම
Eclipse හි, මෙනුව තෝරන්න ධාවනය - නිදොස් වින්යාස කිරීම්... විවෘත වන කවුළුවෙහි, කොටසෙහි GDB දෘඪාංග නිදොස්කරණය ඔබට නව වින්යාසයක් එක් කිරීමට අවශ්ය වේ, පසුව "ප්රධාන" ටැබය මත වත්මන් ව්යාපෘතිය සහ නිදොස්කරණය සඳහා යෙදුම සඳහන් කරන්න:
"Debugger" ටැබය මත ඔබ GDB විධානය සඳහන් කළ යුතුය:
${openstm32_compiler_path}arm-none-eabi-gdb
තවද GDB සේවාදායකය (සත්කාරක සහ වරාය) වෙත සම්බන්ධ කිරීම සඳහා පරාමිතීන් ඇතුළත් කරන්න:
"ආරම්භක" ටැබය මත, ඔබ පහත පරාමිතීන් සඳහන් කළ යුතුය:
- සලකුණු කොටුව සක්රිය කරන්න රූපය පූරණය කරන්න (එසේ නම් එකලස් කරන ලද ස්ථිරාංග රූපය ඉමුලේටරය තුළට පටවනු ලැබේ);
- සලකුණු කොටුව සක්රිය කරන්න සංකේත පැටවීම;
- දියත් කිරීමේ විධානය එක් කරන්න:
set $pc = *0x08000004
(පරිගණක ලේඛනය ලිපිනයේ මතකයේ ඇති අගයට සකසන්න0x08000004
- ලිපිනය එහි ගබඩා කර ඇත ResetHandler).
අවධානය යොමු කරන්න, ඔබට Eclipse වෙතින් ස්ථිරාංග ගොනුව බාගත කිරීමට අවශ්ය නැතිනම්, විකල්ප රූපය පූරණය කරන්න и විධාන ක්රියාත්මක කරන්න සඳහන් කිරීමට අවශ්ය නැත.
නිදොස්කරණය ක්ලික් කිරීමෙන් පසු, ඔබට දෝශ නිරාකරණ ආකාරයෙන් වැඩ කළ හැක:
- පියවරෙන් පියවර කේතය ක්රියාත්මක කිරීම
- බිඳුම් ලක්ෂ්ය සමඟ අන්තර් ක්රියා කිරීම
අදහස් දැක්වීම්. සූර්යග්රහණයට, හ්ම්ම්... යම් යම් විචිකිච්ඡා ඇති... ඔබ ඒවා සමඟ ජීවත් විය යුතුය. උදාහරණයක් ලෙස, නිදොස්කරණය ආරම්භ කරන විට “0x0″ සඳහා මූලාශ්රයක් නොමැත” යන පණිවිඩය දිස්වන්නේ නම්, පියවර විධානය (F5) ක්රියාත්මක කරන්න.
ඒ වෙනුවට අවසාන කාල පරිච්ඡේදය
ස්වදේශීය කේතය අනුකරණය කිරීම ඉතා සිත්ගන්නා කරුණකි. උපාංග සංවර්ධකයෙකුට සැබෑ උපාංගයක් නොමැතිව ස්ථිරාංග නිදොස් කිරීමට හැකි වේ. පර්යේෂකයෙකු සඳහා, එය ගතික කේත විශ්ලේෂණයක් කිරීමට අවස්ථාවක් වන අතර එය උපාංගයක් සමඟ පවා සැමවිටම කළ නොහැක.
අපට පහසු, මධ්යස්ථ සරල සහ සැකසීමට සහ ක්රියාත්මක කිරීමට විශාල උත්සාහයක් සහ කාලයක් ගත නොවන මෙවලමක් සමඟ විශේෂඥයින්ට ලබා දීමට අවශ්යය.
දෘඪාංග ඉමුලේටර් භාවිතයෙන් ඔබේ අත්දැකීම් ගැන අදහස් ලියන්න. සාකච්ඡා කිරීමට අපි ඔබට ආරාධනා කරන අතර ප්රශ්නවලට පිළිතුරු දීමට සතුටු වනු ඇත.
සමීක්ෂණයට සහභාගී විය හැක්කේ ලියාපදිංචි පරිශීලකයින්ට පමණි.
ඔබ emulator භාවිතා කරන්නේ කුමක් සඳහාද?
-
මම ස්ථිරාංග (නිදොස්කරණය) සංවර්ධනය කරමි
-
මම ස්ථිරාංග ගැන පර්යේෂණ කරමින් සිටිමි
-
මම ක්රීඩා දියත් කරමි (Dendi, Sega, PSP)
-
වෙනත් දෙයක් (අදහස් වල ලියන්න)
පරිශීලකයින් 7 දෙනෙක් ඡන්දය දුන්හ. පරිශීලකයින් 2 දෙනෙක් ඡන්දය දීමෙන් වැළකී සිටියහ.
ස්වදේශීය කේතය අනුකරණය කිරීමට ඔබ භාවිතා කරන මෘදුකාංගය කුමක්ද?
-
QEMU
-
යුනිකෝන් එන්ජිම
-
Proteus
-
වෙනත් දෙයක් (අදහස් වල ලියන්න)
පරිශීලකයින් 6 දෙනෙක් ඡන්දය දුන්හ. පරිශීලකයින් 2 දෙනෙක් ඡන්දය දීමෙන් වැළකී සිටියහ.
ඔබ භාවිතා කරන ඉමුලේටරය වැඩිදියුණු කිරීමට ඔබ කැමති කුමක්ද?
-
මට වේගය අවශ්යයි
-
මට පිහිටුවීමේ/දියත් කිරීමේ පහසුව අවශ්යයි
-
මට ඉමුලේටරය (API, කොකු) සමඟ අන්තර් ක්රියා කිරීම සඳහා තවත් විකල්ප අවශ්යයි
-
මම හැමදේකින්ම සතුටු වෙනවා
-
වෙනත් දෙයක් (අදහස් වල ලියන්න)
පරිශීලකයින් 8 දෙනෙක් ඡන්දය දුන්හ. 1 පරිශීලකයෙක් වැළකී සිටියේය.
මූලාශ්රය: www.habr.com