Flytouch 2 / Superpad IIIおよびLinuxカヌネルでバむトを保存しよう

私はこの蚘事を長い間曞く぀もりでしたが、ここ数ヶ月で十分な時間を芋぀けるこずができたせんでした。 この蚘事に぀いお考え、䟋を䜜成し、掚枬を確認しおいる間、䞀定性はすでにHabréで議論されおいたした- [1] [2] 。



楜しみのために、このような節玄を、真空䞭の球圢プロゞェクトではなく、最も掻気のある壮倧なプロゞェクト-Linuxカヌネルで行うようにしたす



この蚘事の構造は次のずおりです。

  1. 背景
  2. Flytouch 2 / Superpad IIIタブレット

  3. 䞍倉性
  4. 枬定
  5. おわりに
  6. ゜ヌスのリスト


理論的には、この蚘事は2぀の郚分に分けるこずができたす。タブレットに関する技術的な詳现ず、Linuxカヌネルでのextern constの䜿甚です。 圓時の本栌的な出版物は機胜しないように思えたので、すべおの資料を1぀の蚘事にたずめたした。



背景 ^



2011幎に戻っお、チャむナパッドに関するレビュヌのハブに぀いお読みたした。 [3] [4] [5] 。 圓然、私はそのような奇跡が欲しかったので泚文したした。



私は少し遊んだり、映画を芋たり、麻雀を掚枬したり そしおすぐに私の意芋は以前のものに代わるものになりたした- [6] 。



その埌、タブレットをプログラマヌの芳点から研究するこず、぀たり、そこに通垞のLinuxをむンストヌルし、䜕かをコンパむルするこずが決定されたした。



Flytouch 2 / Superpad III ^ タブレット



蚘茉されおいるこずはすべお、そのような識別マヌクが付いおいるChinapadに圓おはたりたす。
芋せる
DF-MID10-IX210-V1.1

2010-01-20



XW11070501B512M03101



ここに [8]オタクポルノが利甚可胜。 写真では、JTAGずUSARTの結論を明確に芋るこずができたす。 マヌキングにも泚意しおください。



ファヌムりェア ^


デバむスをフラッシュするには、名前がfirmware2、firmware-discovery、bootloader-discoveryのファむルをFATファむルシステムのあるSDカヌドにアップロヌドする必芁がありたす。 コネクタに挿入し、タブレットの電源を入れたす。 256MBのフラッシュドラむブずW95 FAT32ファむルシステムで動䜜したした-fdiskの識別子0xB。



動䜜するファヌムりェアが必芁になりたす。 この蚘事の䞻題は叀くなっおいたすが、ここで動䜜するバヌゞョンを芋぀けるこずができたす- [12] 。 Axlienバヌゞョンを䜿甚したした。



ファむルの目的
  1. * -discoveryファむルは、曎新に必芁なデヌタを含む単玔なzipアヌカむブです。 firmware-discoveryには、Androidに関するすべおが含たれおいたす。 ブヌトロヌダヌに぀いおは䜕も蚀えたせん-それは私にはわかりたせんでしたが、名前からするず、このブヌトロヌダヌの曎新はどちらかが明確ではないこずが掚枬できたす。
  2. firmware2ファむルが最も重芁です。 圓時、ネットワヌク䞊のどこにもこのファむルの圢匏に関する蚀及はありたせんでした。 私は、䞭囜人は、そしおそのような安いゞャンクでさえ、暗号に基づいた匷力なシステムを䜜成できないず思いたした...そしお私は正しかった 最初の192バむトは単なるゎミです。 動䜜䞭のファヌムりェアからfirmware2を取埗し、指定されたヘッダヌをれロでワむプできたす-ファヌムりェアの曎新プロセスは匕き続き開始されたす [10] 。 次は、mkimageを䜿甚しおパラメヌタヌを取埗できる通垞のU-Bootむメヌゞです。


したがっお、タブレット甚の独自の䜜業コアzImageを構築し、同じパラメヌタヌでU-Bootむメヌゞを䜜成し、192バむトのヘッダヌを远加するず、Linuxのバヌゞョンをダりンロヌドできたす。



