CH32V003の割込み周りについて

このリサーチにあたっては、uchanさんのCH32V003の割り込みネストを調査と、redditのWCH 高速割り込みに関するメモ : r/RISCVを参考にしました。

CH32V003のコアは、ネストした割込みをサポートしていますが、逆に、それを有効にしないと、割込みのネストは一切できない仕様になっています。

どういうことかというと、割込み処理中にmstatusレジスタの割込み許可ビットmieを1にしても、割込みはかかりません。実証コードを以下の sample1 で示します。

https://gist.github.com/metanest/007368c511066732aeebe30f6a893735#file-sample1-c

UIAPduinoにch32funで実装したコードです。SysTickハンドラでLEDを高速明滅させつつ、ソフトウェア割込みを時々起こすようになっています。ソフトウェア割込みの実行中に、割込みを許可( https://gist.github.com/metanest/007368c511066732aeebe30f6a893735#file-sample1-c-L52 )していますが、SysTick 割込みは掛からないままです。

これを無理やり割り込めるようにするサンプルが sample2 です。

https://gist.github.com/metanest/007368c511066732aeebe30f6a893735#file-sample2-c

interrupt_enablerという関数がミソで、割込みの終了を偽装することで( https://gist.github.com/metanest/007368c511066732aeebe30f6a893735#file-sample2-c-L37 )割込みを受け付けるようになります。

さて、ではきちんとコアの機能を利用して、割込みのネストを許可してみます。sample3 になります。

https://gist.github.com/metanest/007368c511066732aeebe30f6a893735#file-sample3-c

INTSYSCRレジスタのビット1(INESTEN)をセットすることで( https://gist.github.com/metanest/007368c511066732aeebe30f6a893735#file-sample3-c-L76 )、割込みのネストを許可し、次の行でソフトウェア割込みをネスト可に設定しています。

今度は、ソフトウェア割込み中は、明示して禁止しないと、割込みは許可の状態になっています。これは仕様で、QingKeV2 Microprocessor Manualの29頁に「in the QingKe V2 series microprocessors, MIE is not updated to 0 at this time before entering the last level of interrupt」と書かれています。

ここで一つ謎があります。生成されるコードを見るとわかりますが、GCCのinterruptアトリビュートで生成されるコードは、mepcとmstatusの保存と復帰をしていません。にもかかわらず、ネストした割込みからの多段の復帰がちゃんと行われています。これはどういうことでしょうか。

これを確認しているのが sample4 です。

https://gist.github.com/metanest/007368c511066732aeebe30f6a893735#file-sample4-c

ネストした割込みからのmretの前と後で、mepcが書き換わっていることを検出しています(検出するとLEDの明滅が遅くなる)。ネストした割込みに入る時、mepc(と、おそらくmstatus)が、ハードウェアによって保存され、mretで復原されるのでしょう。

これはドキュメント化されていませんが、以上の挙動から推察できます。

カーネルパラメータのrootのUUIDは小文字で書かないといけない、という話

Linuxカーネルパラメータに、ルートディレクトリの指示として、root=UUID=9164c505-9ecc-11ed-97f6-6045cb9ba8a6 などといったように書きますが、このUUID中のアルファベットを大文字にすると、起動時に https://www.google.com/search?q=dracut+boot に出てくるような起動しなくなる現象にハマります

ベルの法則について

『2030年の第4次産業革命』という本の p. 107 に、「ベルの法則」とは、約10年あまりごとに、時代を代表するコンピュータープラットフォームの大きさが、数百分の一になっていくという経験的な法則、と書かれているのですが、どこかにさらなる出典があるのでしょうか。

英語版Wikipediaにある Definition: の記述が若干それっぽいですが(2021年8月上旬時点で https://en.wikipedia.org/wiki/Bell%27s_law_of_computer_classes )、

Roughly every decade a new, lower priced computer class forms based on a new programming platform, network, and interface resulting in new usage and the establishment of a new industry.

おおざっぱに10年毎により廉価で新しいスタイルのコンピュータのクラスが形成される、としか言っておらず「時代を代表する」とも「数百分の一」とも言っていません。

なお、そもそもこのWikipedia英語版が、Definition: としてその部分を抽出していることすら怪しく(一次資料のみから書かれている、というテンプレが付いていますが、それに加えて独自研究の気配があります)、主要な参考文献であるCACMの記事 Bell's law for the birth and death of computer classes から該当しそうな部分を見つけてみると(PDFリンク http://gordonbell.azurewebsites.net/cacm%20bell's%20law%20vol%2051.%202008-january.pdf PDF)、次のように、

いくつも挙げられている法則性のうちのひとつでしかなく、またその新しいコンピュータのクラスについても "minimal" とあります。これは、マイクロコンピュータが誕生したその時点では、その当時のミニコンピュータを直接に置き換えるものではなかった、というような正確な歴史とも一致しています。

(追記) 改めて探してみたところ https://community.exawizards.com/aishinbun/20180427/ に「10年でコンピューティングコストは100分の1になる」という、ムーアの法則を拡大解釈したもの、だと書かれていました。執筆順を考えるとこれが出典かもしれません。またこちらのほうの元の記述は英語でこちら https://mindmatters.ai/2019/06/george-gilder-cloud-computing-is-reaching-its-limits/ のようです。

メモ


追記: いわゆる「昭和48年 第2小委員会報告」も関係あるかもしれない

Fedoraインストーラの謎メッセージ

「新しいファイルシステムは root デバイス上に作成する必要があります。」という謎のエラーメッセージがあるのだが、実際には、マウントポイントとして / を指定したボリュームはフォーマットが必須である、という意味である。
日本語化でおかしくなったわけではなく、英語の時点でそのような文意のメッセージになっている( You must create a new file system on the root device. )。

「〈特異点〉とは何か?」に関するメモ

「〈特異点〉とは何か?」は、S‐F マガジン2005年12月号 (x巻y号、通巻z号) の記事であるが、冒頭部の著作権表示などに誤植があるので注意が必要である。誤植であることは原文 https://edoras.sdsu.edu/~vinge/misc/singularity.html と対比すれば確認できる。