QEMUでARM64bitベアメタルプログラミング
大神 祐真
yuma@ohgami.jp
2016/06/18
2016/06/18 大神 祐真 (yuma.ohgami.jp) 2
● 大神 祐真
– yuma@ohgami.jp
● 組み込み系のプログラマ
● http://yuma.ohgami.jp
– やっている事のまとめ
2016/06/18 大神 祐真 (yuma.ohgami.jp) 3
Raspberry Pi 3
2016/06/18 大神 祐真 (yuma.ohgami.jp) 4
Raspberry Pi 3
ARM 64ビットCPU
搭載
2016/06/18 大神 祐真 (yuma.ohgami.jp) 5
カーネル(Linux)
アプリ(Raspbian)
共に、現状は32ビット
64ビット: ARMv8
32ビットアーキテクチャ
2016/06/18 大神 祐真 (yuma.ohgami.jp) 6
OS無しで、
素のハードウェア(ベアメタル)を
直接制御してみる
2016/06/18 大神 祐真 (yuma.ohgami.jp) 7
OS無しで、
素のハードウェア(ベアメタル)を
直接制御してみる
ベアメタルプログラミング
2016/06/18 大神 祐真 (yuma.ohgami.jp) 8
実機での開発作業は
何かと面倒
とはいえ、
2016/06/18 大神 祐真 (yuma.ohgami.jp) 9
QEMUで効率化
実機での開発作業は
何かと面倒
とはいえ、
2016/06/18 大神 祐真 (yuma.ohgami.jp) 10
最も簡単なプログラム
b .
start.S
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
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
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
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
2016/06/18 大神 祐真 (yuma.ohgami.jp) 15
シリアル通信でHello world!
int main(void)
{
put_str("Hello world!");
return 0;
}
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++);
}
2016/06/18 大神 祐真 (yuma.ohgami.jp) 17
シリアル通信でHello world!
2016/06/18 大神 祐真 (yuma.ohgami.jp) 18
“ラズパイ3 ” ベアメタル
で検索
2016/06/18 大神 祐真 (yuma.ohgami.jp) 19
2016/06/18 大神 祐真 (yuma.ohgami.jp) 20
ご清聴、
ありがとうございました!

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

  • 1.
  • 2.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 2 ● 大神 祐真 – yuma@ohgami.jp ● 組み込み系のプログラマ ● http://yuma.ohgami.jp – やっている事のまとめ
  • 3.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 3 Raspberry Pi 3
  • 4.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 4 Raspberry Pi 3 ARM 64ビットCPU 搭載
  • 5.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 5 カーネル(Linux) アプリ(Raspbian) 共に、現状は32ビット 64ビット: ARMv8 32ビットアーキテクチャ
  • 6.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 6 OS無しで、 素のハードウェア(ベアメタル)を 直接制御してみる
  • 7.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 7 OS無しで、 素のハードウェア(ベアメタル)を 直接制御してみる ベアメタルプログラミング
  • 8.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 8 実機での開発作業は 何かと面倒 とはいえ、
  • 9.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 9 QEMUで効率化 実機での開発作業は 何かと面倒 とはいえ、
  • 10.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 10 最も簡単なプログラム b . start.S
  • 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.
    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.
    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.
    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.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 15 シリアル通信でHello world! int main(void) { put_str("Hello world!"); return 0; }
  • 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.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 17 シリアル通信でHello world!
  • 18.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 18 “ラズパイ3 ” ベアメタル で検索
  • 19.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 19
  • 20.
    2016/06/18 大神 祐真(yuma.ohgami.jp) 20 ご清聴、 ありがとうございました!