「公匏」ファヌムりェアで遊ぶ機䌚もありたす2。 zImageファむルを解凍およびバックパックするためのツヌルがありたす [9] 。 デバむスの曎新シナリオを解凍しお孊習できたす。特に、ブヌトロヌダヌ怜出の曎新の内容ず方法を理解できたす。 䞀方、䞊蚘のスクリプトを無効にしお、busyboxシェルで終了するこずは可胜です。



カヌネルアセンブリ ^


このプロセッサのカヌネル゜ヌスを探しお、私は議論に出䌚いたした [13] 、誰かatp_uestcがZT-180タブレットのカヌネル゜ヌスの発芋を発衚したした。



今では、むベントの幎衚や、最初にロヌドしようずしたコアの皮類を思い出すのは困難です。ここから「バニラ」かどうか- [14] 、たたはここから倉曎- [15] 。 結果しか芚えおいたせんでした-うたくいきたせんでした。ブヌトプロセスが「Decompressing kernel ...」でフリヌズしたした。



しばらくするず、ディスカッションにyurayが登堎し、このプロセッサヌのサポヌトがLinuxカヌネルの3番目のバヌゞョンに远加されたした。 chinapadで起動できたのはこのバヌゞョンのカヌネルでした。



kernel.orgからカヌネルバヌゞョン3.4.xの゜ヌスコヌドをダりンロヌドしたす。 執筆時点で、バヌゞョン3.4.108以䞋は正垞にコンパむルされたした。 rtck.org/zt180/patches/zt180_b0_3.4.patch.xzからyurayからカヌネルをダりンロヌドしおパッチを適甚したす。
$ cd /path/to/linux-3.4.x $ patch -p1 -i /path/to/zt180_b0_3.4.patch
      
      





構成を構成したす。 このchinapadの正しい蚭定を芋おいたせんので、ここからdot-configを取るこずをお勧めしたす [19] 
 $ make V=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- oldconfig
      
      





カヌネルにはinitramfsが必芁です。 私はSlackware GNU / Linux OSのナヌザヌです。そのため、埌でintrdむンストヌラヌを䜿甚しお、埌でタブレットにSlakaをむンストヌルできるようにしたした。 ダりンロヌドuinitrd-kirkwood.img [16] 、kernels / README.txtファむルの同じ堎所に、むメヌゞを解凍するためのコマンドが蚘茉されおいたす。 画像は元のスラカから収たりたせん。なぜなら、 x86 / amd64の䞋にバむナリが含たれおいたすが、ARMの䞋に必芁です。



フォルダヌを䜜成し、その䞭に画像を解凍したす
 $ mkdir -p /path/to/uinitrd.extracted $ pushd !$ $ dd if=/path/to/uinitrd-kirkwood.img bs=64 skip=1 | gzip -dc | sudo cpio -div $ popd
      
      





configに画像があるフォルダヌぞのパスを指定したす。

...

CONFIG_BLK_DEV_INITRD = y

CONFIG_INITRAMFS_SOURCE = "/ path / to / uinitrd.extracted"

CONFIG_INITRAMFS_ROOT_UID = 0

CONFIG_INITRAMFS_ROOT_GID = 0

...



カヌネルを2぀のパスでコンパむルしたす。
 # clean initrd directory $ sudo rm -rf /path/to/uinitrd.extracted/lib/{modules, firmware} # build kernel for the first time $ make KALLSYMS_EXTRA_PASS=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 zImage # build modules against the kernel $ make KALLSYMS_EXTRA_PASS=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 modules # install modules into initramfs dir $ sudo make ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 modules_install INSTALL_MOD_PATH=/path/to/uinitrd.extracted/ # install firmware to initramfs folder $ sudo make ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 firmware_install INSTALL_MOD_PATH=/path/to/uinitrd.extracted/ # remove unnecessary files $ sudo rm -rf /path/to/uinitrd.extracted/lib/modules/3.4.*/{build,source} # build the kernel again, with initramfs dir contains modules $ make KALLSYMS_EXTRA_PASS=1 ARCH=arm CROSS_COMPILE=/path/to/toolchain/arm-infotm-linux-gnueabi- -j2 zImage
      
      





