Görüşün bir hissəsi olaraq 0x0A DC7831
Bu yazıda biz cihazın proshivka proqramını emulyatorda necə işə salacağımızı, sazlayıcı ilə qarşılıqlı əlaqəni nümayiş etdirəcəyik və mikroproqramın kiçik dinamik təhlilini aparacağıq.
Prehistorya
Uzun müddət əvvəl uzaq bir qalaktikada
Bir neçə il əvvəl laboratoriyamızda bir cihazın proqram təminatının araşdırılmasına ehtiyac var idi. Firmware sıxılmış və yükləyici ilə açılmışdır. O, bunu çox mürəkkəb bir şəkildə etdi, yaddaşdakı məlumatları bir neçə dəfə dəyişdirdi. Firmware özü daha sonra periferiya ilə aktiv şəkildə qarşılıqlı əlaqədə oldu. Və bütün bunlar MIPS nüvəsində.
Obyektiv səbəblərə görə mövcud emulyatorlar bizə uyğun gəlmədi, lakin biz yenə də kodu işə salmaq istədik. Sonra öz emulyatorumuzu yaratmağa qərar verdik, bu, minimumu yerinə yetirəcək və əsas proqram təminatını açmağa imkan verəcəkdir. Biz bunu sınadıq və nəticə verdi. Fikirləşdik ki, əsas proqram təminatını da yerinə yetirmək üçün periferik qurğular əlavə etsək nə olacaq? Çox zərər vermədi - və o da işlədi. Yenidən düşündük və tam hüquqlu bir emulyator hazırlamaq qərarına gəldik.
Nəticə kompüter sistemlərinin emulyatoru oldu
Niyə Kopycat?
Söz oyunu var.
- kopik (İngilis, isim [ˈkɒpɪkæt]) - təqlid edən, təqlid edən
- pişik (İngilis, isim [ˈkæt]) - pişik, pişik - layihənin yaradıcılarından birinin sevimli heyvanı
- “K” hərfi Kotlin proqramlaşdırma dilindəndir
surətçi
Emulator yaratarkən çox xüsusi məqsədlər qoyuldu:
- tez yeni periferik qurğular, modullar, prosessor nüvələri yaratmaq imkanı;
- müxtəlif modullardan virtual cihazı yığmaq imkanı;
- virtual cihazın yaddaşına hər hansı ikili məlumatı (firmware) yükləmək imkanı;
- snapshots ilə işləmək bacarığı (sistem vəziyyətinin anlıq görüntüləri);
- quraşdırılmış sazlayıcı vasitəsilə emulyatorla qarşılıqlı əlaqə qurmaq imkanı;
- inkişaf üçün gözəl müasir dil.
Nəticədə, Kotlin həyata keçirmək üçün seçildi, avtobus arxitekturası (bu, modulların bir-biri ilə virtual məlumat avtobusları vasitəsilə əlaqə saxlamasıdır), cihazın təsviri formatı kimi JSON və sazlayıcı ilə qarşılıqlı əlaqə üçün protokol kimi GDB RSP.
İnkişaf iki ildən bir qədər artıqdır ki, davam edir və fəal şəkildə davam edir. Bu müddət ərzində MIPS, x86, V850ES, ARM və PowerPC prosessor nüvələri tətbiq olundu.
Layihə böyüyür və onu daha geniş ictimaiyyətə təqdim etməyin vaxtıdır. Layihənin ətraflı təsvirini daha sonra edəcəyik, lakin hələlik Kopycat istifadəsinə diqqət yetirəcəyik.
Ən səbirsizlər üçün emulyatorun promo versiyasını buradan yükləmək olar
Emulatorda kərgədan
Xatırladaq ki, daha əvvəl SMARTRHINO-2018 konfransı üçün tərs mühəndislik bacarıqlarının öyrədilməsi üçün “Rhinoceros” test cihazı yaradılmışdı. Statik proqram təminatının təhlili prosesi burada təsvir edilmişdir
İndi "dinamiklər" əlavə etməyə və emulyatorda proqram təminatını işə salmağa çalışaq.
Bizə lazımdır:
1) Java 1.8
2) Python və modul
Windows üçün:
1)
2)
Linux üçün:
1) socat
Siz GDB müştərisi kimi Eclipse, IDA Pro və ya radare2-dən istifadə edə bilərsiniz.
Necə işləyir?
Emulatorda proqram təminatını yerinə yetirmək üçün real cihazın analoqu olan virtual cihazı “yığmaq” lazımdır.
Həqiqi cihaz ("kərgədan") blok diaqramda göstərilə bilər:
Emulator modul quruluşa malikdir və son virtual cihaz JSON faylında təsvir edilə bilər.
JSON 105 xətləri
{
"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"]
]
}
Parametrə diqqət yetirin Firmware bölmə params virtual cihaza proqram təminatı kimi yüklənə bilən faylın adıdır.
Virtual cihaz və onun əsas əməliyyat sistemi ilə qarşılıqlı əlaqəsi aşağıdakı diaqramla göstərilə bilər:
Emulatorun hazırkı sınaq nümunəsi əsas OS-nin COM portları ilə qarşılıqlı əlaqəni əhatə edir (Bluetooth modulu üçün UART və UART debug). Bunlar cihazların qoşulduğu real portlar və ya virtual COM portları ola bilər (bunun üçün sizə sadəcə lazımdır com0com/socat).
Hal-hazırda emulyatorla xaricdən qarşılıqlı əlaqə qurmağın iki əsas yolu var:
- GDB RSP protokolu (müvafiq olaraq, bu protokolu dəstəkləyən alətlər Eclipse / IDA / radare2);
- daxili emulyator əmr xətti (Argparse və ya Python).
Virtual COM portları
Terminal vasitəsilə yerli maşındakı virtual cihazın UART ilə qarşılıqlı əlaqə yaratmaq üçün bir cüt əlaqəli virtual COM portu yaratmalısınız. Bizim vəziyyətimizdə bir port emulyator tərəfindən, ikincisi isə terminal proqramı (PuTTY və ya ekran) tərəfindən istifadə olunur:
com0com istifadə edərək
Virtual COM portları com0com dəstindəki quraşdırma yardım proqramı ilə konfiqurasiya edilir (konsol versiyası - C:Proqram Faylları (x86)com0comsetupс.exe, və ya GUI versiyası - C: Proqram Faylları (x86)com0comsetupg.exe):
Qutuları yoxlayın bufer aşmasını aktivləşdirin bütün yaradılmış virtual portlar üçün, əks halda emulyator COM portundan cavab gözləyəcək.
socat istifadə
UNIX sistemlərində virtual COM portları emulyator tərəfindən avtomatik olaraq socat yardım proqramından istifadə etməklə yaradılır; bunun üçün emulyatoru işə salarkən port adında prefiksi göstərmək kifayətdir. socat:
.
Daxili komanda xətti interfeysi (Argparse və ya Python)
Kopycat bir konsol tətbiqi olduğundan, emulator onun obyektləri və dəyişənləri ilə qarşılıqlı əlaqə üçün iki komanda xətti interfeysi variantını təqdim edir: Argparse və Python.
Argparse Kopycat-da qurulmuş bir CLI-dir və həmişə hamı üçün əlçatandır.
Alternativ CLI Python tərcüməçisidir. Onu istifadə etmək üçün Jep Python modulunu quraşdırmalı və emulyatoru Python ilə işləmək üçün konfiqurasiya etməlisiniz (istifadəçinin əsas sistemində quraşdırılmış Python tərcüməçisindən istifadə olunacaq).
Python modulunun quraşdırılması Jep
Linux altında Jep pip vasitəsilə quraşdırıla bilər:
pip install jep
Jep-i Windows-da quraşdırmaq üçün əvvəlcə Windows SDK-nı və müvafiq Microsoft Visual Studio proqramını quraşdırmalısınız. Biz sizin üçün bir az asanlaşdırdıq və
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Jep-in quraşdırılmasını yoxlamaq üçün əmr satırında işləməlisiniz:
python -c "import jep"
Cavab olaraq aşağıdakı mesaj alınmalıdır:
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
Sisteminiz üçün emulator toplu faylında (copycat.bat - Windows üçün, surətçi - Linux üçün) parametrlər siyahısına DEFAULT_JVM_OPTS
əlavə parametr əlavə edin Djava.library.path
— orada quraşdırılmış Jep moduluna gedən yol olmalıdır.
Windows üçün nəticə belə bir xətt olmalıdır:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Kopycat işə salınır
Emulator konsol JVM proqramıdır. Başlatma əməliyyat sisteminin əmr xətti skripti (sh/cmd) vasitəsilə həyata keçirilir.
Windows altında işləmək üçün əmr:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Socat yardım proqramından istifadə edərək Linux altında işləmək əmri:
./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 serverinə daxil olmaq üçün açıq olacaq TCP portu;-n rhino
— əsas sistem modulunun adı (yığılmış qurğu);-l user
— əsas modulu axtarmaq üçün kitabxananın adı;-y library
— cihaza daxil olan modulları axtarmaq yolu;firmwarerhino_pass.bin
— proqram təminatı faylına gedən yol;- COM26 və COM28 virtual COM portlarıdır.
Nəticə olaraq, bir sorğu göstərilir Python >
(Və ya 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 ilə qarşılıqlı əlaqə
Testi sadələşdirmək üçün biz Rhino proqram təminatından IDA-da təhlil üçün mənbə faylı kimi istifadə edirik
Siz həmçinin meta məlumat olmadan əsas proqram təminatından istifadə edə bilərsiniz.
IDA Pro-da Kopycat-ı işə saldıqdan sonra Debugger menyusunda elementə keçin "Sazlayıcıya keçin..."Və seçin"Uzaqdan GDB sazlayıcı". Sonra, əlaqəni qurun: menyu Sazlayıcı - Proses seçimləri...
Dəyərləri təyin edin:
- Tətbiq - istənilən dəyər
- Host adı: 127.0.0.1 (və ya Kopycat-ın işlədiyi uzaq maşının IP ünvanı)
- Port: 23946
İndi sazlama düyməsi əlçatan olur (F9 düyməsi):
Emulatorda sazlama moduluna qoşulmaq üçün üzərinə klikləyin. IDA sazlama rejiminə keçir, əlavə pəncərələr əlçatan olur: registrlər, yığın haqqında məlumat.
İndi sazlayıcının bütün standart xüsusiyyətlərindən istifadə edə bilərik:
- təlimatların addım-addım icrası (İçəri girin и Üstünə addımlayın — müvafiq olaraq F7 və F8 düymələri);
- icraya başlamaq və dayandırmaq;
- həm kod, həm də verilənlər üçün kəsilmə nöqtələrinin yaradılması (F2 düyməsi).
Sazlayıcıya qoşulmaq firmware kodunu işə salmaq demək deyil. Cari icra mövqeyi ünvan olmalıdır 0x08006A74
- funksiyanın başlanğıcı Reset_Handler. Siyahını aşağı sürüşdürsəniz, funksiya çağırışını görə bilərsiniz Elanlar
. Kursoru bu sətirdə yerləşdirə bilərsiniz (ünvan 0x08006ABE
) və əməliyyatı yerinə yetirin Kursor qədər işləyin (F4 düyməsi).
Sonra, funksiyaya daxil olmaq üçün F7 düyməsini sıxa bilərsiniz Elanlar .
Əgər əmri icra etsəniz Prosesi davam etdirin (F9 düyməsi), sonra bir düymə ilə “Lütfən gözləyin” pəncərəsi görünəcək dayandırmaq:
Basdığınız zaman dayandırmaq proshivka kodunun icrası dayandırılır və onun kəsildiyi koddakı eyni ünvandan davam etdirilə bilər.
Kodu icra etməyə davam etsəniz, virtual COM portlarına qoşulmuş terminallarda aşağıdakı sətirləri görəcəksiniz:
“Dövlət bypass” xəttinin olması virtual Bluetooth modulunun istifadəçinin COM portundan məlumat qəbulu rejiminə keçdiyini göstərir.
İndi Bluetooth terminalında (şəkildə COM29) Rhino protokoluna uyğun əmrlər daxil edə bilərsiniz. Məsələn, "MEOW" əmri "mur-mur" sətirini Bluetooth terminalına qaytaracaq:
Məni tam təqlid etmə
Emulator qurarkən, müəyyən bir cihazın təfərrüat / emulyasiya səviyyəsini seçə bilərsiniz. Məsələn, Bluetooth modulu müxtəlif yollarla təqlid edilə bilər:
- cihaz tam əmrlər dəsti ilə tam təqlid edilir;
- AT əmrləri emulyasiya edilir və məlumat axını əsas sistemin COM portundan qəbul edilir;
- virtual cihaz məlumatların real cihaza tam yönləndirilməsini təmin edir;
- həmişə "OK" qaytaran sadə stub kimi.
Emulatorun cari versiyası ikinci yanaşmadan istifadə edir - virtual Bluetooth modulu konfiqurasiyanı həyata keçirir, bundan sonra o, əsas sistemin COM portundan emulyatorun UART portuna məlumatların "proxy" rejiminə keçir.
Periferiyanın hansısa hissəsi həyata keçirilmədiyi halda kodun sadə cihazlaşdırılmasının mümkünlüyünü nəzərdən keçirək. Məsələn, məlumatların DMA-ya ötürülməsinə nəzarət etmək üçün cavabdeh olan taymer yaradılmayıbsa (yoxlama funksiyada aparılır) ws2812b_waitünvanında yerləşir 0x08006840
), onda proqram təminatı həmişə bayrağın sıfırlanmasını gözləyəcək məşğulünvanında yerləşir 0x200004C4
DMA məlumat xəttinin doldurulmasını göstərir:
Bayrağı əl ilə sıfırlamaqla bu vəziyyətdən çıxa bilərik məşğul quraşdırdıqdan dərhal sonra. IDA Pro-da siz Python funksiyası yarada və onu kəsmə nöqtəsində çağıra və bayrağa 1 dəyərini yazdıqdan sonra kəsilmə nöqtəsinin özünü kodda qoya bilərsiniz. məşğul.
Breakpoint handler
Əvvəlcə IDA-da Python funksiyasını yaradaq. Menyu Fayl - Skript əmri...
Soldakı siyahıya yeni bir parça əlavə edin, ona ad verin (məsələn, BPT),
Sağdakı mətn sahəsinə funksiya kodunu daxil edin:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
Bundan sonra basırıq qaçış və skript pəncərəsini bağlayın.
İndi koda keçək 0x0800688A
, kəsmə nöqtəsi təyin edin (F2 düyməsi), onu redaktə edin (kontekst menyusu Kəsmə nöqtəsini redaktə edin...), skript növünü Python-a təyin etməyi unutmayın:
Əgər cari bayraq dəyəri məşğul 1-ə bərabərdir, onda siz funksiyanı yerinə yetirməlisiniz skip_dma skript xəttində:
Proqram təminatını icra üçün işə salırsınızsa, o zaman kəsilmə nöqtəsi idarəedici kodunun işə salınması IDA pəncərəsində görünə bilər. Buraxılış xətt üzrə Skipping wait ws2812...
. İndi proqram təminatı bayrağın sıfırlanmasını gözləməyəcək məşğul.
Emulator ilə qarşılıqlı əlaqə
Təqlid naminə təqlid, çətin ki, həzz və sevinc doğursun. Emulator tədqiqatçıya yaddaşdakı məlumatları görməyə və ya iplərin qarşılıqlı əlaqəsini qurmağa kömək edərsə, daha maraqlıdır.
RTOS tapşırıqları arasında qarşılıqlı əlaqənin dinamik şəkildə necə qurulacağını sizə göstərəcəyik. Əgər kodu işlədirsə, əvvəlcə onun icrasını dayandırmalısınız. Funksiyaya keçsəniz bluetooth_task_girişi "LED" əmrinin emal şöbəsinə (ünvan 0x080057B8
), onda siz əvvəlcə yaradılan və sonra sistem növbəsinə göndərilənləri görə bilərsiniz ledControlQueueHandle bəzi mesaj.
Dəyişənə daxil olmaq üçün kəsmə nöqtəsi təyin etməlisiniz ledControlQueueHandleünvanında yerləşir 0x20000624
və kodu icra etməyə davam edin:
Nəticədə dayanma ilk olaraq ünvanda olacaq 0x080057CA
funksiyanı çağırmadan əvvəl osMailAlloc, sonra ünvanda 0x08005806
funksiyanı çağırmadan əvvəl osMailPut, sonra bir müddət sonra - ünvana 0x08005BD4
(funksiyaya zəng etməzdən əvvəl osMailGet), funksiyasına aid olan leds_task_entry (LED-task), yəni tapşırıqlar dəyişdirildi və indi LED-tapşırıq nəzarəti aldı.
Bu sadə yolla siz RTOS tapşırıqlarının bir-biri ilə necə qarşılıqlı əlaqədə olduğunu müəyyən edə bilərsiniz.
Əlbəttə ki, reallıqda tapşırıqların qarşılıqlı əlaqəsi daha mürəkkəb ola bilər, lakin emulyatordan istifadə etməklə bu qarşılıqlı əlaqəni izləmək daha az zəhmət tələb edir.
Radare2 ilə işə salın
Radare2 kimi universal bir alətə laqeyd qala bilməzsiniz.
R2 istifadə edərək emulyatora qoşulmaq üçün əmr belə görünür:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
İndi işə salın (dc
) və icraya fasilə verin (Ctrl+C).
Təəssüf ki, hazırda r2-də hardware gdb server və yaddaş tərtibatı ilə işləyərkən problemlər var; buna görə kəsilmə nöqtələri və addımlar işləmir (komanda). ds
). Ümid edirik ki, bu, tezliklə düzələcək.
Eclipse ilə işləyir
Emulatordan istifadə variantlarından biri hazırlanmaqda olan cihazın proshivka proqramının debug edilməsidir. Aydınlıq üçün biz Rhino proqram təminatından da istifadə edəcəyik. Firmware mənbələrini yükləyə bilərsiniz
Biz IDE kimi dəstdən Eclipse-dən istifadə edəcəyik
Emulatorun birbaşa Eclipse-də tərtib edilmiş proqram təminatını yükləməsi üçün parametr əlavə etməlisiniz. firmware=null
emulyatorun işə salınması əmrinə:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
Sazlama konfiqurasiyasının qurulması
Eclipse-də menyunu seçin Çalıştır - Sazlama Konfiqurasiyaları... Açılan pəncərədə, bölmədə GDB Hardware Debugging yeni bir konfiqurasiya əlavə etməlisiniz, sonra "Əsas" sekmesinde cari layihəni və sazlama üçün tətbiqi göstərin:
"Debugger" sekmesinde GDB əmrini təyin etməlisiniz:
${openstm32_compiler_path}arm-none-eabi-gdb
Həm də GDB serverinə (host və port) qoşulmaq üçün parametrləri daxil edin:
"Başlanğıc" sekmesinde aşağıdakı parametrləri göstərməlisiniz:
- onay qutusunu aktivləşdirin Şəkli yükləyin (belə ki, yığılmış proqram təminatının görüntüsü emulyatora yüklənsin);
- onay qutusunu aktivləşdirin Simvolları yükləyin;
- işə salma əmri əlavə edin:
set $pc = *0x08000004
(Kompüter registrini ünvandakı yaddaşdan qiymətə təyin edin0x08000004
- ünvan orada saxlanılır ResetHandler).
Xahiş edirik, Firmware faylını Eclipse-dən yükləmək istəmirsinizsə, seçimlər Şəkli yükləyin и Əmrləri işə salın göstərməyə ehtiyac yoxdur.
Debug düyməsini kliklədikdən sonra siz sazlama rejimində işləyə bilərsiniz:
- addım-addım kodun icrası
- kəsilmə nöqtələri ilə qarşılıqlı əlaqə
Qeyd. Eclipse, hmm... bəzi qəribəliklər var... və siz onlarla yaşamaq məcburiyyətindəsiniz. Məsələn, sazlayıcını işə salarkən “0x0″ üçün mənbə yoxdur” mesajı görünürsə, Addım əmrini yerinə yetirin (F5)
Bunun əvəzinə bir nəticəyə
Doğma kodu təqlid etmək çox maraqlı bir şeydir. Bir cihaz tərtibatçısının real cihaz olmadan proqram təminatını sazlaması mümkün olur. Tədqiqatçı üçün bu, hətta bir cihazla belə həmişə mümkün olmayan dinamik kod təhlili aparmaq imkanıdır.
Biz mütəxəssisləri rahat, orta dərəcədə sadə və qurmaq və işə salmaq çox səy və vaxt tələb etməyən alətlə təmin etmək istəyirik.
Aparat emulyatorlarından istifadə təcrübəniz haqqında şərhlərdə yazın. Sizi müzakirəyə dəvət edirik və suallara cavab verməkdən məmnun olarıq.
Sorğuda yalnız qeydiyyatdan keçmiş istifadəçilər iştirak edə bilər.
Emulatordan nə üçün istifadə edirsiniz?
-
Mikroproqram hazırlayıram (debug).
-
Mən proqram təminatını araşdırıram
-
Oyunları işə salıram (Dendi, Sega, PSP)
-
başqa bir şey (şərhlərdə yazın)
7 istifadəçi səs verib. 2 istifadəçi bitərəf qalıb.
Doğma kodu təqlid etmək üçün hansı proqram təminatından istifadə edirsiniz?
-
QEMU
-
Unicorn mühərriki
-
Proteus
-
başqa bir şey (şərhlərdə yazın)
6 istifadəçi səs verib. 2 istifadəçi bitərəf qalıb.
İstifadə etdiyiniz emulyatorda nəyi təkmilləşdirmək istərdiniz?
-
Mən sürət istəyirəm
-
Quraşdırma/başlatma asanlığı istəyirəm
-
Emulator ilə qarşılıqlı əlaqə üçün daha çox seçim istəyirəm (API, qarmaqlar)
-
Mən hər şeydən razıyam
-
başqa bir şey (şərhlərdə yazın)
8 istifadəçi səs verib. 1 istifadəçi bitərəf qaldı.
Mənbə: www.habr.com