sim for riscV
Table of Contents
HDD vs. SSD
前回の河豚板HDDの問題、識者に聞いてみた。あの症状が出るとHDDが御陀仏に なる確率が極めて高いとの事。意識のあるうちに、read-only mountして、内容を 取り出しておいた方が良いそうだ。まあHDDの場合は、こうした前兆が有るんで 対応が取りやすいな。
その点、SSDはどうなんだろう? ある日、何の予兆も無いまま死んでしまうと 始末が悪いな。ピンピン・コロリでいいのは、人間だけです。オイラーの家系は 幸い、ピンコロ系みたいだけど。。でも、ディジタル遺産の処分がスムースに 行く様にしとくのは、重大な責務だな。
gdb
OpenBSD用のriscV64開発環境には残念ながらgdbが提供されていない。自前で用意 するなら、どうやるの? 結構面倒だった記憶がある。
さらっと説明してるなあ。信用していいのか? ターゲットはリナだからなあ。 そんな事を言うなら、OpenBSDの32Bitでは、どうしてたか調べろ。
BUILD_DEPENDS = devel/libtool \ devel/bison \ devel/riscv32-esp-elf/binutils RUN_DEPENDS += devel/riscv32-esp-elf/binutils CONFIGURE_ARGS += --enable-commonbfdlib=no \ --with-cross-host=yes \ --disable-werror \ --without-guile \ --without-lzma \ --disable-binutils \ --disable-ld \ --disable-gas \ --disable-gprof \ --disable-install-libiberty \ --enable-gdb \ --enable-sim
そろりそろりと試してみるかな。
こんなのも追加。
--with-gmp=/usr/local \ --with-mpfr=/usr/local \
nslはconfigureでOFFに出来ないみたいなんで、こいつらを変更かな。
ob$ find . -name '*.h' | xargs grep ENABLE_NLS ./intl/config.h:#define ENABLE_NLS 1 :
もうリナ向けしか考慮してないな。そりゃまあGNUですから。
multi gdb
ふと、gdb 15.2 が、OpenBSD 7.7 から供給される様になった事に気付いた。 devel/gdbがどうなってるか確認。
ONFIGURE_ARGS= --program-prefix=e \ --disable-install-libbfd \ --disable-nls \ --disable-sim \ --without-guile \ --without-isl \ --without-lzma \ --with-libgmp-type=shared \ --with-auto-load-dir=${TRUEPREFIX}/share/gdb/auto-load \ --enable-targets=all \ --with-python=${MODPY_BIN} \ --with-system-zlib CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \ LDFLAGS="-L${LOCALBASE}/lib ${LDFLAGS}"
disable-nlsをちゃんと指定しているなあ。いや注目すべきは、enable-targets=all でしょう。素直に解釈すれば、riscVなgdbもWelcomeだな。本当か? サイズが40Mも有る巨大な奴なんで期待大!
普通のgdbでriscVの観測を開始。
vm$ gdb kernel.elf GNU gdb (GDB) 15.2 (gdb) target remote :1234 Remote debugging using :1234 0x00001000 in ?? () (gdb) b map_page Breakpoint 1 at 0x80200110: map_page. (2 locations) (gdb) c Continuing. Breakpoint 1.1, map_page (table1=0x80246000, vaddr=2149580800, paddr=2149580800, flags=14) at kernel.c:27 27 if (!is_aligned(vaddr, PAGE_SIZE)) (gdb) bt #0 map_page (table1=0x80246000, vaddr=2149580800, paddr=2149580800, flags=14) at kernel.c:27 #1 0x80200996 in create_process (image=image@entry=0x0, image_size=image_size@entry=0) at kernel.c:433 #2 0x80200d4a in kernel_main () at kernel.c:557 #3 0x8000e63e in ?? () : (gdb) p $pc $3 = (void (*)()) 0x80200110 <map_page> (gdb) p $ra $4 = (void (*)()) 0x80200996 <create_process+222> : (gdb) p/x $satp $7 = 0x80080259 (gdb) p/x $scause $8 = 0x8
レジスターを単独で確認したい場合、$ を冒頭に付ける。CSR's regsterでもOK。
(gdb) info symbol __bss printf __bss_end process : (gdb) disassemble virtio_blk_init Dump of assembler code for function virtio_blk_init: 0x80200274 <+0>: addi sp,sp,-16 0x80200276 <+2>: sw s0,8(sp) 0x80200278 <+4>: lui s0,0x10001 0x8020027c <+8>: lw a4,0(s0) 0x8020027e <+10>: lui a5,0x74727 0x80200282 <+14>: sw ra,12(sp) 0x80200284 <+16>: addi a5,a5,-1674 # 0x74726976 0x80200288 <+20>: bne a4,a5,0x802002d0 <virtio_blk_init+92> 0x8020028c <+24>: lw a4,4(s0) :
ちゃんと逆アセもしてくれる。
(gdb) info target Symbols from "/tmp/risc-V/kernel.elf". Remote target using gdb-specific protocol: `/tmp/risc-V/kernel.elf', file type elf32-littleriscv. Entry point: 0x80200000 0x80200000 - 0x80200f6c is .text 0x80200f6c - 0x80201295 is .rodata 0x80201298 - 0x80211698 is .data 0x80211698 - 0x8021169c is .sdata 0x8021169c - 0x802228e4 is .bss
こんなのも確認できる。
gdb sim
それはいいんだけど、gdbにもsimを付属できるのか。 昔、使ったような気がするけど、すっかり忘却の彼方だ。
これってqemu嫌いな人向けのお助け環境じゃん。ちょいと試すならこれで十分な気が する。
これオイラーも大昔にやっていたな。 sim/arm とか、 MIPS(4) こんなのとか、 CPU Collection
gdb/sim が頑張ってくれてるなら、それに対応したbinaryを作成すれば、gdb/simでも 動くって事だな。
'target sim [SIMARGS] ...' Builtin CPU simulator. GDB includes simulators for most architectures. In general, target sim load run works; however, you cannot assume that a specific memory map, device drivers, or even basic I/O is available, although some simulators do provide these. For info about any processor-specific simulator details, see the appropriate section in Embedded Processors.
組み込みの対象には、ARM,MIPS等が列挙されてたけど、riscVは無いぞ。組み込み 方面からスパコンまでriscVはサポートしてるはずなんだけどな。
sakae@lu:risc-V$ gdb -q (gdb) show configuration This GDB was configured as follows: configure --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-auto-load-dir=$debugdir:$datadir/auto-load --with-auto-load-safe-path=$debugdir:$datadir/auto-load --with-expat : (gdb) target sim Undefined target command: "sim". Try "help target".
リナ付属の普通?なgdbは、simがサポートされていない。それに対して、 ちゃんとした?gdbは、それなりに応答してくれる。
sakae@lu:risc-V$ riscv64-unknown-elf-gdb -q kernel.elf GNU gdb (SiFive GDB-Metal 10.1.0-2020.12.7) 10.1 : Reading symbols from kernel.elf... (gdb) target sim Connected to the simulator. (gdb) load Loading section .text, size 0x153e lma 0x80200000 Loading section .rodata, size 0x2ec lma 0x80201540 Loading section .data, size 0x10450 lma 0x8020182c Loading section .sdata, size 0x4 lma 0x80211c7c Start address 0x80200000 Transfer rate: 582640 bits in <1 sec. (gdb) run Starting program: /tmp/risc-V/kernel.elf core: 2 byte read to unmapped address 0x80200000 at 0x80200000 Program received signal SIGSEGV, Segmentation fault. boot () at kernel.c:570 570 __asm__ __volatile__( (gdb) l 565 } 566 567 __attribute__((section(".text.boot"))) 568 __attribute__((naked)) 569 void boot(void) { 570 __asm__ __volatile__( 571 "mv sp, %[stack_top]\n" 572 "j kernel_main\n" 573 : 574 : [stack_top] "r" (__stack_top) (gdb) disassemble $pc Dump of assembler code for function boot: => 0x80200000 <+0>: Cannot access memory at address 0x80200000
走り始めたかと思ったらSEGVの洗礼。アクセス不可の領域なら、そうなるわな。 一体、どの辺が利用可能なの? そんなのソース嫁。
sakae@lu:tmp$ tar xf ~/Downloads/gdb-15.2.tar.gz gdb-15.2/sim sakae@lu:tmp$ ls gdb-15.2/sim/ COPYING bfin/ example-synacor/ m4/ pru/ ChangeLog-2021 bpf/ frv/ m68hc11/ riscv/ MAINTAINERS common/ ft32/ mcore/ rl78/ Makefile.am config.h.in gdbinit.in microblaze/ rx/ Makefile.in configure* h8300/ mips/ sh/ README-HACKING configure.ac igen/ mn10300/ testsuite/ aarch64/ cr16/ iq2000/ moxie/ v850/ aclocal.m4 cris/ lm32/ msp430/ arm/ d10v/ m32c/ or1k/ avr/ erc32/ m32r/ ppc/
全体を展開しちゃうと目移りしちゃうので、simだけを展開。そろりそろりと、 example-synacorとかtestsuiteあたりから見ていけばいいのかな。
spim
シュミレータと言えば何故か手元に、こんな本がある。
題名通りの本なんだけど、対象の石はMIPS2000とかだ。これriscVの先祖ね。 あの糞石であるx86は面倒くさすぎて教員にすこぶる評判が悪い。そのな事なんで spim/xspimと言う便利なシュミレータが提供されてるものにしたとの事。 すこぶる納得です。
ソースコードはMSBがonになった文字コード(SJIS,EUC,UTF-8)を使うとハングする様なので、jis版で確認 (まるで昔のsendmailみたいだ)。
# "Hello world." を表示するプログラム # データ .data msg: .asciiz "Hello world.\n" # プログラム (テキスト) .text .globl main main: # main: 実行を開始する部分 li $v0, 4 # 4 = 文字列表示のシステムコール番号 la $a0,msg # $a0 レジスタに、文字列の番地を入れる syscall # システムコール呼び出し jr $ra # main の呼び出し元に戻り、プログラム終了
sakae@lu:chapter-06$ spim -file hello.as SPIM Version 8.0 of January 8, 2010 Copyright 1990-2010, James R. Larus. All Rights Reserved. See the file README for a full copyright notice. Loaded: /usr/lib/spim/exceptions.s Hello world.
REPLするなら、こうする。xxpimは文字が細かすぎてお手上げです。
sakae@lu:chapter-06$ spim : Loaded: /usr/lib/spim/exceptions.s (spim) load "hello.as" (spim) run Hello world. (spim)
spike
spimを進化させてriscV対応にしたのが、多分これです。名前が微妙に似ているでしょ。
Spike RISC-V ISA Simulator (本家)
RISC-V Spike のインストール この様にして自前でインストールしろとな。
【RISC-V】ISAシミュレータSpikeの構成を調査する
こういうのが面白いんだよな。
RustでRISC-Vエミュレータを書いてNOMMU Linuxをブラウザで動かした
これも面白い。石屋さんになった積りで読むと良い。
RISC-V OS
本格的なOS例。それはLinuxだろうにってのは却下。
そして、面白い部分です。
32/64Bitの違いは、下記を使うと吸収される。
#include <stdint.h> #include <stddef.h>
gp レジスターがどの様に使われているか?
sakae@lu:sophiaOS$ riscv64-unknown-elf-objdump -d -M no-aliases sophia | grep gp 80200004: 00023197 auipc gp,0x23 80200008: 9a418193 addi gp,gp,-1628 # 802229a8 <__global_pointer$> 80200f50: 00323c23 sd gp,24(tp) # 18 <CurrentTask+0xc>
同じく、tpがどうかな? 下記はその一部なんだけど、大活躍です。
sakae@lu:sophiaOS$ riscv64-unknown-elf-objdump -d -M no-aliases sophia | grep tp 80200110: 00c26583 lwu a1,12(tp) # c <CurrentTask> 80200194: 00822583 lw a1,8(tp) # 8 <ThisCore> 80200fe4: 14021273 csrrw tp,sscratch,tp 80200fe8: 02453023 sd tp,32(a0)
riscv bear
errorbars
日夜、血圧を測定してる。おまけで脈拍もだ。最低脈拍が非常に低い事がある。 医者に相談したら、今度そのデータを見せて下さいと言われた。CSVなデータで いいのだろうか? いや、それじゃ目を白黒するだろうから、グラフぐらいにして 持参かな。
どんなグラフが良いのだろう? 3秒考えて、かっこいいエラーバー付きのグラフに してみるかな。何か理科の実験データの整理みたい。月々の平均があって、それに 最高、最低脈拍のヒゲが伸びますよって奴。
データは、年月 平均 最高 最低 って形で用意すればいいみたい。月毎のデータをawkに でも渡して計算させるか、いや久しぶりにvlangだな。
import os import strconv import math.stats fn main() { mut datin := []f64{} for s in os.get_lines() { datin << strconv.atof64(s)! } a := stats.mean(datin) h := stats.max(datin) l := stats.min(datin) unsafe { strconv.v_printf("%.1f %G %G\n", a, h, l) } // s := stats.population_stddev(datin) // println(s) }
事前に v ahl.v して、特製コマンドを作成しとく。こやつ、パイプから流れてくる データの平均とかを出力する単純な奴だ。
それを利用するのが下記スクリプト。current.csvの第4フィールドが脈拍になる (25063021,112,59,54)。
#!/bin/sh cnt=1 for y in 21 22 23 24 25 do for m in 01 02 03 04 05 06 07 08 09 10 11 12 do val=`grep $y$m current.csv | cut -d',' -f4 | ./ahl` echo $cnt $val cnt=`expr $cnt + 1` done done
このスクリプトの出力をリダイレクトして、pd ってファイル名にする。最初はX軸に 年月を指定してたんだけど、それだとグラフが歯抜けになってしまうんで、通し番号 にした。
gnuplot> set yrange [30:90] gnuplot> p "pd" w lines gnuplot> replot "pd" w errorbars
後は、平均にエラーバーを重ねて表示。 スクリプトにしておいて実行。gnuplot -p show.gp ここで -p は必須。gnuplotが終了 しても、グラフを残してくれって事だ。
set encoding utf8 set terminal pdfcairo mono font ",20" size 29cm, 21cm set output "~/Desktop/myaku.pdf" set title "脈拍の変化" unset key # no label on right top set xdata time # timedata for x set timefmt "%y%m" # pd's format set format x "%y/%m" # display format set grid set yrange [30:90] plot "pd" using 1:2 with lines,\ "pd" using 1:2:3:4 with yerrorbars
後は、PDFファイルにしてから、コンビニで印刷だな。X軸は yy/mm になる様に細工 しておいた。 今回は、平均 最高 最低 でエラーバーにしたけど、平均 標準偏差 ってのも統計の通だと 思うぞ。同一ファイルの場合は、
plot "pd" using 1:2 with lines,\ "" using 1:2:3 with yerrorbars
この様に省略可能。
ちょっと、ChatGPT医師にセカンドオピニオンしてみる。
A: ご自身で日々記録されている脈拍データ、非常に丁寧で素晴らしい健康管理ですね。
ご質問の「最低脈拍が低いと思うが、どうか?」について、以下に医学的・統計的な観点から考察します。
—
### ■ 脈拍(安静時心拍数)の正常範囲について
- 一般的な成人の安静時心拍数の正常範囲**: → **60~100回/分 これは医学的な標準範囲ですが、必ずしもすべての人に当てはまるとは限りません。
- **アスリートや健康な人の場合**: → **40〜60回/分**でも正常なことが多くあります。 特に持久系運動(ウォーキング、ランニング、サイクリングなど)を日常的にしている方では、**40回台前半も珍しくありません**。
—
### ■ あなたの脈拍データの要点
年月 | 最低脈拍 |
--------- | ------------ |
2407〜2506 | 42〜46回/分 |
- **最低値の42回/分**(2506)はやや低めではありますが、**他の月と比べて突出して低いわけではありません**。
- 月ごとの**平均も50〜57回/分**の範囲に収まっており、**全体として安定しています**。
—
### ■ 低すぎる脈拍(徐脈)に注意すべきケース
以下に該当するようであれば、医師への相談をおすすめします:
- 日中や活動中も脈拍が40回台
- **息切れ、めまい、失神**、強い疲労感がある
- 脈が不規則(不整脈の疑い)
しかし、**自覚症状がなく、日常生活に支障がなければ、現在の最低脈拍(42〜46)は病的とまでは言えません**。
そうか、アイドリング時の心臓エンジンの回転数が低いってアスリート性質が有るって 事か。無駄な空ぶかしはせず、エンジンを温存してるんだな。昔読んだ、"象に時間、ネズミの時間" って本によれば、心臓の耐用回数ってのは、生物によらず一定らしい。だから、脈拍が 少ないと生物としての寿命は長くなる。長寿の家系かな。
README
食の哲学 なんて本を読んだ。 人は食べたものでできている が、この本の キャッチフレーズ。食ベてセックスしてってのが、生き物の基本特性。 いわゆる身体感覚。見て聞いてってのは、他人と感覚をわかち合える。その 身体感覚の方は、個人によって捉え方に幅が有るので、哲学の分野では、 軽く扱かわれていたとか。
ロボットでも、見て聞いては、扱かい易い知覚だ。最近は、それに触覚を 知覚するってのも加わっているかな。味覚や嗅覚はどうなんだろう? ソムリエ・ロボットって有りますか?
A: はい、「ソムリエ・ロボット」という概念や製品は実際に存在します。これは、**ワインや飲料の選定・提供・解説を自動で行うロボットやAIシステム**のことを指します。実際にいくつかの例があります:
—
### 🧠 主なタイプの「ソムリエ・ロボット」
#### 1. 飲料推薦AI(ソフトウェア型)
- スマホアプリやタブレット端末でユーザーの好みや料理に応じてワインや酒を推薦。
- 例:
- **Wine Ring**:ユーザーの好みに基づいてワインを学習して推薦。
- **Vivino**:ワインラベルをスキャンして味や評価を表示。
#### 2. ロボット・ソムリエ(ハードウェア型)
- 実際に店舗や展示会などで飲料を提供・説明するロボット。
- 例:
- **ソムリエロボット「Yorisoi」**(日本):NECが開発した対話型ロボット。ユーザーの気分や嗜好に応じてワインや日本酒を推薦。
- **KUKAのロボットアーム + AI**:高級レストランでワインボトルを正確に取り出して注ぐ自動化システム。
- **「WineBot」**(研究段階):ワインの香りや味の成分を分析するセンサーを搭載したロボット。
—
### 🍷 技術的な要素
- **センサー**:香り成分やアルコール度数、色、温度などを分析。
- **AI・機械学習**:ユーザーの履歴やフィードバックから「好み」を学習。
- **音声対話**:人間と自然な会話をしながら商品を推薦(例:PepperにワインAIを組み込むなど)。
- **ロボットアーム**:ワインのボトルを正確に扱い、注ぐ。
—
### 🤖 実際の活用事例(日本)
- **ANAインターコンチネンタルホテル東京**:レストランでロボットがワインを推薦・説明するサービスを実施したことがあります。
- **日本酒AIソムリエ**:味覚センサーとAIを使って、日本酒を料理とペアリングして推薦する実証実験が行われたこともあります。
—
### 💡 未来的な可能性
- ワインバーやレストランでの無人接客
- 自宅用スマートセラー(IoT冷蔵庫とAIソムリエ)
- 香りセンサーとの連動による「仮想テイスティング」
まあロボットの事は、これぐらいにして、他の話題も面白い。一時流行したスローフード。 某世界企業の工業生産品に対抗してイタリアで生まれた運動。地域の食文化を大事に しましょうって奴ね。日本風に言うと地産地消な食文化。昔からの知恵がつまっている。
イタリアと言えばオリーブ・オイル。これって種から絞るかと思ったら、果実から絞る オイルなんですね。小豆島の人には常識でしょうけど、オイラーは知らなかった。 エキストラ・バージン・オイルは、非常に高価な物らしい。そこで、まがい物が出て くる。普通の人は、馬鹿舌なんで、本物と偽物の区別がつかないそうだ。 本物を味わって、舌に覚えさせるしかないとか。
後興味を引いたのは、フードポルノって話。いかに美味しそうな写真を取るか。 インスタ映えとか言って、際限もなく飾る(そして、時には食品をないがしろにする) 風潮を揶揄してる。確かにそうだよなあ。考えさせられる本でした。