【C#】ref引数へプロパティや割り当て不可変数を渡す方法

タイトルの通りです。備忘録としての投稿です。

利用イメージ

VB6のByRef引数において、「()」で囲い、値渡しを強制する方法をC#再現にも利用可能です。
C#における関連エラーコードは下記です。
・CS0206: A non ref-returning property or indexer may not be used as an out or ref value
・CS1510: A ref or out value must be an assignable variable
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/ref-modifiers-errors#reference-variables-require-a-referent
参考になったサイトは下記です。
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs8157

【C#】任意クラスまたは構造体の配列の要素を初期化でインスタンス化

タイトルの通りです。備忘録としての投稿です。

Oracle VM VirtualBoxでMINIX 1.1のブートストラップを見る

書籍の記載を確認するために、VirtualBoxのデバッグ機能を使って、MINIX 1.1のブートストラップ(bootblok.s)を見てみました。
・MINIXオペレーティングシステム (ISBN4-7561-0000-7)
 ⇒「APPENDIX D MINIX再構築ガイド」/「D.1 はじめに」
・MINIXリファレンスマニュアル (ISBN4-535-60004-X-C3055)
 ⇒「Chapter 3 MINIX インプリメンターガイド」/「3.1 イントロダクション」
 ⇒「Chapter 3 MINIX インプリメンターガイド」/「3.5 ブートディスケットの構築」/「3.5.1 導入」

1.準備①VirtualBoxの設定

理由はわからないが、VirtualBoxのブレークポイントを利用するために、[設定]-[システム]-[アクセラレーション]-[仮想化支援機能]のチェックボックス[VT-x/AMD-Vを有効化]のチェックを外しておく。

2.準備②MINIX起動ディスクのファイル名を変更

拡張子が無いとVirtualBoxでイメージの選択ができないため、拡張子を付与する。

オリジナルファイル名変更後ファイル名内容(“README_1.1″より)
floppy_disk1floppy_disk1.imgBoot Disk
floppy_disk2floppy_disk2.imgRoot File System
floppy_disk3floppy_disk3.img/usr
floppy_disk4floppy_disk4.img/user
floppy_disk5floppy_disk5.imgKernel, H and Include Sources
floppy_disk6floppy_disk6.imgFS and Lib Sources
floppy_disk7floppy_disk7.imgMM and Tools Sources
floppy_disk8floppy_disk8.imgCommands Sources

3.VirtualBoxでイメージを選択しデバッグ起動

VirtualBoxのフロッピーデバイス0に「floppy_disk1.img」を選択し、下記コマンドを用いて起動する。
“C:\Program Files\Oracle\VirtualBox\VBoxManage.exe” startvm “Minix_v1.1” -E VBOX_GUI_DBG_AUTO_SHOW=true -E VBOX_GUI_DBG_ENABLED=true
※”Minix_v1.1″は仮想マシン名。
※起動すると一時停止状態になる。


(他の起動方法)
“C:\Program Files\Oracle\VirtualBox\VirtualBoxVM.exe” –startvm “Minix_v1.1” –dbg
※一時停止状態ではなく、動作する。

4.使用するデバッグコマンドを確認

ウィンドウ「VBox Dbg – Console」のテキストボックス「Command」へ、「help commands」と入力し[Enter]キーを押下。

※一部抜粋。

※ウィンドウ「VBox Dbg – Console」が表示されていない場合、仮想マシンのウィンドウのメニュー[デバッグ]-[コマンドライン]で、表示できる。

※参考 – 「help commands」の結果。

5.ブレークポイントへブートプログラムの開始番地(0x7c00)を追加

ウィンドウ「VBox Dbg – Console」のテキストボックス「Command」へ、「br 0x7c00」と入力し[Enter]キーを押下。

6.仮想マシンを再開

再開し暫くすると、設定したブレークポイントで、中断し、ウィンドウ「VBox Dbg – Console」へ、アドレス「0000:00007c00」で、中断した旨が、表示される。

7.0x7c00へロードされているプログラムとブートストラップ(bootblok.s)を比較

0x7c00へロードされているプログラムを表示するために、ウィンドウ「VBox Dbg – Console」のテキストボックス「Command」へ、「u」と入力し[Enter]キーを押下。

[ブートストラップ(bootblok.s)の抜粋]

8.最後に、ブートストラップ処理を見るためにステップ実行

※「t」、「p」、「br」、「g」などを使用する。
※理由はわからないが、「g」コマンドは、「t」コマンドなどのステップ実行後でないと動作しない。
※「0000:00007c11 rep movsw」は、繰り返しのため、下記は、「0000:00007c13 jmp far 02fe0h:00018h」へブレークポイントを設定した例である。

Minix 1.1 インストール

(Install MINIX 1.1 on VirtualBox)
オペレーティングシステム : 設計と実装』で扱っているのは、Minix 3です。ダウンロード可能な最も古いバージョンは、Minix 1.1であったので、当時の感動を味わいたいと思い、作業した記録です。

と作業したのは、2年前(2020年08月)。
仮想マシンでサクッと進めようと思ったのですが、簡単にはできず、試行錯誤して、記録を残していたのですが、今(2022年08月)となっては、意図がわからない状態になってしましました。

まずは、2年前(2020年08月)の記録を、素直に投稿します。
続いて、記録を整理して順次投稿するつもりです。

2.仮想マシン作成

※ネステッドページング無効にしないと’=’キー押下の後で進まない、COMポートは念のため。

3.パーティション作成

Minix 2.0.4(Intel-2.0.4.tar.gz)を使う。パーティション3つ作成(rootfs用(360KB),usr用(24MB),user用(24MB))。

4.初起動

FDイメージのサイズを360KBから720KBへ拡大(増えた領域の値は任意)する。(VirtualBoxはイメージサイズにより、シリンダ数、セクタ数が変わる模様のようであり、360KBの場合、1.44MBとして動作するようで、FD読み出しがうまくいかない)

5.ファイルコピー

6.hdアクセス可能にするため編集とmake

  • kernelのat_wini.c⇒wini.cへ。
  • wini.cを改変。
  • Toolsでimage作成。
  • 作ったImageでBoot(HD見れるようになる)

7.rootfsをhd1にするための編集とmake

8.ファイル設定の変更

  • proto.usrとproto.userを変更。
  • proto.usrのroot部を変更。
  • proto.usrのbin以下のエイリアスを「../commands/」から「/usr/」へ変更。
  • proto.userのroot部を変更。
  • proto.userのtest以下のエイリアスを「../test/」から「/usr/test/」へ変更。
  • /usr/etc/rcの初期マントを「fd」から「hd」へ変更