最近、南京大学のオペレーティングシステムコースを再び追いかけています(前回は途中で諦めました)。メモを残します。
1. 最初に、第 3 回のデモのコンパイル時に ld などのコマンドが見つからない問題が発生しました。#
http://jyywiki.cn/OS/2023/build/lect3.ipynb demo('hello-os', 'i/hello-os')
私は archlinux を使用しているため、binutils でコンパイルされた ld、gcc などのコマンドには x86 の接頭辞が付いていません。
一方、Makefile には x86 の接頭辞が付いているため、リンクを作成する必要があります。
ln -s /usr/bin/ld /usr/bin/x86_64-linux-gnu-ld
{{<block type="tip" title="chatgpt からの説明:">}}
このコマンドは、「x86_64-linux-gnu-ld」という名前のシンボリックリンクを作成し、「/usr/bin/ld」を指すようにします。このシンボリックリンクは、「x86_64-linux-gnu-ld」というバイナリファイルの代替として使用できます。
シンボリックリンクは、別のファイルを指す特殊なファイルタイプであり、ファイルシステム内で他のファイルやディレクトリにエイリアスを作成するために使用できます。
Linux システムでは、「/usr/bin/ld」はリンカ(linker)であり、複数のオブジェクトファイルを 1 つの実行可能ファイルに結合するために使用されます。 「x86_64-linux-gnu-ld」のシンボリックリンクを作成することで、このリンカの機能を異なるシステムで使用できるようにし、実行可能ファイルのコードを変更する必要はありません。
このシンボリックリンクは、通常、アプリケーションをクロスコンパイル(cross-compiling)する場合に使用されます。この場合、アプリケーションは異なるハードウェアプラットフォームで実行されます。
{{< /block >}}
2. vscode などのエディタを使用すると、最初の問題のコードでヘッダーファイルにジャンプできません。#
bear を使用して compile_commands.json を生成し、エディタが自動的に認識するようにします。
bear -- make
{{<block type="tip" title="chatgpt からの説明:">}}
このコマンドは、Bear と Make ツールを使用して、Makefile のビルドコマンドとコンパイル中の呼び出しチェーンを自動的にキャプチャするために使用されます。
具体的には、Bear は strace の出力を JSON 形式のファイルに変換するツールであり、このファイルには実行中のシステムコールのすべてが含まれます。
Make は、Makefile のルールに基づいてプログラムを自動的にビルドおよびコンパイルするツールです。
これらの 2 つのツールを組み合わせて使用すると、「bear -- make」コマンドを使用して Makefile のビルドコマンドとコンパイル中の呼び出しチェーンを自動的にキャプチャすることができます。このプロセスは、後続のデバッグに使用できます。
このコマンドの実行により、システムコールのすべてとその引数が含まれる JSON 形式のファイルが生成されます。このファイルはデバッグ、パフォーマンスの最適化、およびビルドシステムの自動化のために使用できます。
要するに、「bear -- make」コマンドは、プログラマがコンパイル時にコードが行うことをより良く理解し、コード内の潜在的な問題を特定するのに役立ちます。
{{< /block >}}
3. pstree - M1 を作成する#
実装のアイデア:
/proc/
ディレクトリ内のすべての数字のフォルダをスキャンします。/proc/{pid}/status
ファイルを読み取ります。- 名前と ppid を読み取ります。
- ツリーを構築し、ツリー構造を出力します。
4. 新しい os-workbench をコンパイルするには#
今日、2023 年のコードリポジトリをダウンロードしようとしましたが、ダウンロードできることに驚きました。
~~git clone https://git.nju.edu.cn/jyy/os-workbench.git~~
その後、L0 を実行しようとしましたが、うまくいきませんでした:[-Werror=array-bounds]
は配列の範囲外に関するものです。
ファイルはos-workbench/abstract-machine/am/build/x86_64-qemu/src/x86/qemu/ioe.o:433
です。
~~git pull origin L0~~
解決策は、os-workbench/abstract-machine/Makefile
のCFLAGS
の最後に-Wno-array-bounds
を追加することでした。
5. 2023 年版のコードを実行する#
昨夜、自分のローカルの L0 コードでmake run
を実行しましたが、qemu は正常に起動しましたが、画面が黒くなりました。環境は次のとおりです。
Linux archlinux 6.2.2-arch1-1
qemu 7.2
gcc 12.2.1
最終的には、Docker でビルドしてからローカルで qemu を実行するという方法を取りました(Docker ではグラフィカルなインターフェースが使用できません)。
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y build-essential git gcc-multilib qemu-system strace gdb sudo python3 libsdl2-dev libreadline-dev llvm-11
RUN useradd -ms /bin/bash user
USER user
WORKDIR /home/users
docker build -t jyyos .
# os-workbench
docker run --rm -it -v ${PWD}:/mnt -w /mnt jyyos bash
# exit docker : os-workbench/kernel
make
qemu-system-x86_64 -serial mon:stdio -machine accel=tcg -smp "" -drive format=raw,file=./build/kernel-x86_64-qemu
おそらくコンパイルに問題があったため、Docker でビルドした後、4 番目の問題は発生しませんでした。
6. AbstractMachine で画像を表示する - L0#
去年、動くゲームを作成し、キーボードの入力に応じていくつかの応答を行うものでしたが、今年は単に画像を表示するだけです。大まかなアイデアは次のとおりです。
xxd -i xxx.png > img_data.h
を実行します。- 配列を反復処理し、RGB を取得し、
draw_title
を呼び出します。 - パラメータを解析し、出力する解像度を取得し、幅と高さのスケーリングファクターを取得し、対応するピクセルを取得します。
実装に問題があるようで、左上のみが拡大されているようです。