
そして、イベント自体でたった3日間しか過ごしませんでしたが、休暇以外の夏の準備はかなりの部分を占めました。 私の前の仕事は簡単ではありませんでした。
- 私にとっては珍しいサイト。 長い間、私はオフィスの壁や母国のMIPTの外で授業を行っていませんでした。
- 短い締め切り。 通常、私は学期または学年中にコースを読みます。 3日間で何ができますか? 私は聴衆に投げ出すことができる理論と実践的な課題の量を注意深く制限し、バランスを取らなければなりませんでした。
- 私は一般の人々の訓練のレベルについて完全に知らなかった。 同じコースの生徒と一緒に仕事をしているとき、彼らはすでに合格していると大体想像できます。 さらに、通常はインタビューします。 誰がこの学校にいるのか、そして彼らの訓練のレベルはどうなるのかは私には謎でした。 そして実際、人々は非常に異なってきました(これについては後で詳しく説明します)。
学校について
このイベントは、サンクトペテルブルク州立大学、サンクトペテルブルク州立工科大学、北極圏連邦大学にちなんで名付けられた次の組織と企業の参加を得て開催されました。 M.V. ロモノソフ(アルハンゲリスク)、オイラー財団(サンクトペテルブルク)、ニジニノヴゴロド教育および研究振興財団、Intel、EMC、JetBrains。 学校の参加者には、いくつかのレッスントラックの選択肢が提供されました。 私のトラックは4位-「ソフトウェアモデリングの基礎」でした。 さらに、IntelはXDKでトラック5に導入されました。
Intelのトラックについて
1日目と2日目は、ソフトウェアシミュレーションの理論的基礎、つまりこのテクノロジがハードウェアおよびソフトウェア開発の重要なコンポーネントである理由、 プロセッサモデルの配置方法、 周辺デバイスとの違いに一部を費やしました。
それでも、私はコース時間のほとんどを、プロセッサモデルとOpenRISC 1000アーキテクチャの周辺機器の作成に関する実際の作業に費やすことにしました。 コースを準備するにあたり、私はかなり長い間、どのモデルを書くかを決めました。 なぜこのアーキテクチャが私に選ばれたのですか?
-
100500th MIPSをもう一度作りたくはありませんでした。 - オープンで自由な仕様 。
- 多くのオプションパーツを備えたモジュール構造-最悪の場合、カーネルと1ダースの命令だけを実装しても、結果を見ることができます。 一方で、詳細のサポートをさらに深く掘り下げると、間違いなく3日以上の作業が必要になります。
- 割り込みと例外、外部デバイス、タイマー、浮動小数点演算、ベクトル命令などの重要な概念が同時に存在する仕様の単純さは、アーキテクチャを完全に非フラッシュにします。
- コミュニティサポート-誰かがOpenRISC 1000での作業を続けたい場合は、GCCおよびClangコンパイラ、Libcライブラリ、Linuxカーネル、さらにはVerilogデザインなど、既製のツールを自由に使用できます。
このように、OpenRISC 1000は私に多くの操作の余地を残しました-誰にとっても強力な仕事があります。
WindRiver®Simicsは 、モデルの作成とデバッグを行うシミュレーターおよびフレームワークとして使用されました。

コンピューターアーキテクチャまたはパフォーマンスの分野でトレーニングまたは非営利の研究を行うことを希望する学術機関の場合、50シートの無料Simicsライセンスと既製のIntel®Core™およびIntel®Atom™プロセッサーモデルを含むパッケージセットを入手できます。 ロシアのこのプログラムによると、Simicsはすでに2つの大学-モスクワ物理技術研究所と現在はPetersburg IITUに設置されています。
Simicsが選ばれたのはなぜですか?
- 私はこの製品を長い間、非常に集中的に使用してきましたが、使用するのは自然でした。
- Simicsは、コンピューティングシステムの研究とシステムソフトウェアの開発のためのさまざまなモデルとツールを作成するための、豊富で十分に文書化されたAPIを提供します。
- アカデミックユーザー向けの配信には、ソースコードを使用したデバイスの実装例が多数含まれており、既に動作しているコードで学習を開始し、コースの目的に合わせて徐々に変更することができます。 したがって、
or1k
カーネルor1k
はsample-risc
基づいて作成され、Tick-timerはsample-timer-device
に基づいていました。
誰が参加しました

14人が私のクラスに来ました。 サンクトペテルブルク州立大学、サンクトペテルブルク工科大学、TUSUR、ニジニ・ノヴゴロド(HSE NN)およびヴォルゴグラード(VolSTU)の学生もいました。 他の参加者は、大学のかなり上級の教師であることが判明しました。 最後に、Intel Labsのサンクトペテルブルク支社の数人の同僚が、「興味をそそりました」。専門家の関心によって多くの点で動機付けられました。 Intelの同僚も含めて、3日目には全員が着きましたが、非常に重要なワークショップと私の職業の間でいつも引き裂かれていました。 同時に、誰もが作成されているプラットフォームの独自の部分のプログラミングに興味がありました。
結果
3日目の終わりまでには、
or1k
カーネルの1つの一般モデル、PIC割り込みコントローラーの2つの実装、
or1k
(1つは動作し、2つ目は少し未完成のまま)タイマー、作成されたカーネル命令のユニットテスト、プラットフォームの共通スクリプト、これは次のようなものでした:

最も快適で信じられないこと-すべてのモデルを共通の構成に接続し、定期的な割り込みがカーネルに到達するか、カーネルに到達しないかを観察し、カーネルが仕様に従ってそれらを処理し、指定されたベクトルに切り替えます例外ハンドラコード。 もちろん、十分な時間はありませんでした。完全な命令セットを実装する、アドレスの公正な変換を保証する、TLBモデルを作成するなどです。 しかし、うまくいきました!
学生にとって簡単なこと
新しい学年が始まって以来、特に私はこの学年で同様の詳細なコースを実施するため、この種の実践的な仕事を理解する上で参加者がどのような困難を抱えているかを知ることは教師として興味深いものでした。 最初に、比較的簡単であることが判明したものをリストします。
- Linuxで動作します。 すべての参加者が自信を持っているわけではありませんが、仕事の不可能性について文句を言う人はいませんでした。 私が行ったように、多くの人がMidnight Commanderを使用していることに驚いた。
- 解釈の一般的な考え方。 学生の多くは、CPUでコマンドをパイプライン化する原理に精通していました。
- 心の中のビットマスクを読んでください。 驚いたことに、一部の人にとっては、定数を0xc0000000として記述する方が、(1 << 31)の形式で残すよりも簡単でした。 (1 << 30)。
- 分岐命令機能のサポート-遅延スロット。 多くのRISCプロセッサでは、新しいアドレスへの移行が発生する場合でも、分岐直後の命令が実行されます。 一部の参加者は、この(一般的にはオプションの)機能をモデル化するために大胆に駆けつけ、うまく対処しました。
- DMLコードを書く DMLは、Simicsモデルをすばやく作成するために使用される特殊な言語です。 デバイスレジスタの宣言的記述と、読み取りおよび書き込み中に発生するプロセスの命令的記述を組み合わせます。 最初は純粋なCに限定することを計画していました(ほとんど常にSimicsのモデルを作成するため)が、DMLを使用するとモデルの作成プロセスを実際に高速化できることがわかりました-Cの20行はDMLの2行に置き換えられました。 誰もが利用可能な例から彼の基本的なアイデアを学ぶことは難しくありませんでした。
困難を引き起こしたもの
一方で、一部の概念が不明であるか、参加者(および時には教師)に難易度を与えられているという事実には驚きがありました。
- Gitを使用します。 プロンプトのない1人だけが、自分の編集を一般リポジトリにプッシュできました。 それにもかかわらず、このバージョン管理システムは、最終結果で共通コードを取得するのに大いに役立ちました。
- エンディアンネス。 マルチバイトシーケンスを表すために2桁のバイトが存在することは誰もが知っているようです。 しかし、他の参加者のように、データをメモリに正しく配置したかどうか、デコードのためにバイトが抽出された順序などをすばやく推論することは非常に困難でした
- イベントキューを使用したシミュレーション。 離散イベントシミュレーション(DES)は、非同期的に発生するイベントを持つ多数のエージェントを効率的にモデリングするための重要な手法です。 タイマーモデルはイベントをアクティブに使用しました。 何らかの理由で、これは同期プロセッサモデルよりも複雑であることが判明しました。
- サインを展開する必要性。 多くのプロセッサ算術命令では、演算で使用する前に符号付きオペランドを展開する必要があります。 初期幅が8、16、または32ビットに等しくない場合があり、符号の位置とその拡張子を正しく考慮するために正しいCコードを考え出す必要がありました。
驚きに会ったもの
記憶されている純粋に技術的な瞬間。
- Linux Mint上のGDBは、デフォルトでは、デバッガーの子孫ではないプロセスへの接続を許可されていません(ptrace()を呼び出すと「Permission denied」が返されます)。 それは単に扱われます:
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
または(再起動後のデバッグを有効にする)://etc/sysctl.d/10-ptrace.conf
ファイルに0を書き込みます。 - -lオプションを指定すると、コマンドにとって危険です。-1と混同される可能性があります。
おわりに
私は次のコースの終わりに自分の後ろに繰り返し気づいたので、結果として、誰がもっと学んだか、つまり生徒か教師かを言えません。 だからここで-少し異なる環境に突入し、一方で、日常的に使用されるツールに近づいて、私はそれらについて新たに学びました。 そしてもちろん、私は多くの興味深い人々に会い、彼らに興味を持てたことを願っています。
学校の参加者全員が、最新の技術と課題解決の努力に関心を寄せてくれたこと、そして主催者に感謝します。非常に良い調整、スケジュールの明確化、イベントの技術サポートに感謝します。 そして、この投稿の読者の皆様へ-ご清聴ありがとうございました!