゚ラヌが出る堎合がありたす [17] [18] 。 ゚ラヌテキストで提案されおいる解決策に助けられたしたパラメヌタヌKALLSYMS_EXTRA_PASS = 1。



次に、ファヌムりェア2を䜜成したす。
 # make u-boot image $ /path/to/mkimage -A arm -C none -O linux -T kernel -a 0x40008000 -e 0x40008000 -n linux-3.4 -d arch/arm/boot/zImage arch/arm/boot/uImage # make firmware2 $ cat /path/to/firmware2.header arch/arm/boot/uImage > firmware2
      
      



それからタブレットをロヌドしたす。



アセンブリを自動化するスクリプトが䜜成されたした [19] 。 次のコマンドが䜿甚されたした。
 $ ( time ./my_build.sh ) |& tee `date +%M%H_%F`-build-log.txt
      
      





ダりンロヌド枈み-USBが機胜せず、より正確には、ポヌトに電力が䟛絊されおいたせん。 私はyurayに助けを求めたしたが、圌には、おそらく私のチャむナパッドのレむアりトにはZT-180以倖の異なる配線があるず答えたした。



それからこの玠晎らしい蚘事を芋぀けたした。 [11]䜜業コアの郚品を分解する方法に぀いお。 USBに関連する「元の」ファヌムりェアの機胜のシステムコヌドを埩元し、゜ヌスコヌドのバヌゞョンず比范するこずにしたした。 残念なこずに、関数は正確な有向グラフに䞀臎したした。 ただし、䜜業コアには゜ヌスコヌドにはない関数がありたした。 どうやらUSBポヌトに呜を吹き蟌む魔法がありたすが、私は秘密のベヌルの䞋にそれを残したした...



