Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

QEMUでARM64bitベアメタルプログラミング

2,379 views

Published on

OSC2016 HokkaidoのLTでの発表スライドです。
https://www.ospn.jp/osc2016-do/modules/eguide/event.php?eid=2

Published in: Software
  • Be the first to comment

QEMUでARM64bitベアメタルプログラミング

  1. 1. QEMUでARM64bitベアメタルプログラミング 大神 祐真 yuma@ohgami.jp 2016/06/18
  2. 2. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 2 ● 大神 祐真 – yuma@ohgami.jp ● 組み込み系のプログラマ ● http://yuma.ohgami.jp – やっている事のまとめ
  3. 3. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 3 Raspberry Pi 3
  4. 4. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 4 Raspberry Pi 3 ARM 64ビットCPU 搭載
  5. 5. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 5 カーネル(Linux) アプリ(Raspbian) 共に、現状は32ビット 64ビット: ARMv8 32ビットアーキテクチャ
  6. 6. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 6 OS無しで、 素のハードウェア(ベアメタル)を 直接制御してみる
  7. 7. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 7 OS無しで、 素のハードウェア(ベアメタル)を 直接制御してみる ベアメタルプログラミング
  8. 8. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 8 実機での開発作業は 何かと面倒 とはいえ、
  9. 9. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 9 QEMUで効率化 実機での開発作業は 何かと面倒 とはいえ、
  10. 10. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 10 最も簡単なプログラム b . start.S
  11. 11. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 11 最も簡単なプログラム [PC]$ aarch64-linux-gnu-as -o start.o start.S [PC]$ aarch64-linux-gnu-objcopy -O binary start.o start.img [PC]$ qemu-system-aarch64 -cpu cortex-a57 -M virt -kernel start.img
  12. 12. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 12 C言語を使う mov x0, #0x40080000 mov sp, x0 bl main b . start.S int main(void) { return 0; } main.c
  13. 13. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 13 最も簡単なプログラム [PC]$ aarch64-linux-gnu-as -o start.o start.S [PC]$ aarch64-linux-gnu-gcc -c -o main.o main.c [PC]$ aarch64-linux-gnu-ld -Ttext 0x40080000 -o out.elf start.o main.o
  14. 14. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 14 最も簡単なプログラム [PC]$ aarch64-linux-gnu-objcopy -O binary out.elf out.img [PC]$ qemu-system-aarch64 -cpu cortex-a57 -M virt -kernel out.img
  15. 15. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 15 シリアル通信でHello world! int main(void) { put_str("Hello world!"); return 0; }
  16. 16. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 16 シリアル通信でHello world! #define DR (*(volatile unsigned int *)0x09000000) #define FR (*(volatile unsigned int *)0x09000018) void put_char(char ch) { while (FR & (1U << 5)); DR = (unsigned int)ch; } void put_str(char *str) { while (*str != '0') put_char(*str++); }
  17. 17. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 17 シリアル通信でHello world!
  18. 18. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 18 “ラズパイ3 ” ベアメタル で検索
  19. 19. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 19
  20. 20. 2016/06/18 大神 祐真 (yuma.ohgami.jp) 20 ご清聴、 ありがとうございました!

×