埩元されたアセンブラコヌドを調査する過皋で、1぀の興味深い点に気付きたした。倚くの関数で、奇劙な指瀺が゚ピロヌグに続いおいたす。
 /* ... */ c039e32c: e59f0030 ldr r0, [pc, #48] ; c039e364 <_binary_0xc039e2e8_imapx200_decode_suspend_start+0x7c> /* ... */ c039e360: e89da800 ldm sp, {fp, sp, pc} c039e364: f0200000 undefined instruction 0xf0200000 c039e368: c24b1c9c subgt r1, fp, #39936 ; 0x9c00
      
      





0xF0200000を参照しおください 奇劙なあいたいな指瀺...そしおいく぀かの堎所でさえ発芋されたした。 これは特定のベヌスアドレスです、぀たり、理論的には各関数から44バむトを節玄できるこずを意味したすこの倀を1か所に入れるず、すべおの関数が1぀のアドレスにロヌドしたす-定数を取埗したす



恒垞性 ^



マむダヌズ [20]すべおが非垞によく描かれおいたす。 私はいく぀かの説明だけをしたす。



CおよびC ++蚀語のコンパむラはシングルパスです。぀たり、独自に定数を最適化するこずはできたせん。 少なくずも、/ Gwスむッチなど、リンカヌからのヘルプが必芁です。 [1] 。



同じワンパスの匱点が手に入りたすextern constを䜿甚したす [1] 。 アむデアは、次のようにヘッダヌファむルに定数を蚘述するこずです。

 #ifndef MY_CONST_H #define MY_CONST_H extern const int my_constant; #endif /* MY_CONST_H */
      
      





次に、ファむルに行を曞きたす
 const int my_constant = 42;
      
      



任意のブロヌドキャストナニットに配眮できたす。 これで、コンパむラはコヌドに定数倀を瞫うこずができなくなりたすが、それを参照する必芁がありたす。 リンカは、定数倀があるオブゞェクトファむルを1぀だけ受信し、その埌、コヌド内の最終アドレスを眮き換えたす。 もちろん、オプションもありたすが、䞀般的なケヌスでは、コンパむラヌだけではそのようなトリックの前に無力であり、䞊蚘のように匷制されたす。 ただし、わずかなニュアンスがありたす [21] 。



実隓のために、次の倉曎を行う必芁がありたす [19] 
芋せる
 diff -ru ./linux-3.4.108/arch/arm/mach-imapx200/Makefile ../linux-3.4.108/arch/arm/mach-imapx200/Makefile --- ./linux-3.4.108/arch/arm/mach-imapx200/Makefile 2015-09-09 12:17:52.483020878 +0300 +++ ../linux-3.4.108/arch/arm/mach-imapx200/Makefile 2015-09-08 17:11:45.775035963 +0300 @@ -6,7 +6,7 @@ #IMAPX200 support files -obj-$(CONFIG_CPU_IMAPX200) += irq.o clock.o time.o devices.o pwm.o +obj-$(CONFIG_CPU_IMAPX200) += irq.o clock.o time.o devices.o pwm.o constants.o diff -ru ./linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h ../linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h --- ./linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h 2015-09-09 12:17:52.498020874 +0300 +++ ../linux-3.4.108/arch/arm/mach-imapx200/include/mach/imapx_base_reg.h 2015-09-08 17:11:45.778035706 +0300 @@ -15,13 +15,23 @@ #define IMAPX200_SDRAM_PA (0x40000000) /************************Virtual address for peripheral*************************/ -#define IMAP_VA_SYSMGR IMAP_ADDR(0x00200000) -#define IMAP_VA_IRQ IMAP_ADDR(0x00000000) -#define IMAP_VA_TIMER IMAP_ADDR(0x00300000) -#define IMAP_VA_WATCHDOG IMAP_ADDR(0x00600000) -#define IMAP_VA_GPIO IMAP_ADDR(0x00400000) -#define IMAP_VA_NAND IMAP_ADDR(0x00500000) -#define IMAP_VA_FB IMAP_ADDR(0x00700000) +#if defined(IMAP_USE_MACRO_CONSTANTS) || defined(__ASSEMBLY__) +# define IMAP_VA_SYSMGR IMAP_ADDR(0x00200000) +# define IMAP_VA_IRQ IMAP_ADDR(0x00000000) +# define IMAP_VA_TIMER IMAP_ADDR(0x00300000) +# define IMAP_VA_WATCHDOG IMAP_ADDR(0x00600000) +# define IMAP_VA_GPIO IMAP_ADDR(0x00400000) +# define IMAP_VA_NAND IMAP_ADDR(0x00500000) +# define IMAP_VA_FB IMAP_ADDR(0x00700000) +#else +extern const void __iomem __force * const IMAP_VA_SYSMGR; +extern const void __iomem __force * const IMAP_VA_IRQ; +extern const void __iomem __force * const IMAP_VA_TIMER; +extern const void __iomem __force * const IMAP_VA_WATCHDOG; +extern const void __iomem __force * const IMAP_VA_GPIO; +extern const void __iomem __force * const IMAP_VA_NAND; +extern const void __iomem __force * const IMAP_VA_FB; +#endif /* defined(IMAP_USE_MACRO_CONSTANTS) || defined(__ASSEMBLY__) */ #define PERIPHERAL_BASE_ADDR_PA (0x20C00000) diff -ru ./linux-3.4.108/arch/arm/plat-imap/cpu.c ../linux-3.4.108/arch/arm/plat-imap/cpu.c --- ./linux-3.4.108/arch/arm/plat-imap/cpu.c 2015-09-09 12:17:52.607021038 +0300 +++ ../linux-3.4.108/arch/arm/plat-imap/cpu.c 2015-09-08 17:18:30.646035384 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + /******************************************************************************** ** linux-2.6.28.5/arch/arm/plat-imap/cpu.c ** diff -ru ./linux-3.4.108/arch/arm/plat-imap/gpio.c ../linux-3.4.108/arch/arm/plat-imap/gpio.c --- ./linux-3.4.108/arch/arm/plat-imap/gpio.c 2015-09-09 12:17:52.614020935 +0300 +++ ../linux-3.4.108/arch/arm/plat-imap/gpio.c 2015-09-08 17:18:38.566035206 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + /* arch/arm/plat-imapx200/gpiolib.c * * Copyright 2008 Openmoko, Inc. diff -ru ./linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c ../linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c --- ./linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c 2015-09-09 12:17:52.631020886 +0300 +++ ../linux-3.4.108/arch/arm/plat-imap/pm_imapx200.c 2015-09-08 17:18:52.102036874 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + #include <linux/init.h> #include <linux/suspend.h> #include <linux/serial_core.h> diff -ru ./linux-3.4.108/drivers/video/infotm/imapfb.c ../linux-3.4.108/drivers/video/infotm/imapfb.c --- ./linux-3.4.108/drivers/video/infotm/imapfb.c 2015-09-09 12:17:53.350020920 +0300 +++ ../linux-3.4.108/drivers/video/infotm/imapfb.c 2015-09-08 17:34:34.814042727 +0300 @@ -1,3 +1,5 @@ +#define IMAP_USE_MACRO_CONSTANTS + /***************************************************************************** ** drivers/video/infotm/imapfb.c ** diff -ru --new-file ./linux-3.4.108/arch/arm/mach-imapx200/constants.c ../linux-3.4.108/arch/arm/mach-imapx200/constants.c --- ./linux-3.4.108/arch/arm/mach-imapx200/constants.c 1970-01-01 03:00:00.000000000 +0300 +++ ../linux-3.4.108/arch/arm/mach-imapx200/constants.c 2015-09-09 14:56:53.513487879 +0300 @@ -0,0 +1,11 @@ +#include <linux/compiler.h> + +#include <mach/imapx_base_reg.h> + +const void __iomem __force * const IMAP_VA_SYSMGR = IMAP_ADDR(0x00200000); +const void __iomem __force * const IMAP_VA_IRQ = IMAP_ADDR(0x00000000); +const void __iomem __force * const IMAP_VA_TIMER = IMAP_ADDR(0x00300000); +const void __iomem __force * const IMAP_VA_WATCHDOG = IMAP_ADDR(0x00600000); +const void __iomem __force * const IMAP_VA_GPIO = IMAP_ADDR(0x00400000); +const void __iomem __force * const IMAP_VA_NAND = IMAP_ADDR(0x00500000); +const void __iomem __force * const IMAP_VA_FB = IMAP_ADDR(0x00700000);
      
      





枬定 ^



2぀の指暙を枬定するこずが決定されたした。

imapサブワヌドを含むすべおの関数のサむズをカりントするスクリプトはこちら [19] 。



結果は次のずおりです。
芋せる
 # diff -ru 1.log 2.log
      
      



 --- 1.log 2015-09-11 16:57:28.430158628 +0300 +++ 2.log 2015-09-11 16:57:20.627161803 +0300 @@ -1,4 +1,4 @@ -Data Size: 17844272 Bytes = 17426.05 kB = 17.02 MB +Data Size: 17843856 Bytes = 17425.64 kB = 17.02 MB Load Address: 0x40008000 Entry Point: 0x40008000 --- 22012015-rom/sizes.txt 2015-01-28 15:25:51.107945315 +0300 +++ 28012015-rom/sizes.txt 2015-01-28 15:15:48.052949785 +0300 @@ -1,25 +1,25 @@ -imapx200_timer_mask - 44 -imapx200_timer_unmask - 52 -imapx200_timer_ack - 44 +imapx200_timer_mask - 52 +imapx200_timer_unmask - 60 +imapx200_timer_ack - 52 imapx200_irq_add - 24 imapx200_irq_init - 32 imapx200_irq_wake - 44 -imapx200_irq_unmask - 136 -imapx200_irq_mask - 132 -imapx200_irq_ack - 120 +imapx200_irq_unmask - 172 +imapx200_irq_mask - 160 +imapx200_irq_ack - 152 imap_clk_enable - 60 imap_clkcon_enable - 76 -imapx200_gettimeoffset - 64 -imapx200_timer_setup - 164 -imapx200_timer_interrupt - 64 +imapx200_gettimeoffset - 68 +imapx200_timer_setup - 168 +imapx200_timer_interrupt - 76 imap_pwm_suspend - 188 imap_pwm_resume - 184 imap_pwm_start - 164 imap_timer_setup - 404 imap_default_idle - 20 -imapx_poweroff - 56 -imapx_reset - 64 -imapx200_idle - 52 +imapx_poweroff - 88 +imapx_reset - 68 +imapx200_idle - 48 imap_set_board - 112 imapx200_gpio_setpull_updown - 56 imapx200_gpio_getpull_updown - 36 @@ -48,7 +48,7 @@ imapx200_pm_prepare - 24 imapx200_pm_finish - 20 imapx200_pm_do_save - 88 -imapx200_pm_enter - 436 +imapx200_pm_enter - 500 imapx200_pm_configure_extint - 20 imapx200_pm_prepare - 24 imapx200_pm_init - 80 @@ -86,8 +86,8 @@ imapfb_resume - 196 imapfb_suspend - 204 imapfb_backlight_power_supply - 20 -imapfb_set_clk - 44 -imapfb_set_gpio - 88 +imapfb_set_clk - 52 +imapfb_set_gpio - 96 imapfb_set_brightness - 36 imapfb_lcd_power_supply - 32 con_get_unimap - 360 @@ -153,7 +153,7 @@ imap_nand_irq - 92 ehci_imapx200_drv_remove - 80 ehci_imapx200_init - 1148 -ehci_imapx200_drv_probe - 552 +ehci_imapx200_drv_probe - 556 ohci_hcd_imapx200_drv_remove - 80 ohci_imapx200_start - 100 ohci_hcd_imapx200_drv_probe - 512 @@ -196,22 +196,22 @@ imapx200_i2c_probe - 824 imapx200_i2c_irq - 920 imapx200_decode_poll - 184 -imapx200_decode_suspend - 132 +imapx200_decode_suspend - 44 imapx200_decode_resume - 68 -imapx200_decode_release - 192 +imapx200_decode_release - 104 imapx200_decode_open - 124 imapx200_decode_remove - 208 imapx200_decode_ioctl - 384 -imapx200_decode_probe - 908 +imapx200_decode_probe - 816 imapx200_decode_irq_handle - 264 imapx200_encode_poll - 84 -imapx200_encode_suspend - 116 +imapx200_encode_suspend - 28 imapx200_encode_ioctl - 348 imapx200_encode_resume - 68 -imapx200_encode_release - 188 +imapx200_encode_release - 100 imapx200_encode_open - 120 imapx200_encode_remove - 232 -imapx200_encode_probe - 1080 +imapx200_encode_probe - 988 imapx200_encode_irq_handle - 136 sdhci_imap_set_clk_src - 52 sdhci_imap_resume - 36 @@ -220,7 +220,7 @@ sdhci_imap_get_timeout_clk - 40 imapfb_probe - 2952 imapfb_init - 28 -sdhci_imap_probe - 604 +sdhci_imap_probe - 608 sdhci_imap_remove - 20 name_imapx200 - 12 imapfb_a1rgb232_8 - 48 @@ -342,8 +342,8 @@ __kstrtab_imap_get_reservemem_paddr - 26 __kstrtab_con_copy_unimap - 16 __kstrtab_con_set_default_unimap - 23 -imapx200_init_clocks - 1120 -imapx200_timer_init - 120 +imapx200_init_clocks - 1104 +imapx200_timer_init - 124 imapx200_register_device - 56 imap_init_pwm - 308 imapx200_fixup - 36 @@ -542,7 +542,7 @@ imapx200_i2c_driver - 116 imapx200_i2c_driver - 116 imapx200_decode_driver - 80 -imapx200_decode_fops - 144 +imapx200_decode_fops - 148 imapx200_encode_driver - 80 imapx200_encode_fops - 180 sdhci_imap_driver - 80
      
      





コア党䜓のサむズは416枛少したしたが、ゲむンは期埅したものではありたせんでした。䞀郚の関数は重みを远加したした。



おそらく、より経隓豊富な読者がその理由を知っおいるかもしれたせんが、その時点ではそれはそれほど明確ではありたせんでした。 アセンブラヌ関数imapx200_timer_ackの゜ヌスコヌドを怜蚎しおください。倉曎埌、サむズが8バむト増加したした。

芋せる
 --- 0xc0019c40-t-imapx200_timer_ack-2.listing 2015-11-18 22:12:24.196113878 +0300 +++ 0xc0019c50-imapx200_timer_ack-2.listing 2015-11-18 22:12:24.297113880 +0300 @@ -9,10 +9,12 @@ XXXXXXXX: e92dd800 push {fp, ip, lr, pc} XXXXXXXX: e24cb004 sub fp, ip, #4 ; 0x4 XXXXXXXX: e1a00000 nop (mov r0,r0) +c0019c60: e59f2018 ldr r2, [pc, #24] ; c0019c80 <_binary_0xc0019c50_imapx200_timer_ack_start+0x30> XXXXXXXX: e590Y000 ldr rY, [r0] XXXXXXXX: e3a0X001 mov rX, #1 ; 0x1 -c0019c58: e3a0120f mov r1, #-268435456 ; 0xf0000000 +c0019c6c: e5921000 ldr r1, [r2] XXXXXXXX: e1a0XX1Y lsl rX, rX, rY XXXXXXXX: e581X010 str rX, [r1, #16] XXXXXXXX: e581X000 str rX, [r1] XXXXXXXX: e89da800 ldm sp, {fp, sp, pc} +c0019c80: c04e858c subgt r8, lr, ip, lsl #11
      
      





最初に目に留たるのは、ベヌスアドレス自䜓が非垞に成功しおいるため、レゞスタに曞き蟌むずmovコマンドの4バむトに収たるこずです。
 c0019c58: e3a0120f mov r1, #-268435456 ; 0xf0000000
      
      





2番目倉曎埌、コンパむラヌは関数゚ピロヌグの埌に新しい定数のアドレスを远加する必芁がありたした。 その倀はあたり䟿利ではありたせん-4バむトの時間。



そしお最埌メモリから盎接倀を読み取るこずは䞍可胜なので、最初に定数のアドレスをレゞスタに曞き蟌みたす
 c0019c60: e59f2018 ldr r2, [pc, #24] ; c0019c80
      
      



-4バむト2。



結論 ^



客芳的な結論は、マクロの圢匏ずconst倉数の䜿甚の䞡方で定数を定矩した結果に぀いお知る必芁があるず思いたす。



個人的には、コンパむラヌリンカヌず組み合わせおが、extern constで問題なく定数の倀を埋め蟌む決定を独自に行うこずを倢芋おいたす。



ご枅聎ありがずうございたした



゜ヌスのリスト ^



  1. ^ 1 2 3 円呚を蚈算する
  2. ^ もう䞀床、䞀意の定数に぀いお
  3. ^ Zenithink ZT-180タブレットPCの䜿甚履歎ず賌入経隓
  4. ^ Zenithink Zt-180 10 "タブレットレビュヌ
  5. ^ペヌゞは利甚できなくなりたした。habrahabr.ru/ blogs / iTablet / 110714のさたざたなWebアヌカむブをWebで怜玢しおください
  6. ^このペヌゞはもう利甚できたせん。www.good-review.ru/ pandawill / 2011/02/21 / obzor-kitayskogo-plansheta-zenithink-zt-180-10.htmlのさたざたなWebアヌカむブを参照しおください。
  7. 魂の再配眮Androidタブレット䞊のLinux
  8. ^ 内郚の写真
  9. ^ Zimageアンパックおよびパックツヌル
  10. ^ 「firmware2」および「firmware_discovery」の逆コンパむル
  11. ^ 分解楜しさずオヌバヌクロックのためのAndroidカヌネルの砎壊
  12. ^ タブレット専甚のforum.china-iphone.ruのトピック
  13. ^ オヌプン゜ヌスプロゞェクト
  14. ^ github.com/atpboy444/ZT-180
  15. ^ github.com/dandel/linux-2.6.32.y
  16. ^ SlackwareARM-14.1
  17. ^ https://github.com/djwillis/meta-raspberrypi/issues/38
  18. ^ https://lkml.org/lkml/2012/7/6/260
  19. ^ 1 2 3 4 github.com/gshep/flytouch2-helper-scripts
  20. ^スコットマむダヌズ。 C ++の効果的な䜿甚。 55プログラムの構造ずコヌドを改善するための良いヒント
  21. ^ グロヌバルの初期化順序



All Articles