WeSeong ログイン
← 記事一覧に戻る
CPU

CPUのアーキテクチャ、メモリのアーキテクチャ

CPUのアーキテクチャ、メモリのアーキテクチャ

Ⅰ. 概要

CPU(中央処理装置)のアーキテクチャ構造について検討します。設計方法による CISC(複雑な命令セットコンピュータ)(省略) RISC(リジューテッド・インストラクション・セット・コンピュータ)CPUアーキテクチャにおけるレジスタの概念と種類について解説します。 メモリアーキテクチャその構造について検討します。 MMU(メモリ管理ユニット)その役割と 仮想メモリプログラムの構造と動作原理について解説します。プログラムがどのように実行されるのか、そのプロセスを詳しく説明します。 デバッガーその概念と、実際に実践した内容で得られた知識について説明します。 アセンブリ言語指示と オペコード、オペランドについて話します。



Ⅱ. CPUのアーキテクチャ

  1. CPU(中央処理装置)

CPU(中央処理装置)CPUは、コンピュータにおいて、記憶、解釈、演算、制御といった重要な役割を担っています。現在学習している内容は、CPUの製造方法ではなく、その動作構造を理解し、プログラム構造をどのように把握するかという点に焦点を当てています。したがって、関連する内容に絞って説明すると、まず プログラムを記憶する概念この概念を理解する必要があります。フォン・ノイマンが考案した、プログラムを内蔵する方式が、現代のコンピュータの動作原理として広く受け入れられていると言えます。この方式では、プログラム(アプリケーション)を記憶装置(メモリ)に保存し、CPUが順番に命令を実行します。実行結果を再びメモリに記録し、次の命令を取得して実行するというサイクルを無限に繰り返すのが、Stored-program conceptです。


  1. CISC(複雑な命令セットコンピュータ)、RISC(簡略化された命令セットコンピュータ)


では、CPUは「プログラムによる計算」の概念をどのように実現するのでしょうか?大きく分けて CISC (Complex Instruction Set Computing) と RISC (Reduced Instruction Set Computing) の設計方式これは、表に示されているように、CISCアーキテクチャを指します。 複雑な命令や、長さを変えることができる命令を実行できますが、速度は遅いです。 比較的高い価格で、長期間にわたって利用できる製品です。 一般的なデスクトップPCでよく見られるのは、IntelやAMDのプロセッサです。RISCについては、 単純な命令や、固定長の命令を実行し、代わりに高速な処理が可能。比較的安価で、消費電力も少ない。 そのため、一般的にスマートフォンで使用される主要なチップには、ARM、Mips、GPUなどが含まれています。


※ プロセッサとプロセスの違いを理解しておくと役立ちます。プロセッサは、CPUやGPUのような物理的なデバイスを指しますが、プロセスは実行中のプログラム(アプリケーション)を指します。


※ CISC 方式のCPUが必要な場合、Windowsのようなオペレーティングシステムをインストールするには、MacBookはRISC方式のCPUを使用しているため、一般的な方法ではWindowsを使用することができません。


  1. 登録

先ほど、CPUは「ストアドプログラムの概念」に基づいて動作すると説明しました。したがって、CISCとRISCの設計方式によって、CPUはどのようにプログラムを保存し、命令(データ)を実行し、その結果を再び保存するのでしょうか?


それは、CPU内部にある 登録 そのためです。レジスタは、汎用的な記憶領域として機能します。 汎用レジスタ 32bit 8個わあ 16ビットのセグメントレジスタ 6個(省略) プログラムの状態と制御レジスタ (32ビット 1個)(省略) 32ビット 指示子 (1個)この構成要素で成り立っています。


① 一般用途レジスタ

汎用レジスタとして、さまざまな値を格納することができます。

汎用レジスタ

保存する値の種類

EAX

算術演算の結果、関数の戻り値

EBX

メモリのアドレスを保存し、ESI、EDIレジスタと連携可能

ECX

ループ処理において、繰り返し回数を保存し、実行する。

EDX

EAXのような用途で使用され、算術演算の補助的な役割(符号の拡張、大きな数の乗算、除算など)

ESI、EDI

データが改ざん(文字列の比較)またはコピーされる場合、ESIはソースデータのアドレス(元のデータのアドレス)、EDIは宛先アドレス(コピー後に移動される宛先アドレス)を記録します。

ESP(エスペ)

スタックの最下部、最後のメモリーアドレスが格納されている場所。

EBP

スタックの最上部、最初のアドレスが格納されている場所。

※ 後で詳しく説明しますが、スタック(Stack)はLIFO(Last In First Out:最後に入れたものが最初に出される)の構造です。データを追加する際、最後に格納され、最初に削除されます。


② セグメントレジスタ

現在実行されている命令の場所を示します。プログラムが使用しているデータの格納されているメモリのアドレスを示します。

セグメントレジスタ

保存する値の種類

カスタマーサービス

コードセグメント、コード領域の開始アドレス

SS

スタックセグメント、スタック領域の開始アドレス

DS

データセグメント:データ領域の開始アドレス

ES、FS、GS

データセグメントは、データ領域の開始アドレスですが、ESの場合は文字列、FSの場合は追加のデータ(特定の目的のデータ)、GSの場合は、さまざまなアプリケーションで使用されるデータを格納します。

③ プログラムの状態と制御レジスタ

制御レジスタ

保存する値の種類

旗を掲げる

足し算と引き算で借数を発生させた場合に、1に設定

整合フラグ (PF)

計算結果が偶数の場合は1、奇数の場合は0として設定

補助旗

16ビット演算時に、オーバーフローが発生した場合、値を1に設定

ゼロフラッグ (ZF)

計算結果が0の場合、1として設定する

サインフラッグ (SF)

計算結果が1(負の数、符号ビット)の場合、1に設定する

オーバーフローフラグ (OF)

計算結果が容量を超えた場合、1に設定

* ZF(ゼロフラグ)の場合、通常の算術演算だけでなく、文字列の比較演算も実行され、結果が一致した場合に0、不一致の場合に1と設定されます。もし0と設定された場合、結果が異なると判断できます。このレジスタを操作することで、コードの条件を変更することができます。


④ 指示のポイント

IPアドレスをネットワーク上の識別子として使用するのと同様に、プログラムが実行するコード(実行する命令)のアドレスを伝えます。32ビットの場合はEIP、64ビットの場合はRIPを使用します。


※ IPアドレスの変更により、プログラムの動作を自由に制御できます。 RCE(逆アセンブル): これは「リバースエンジニアリング」と呼ばれ、既存のプログラムのソースコードを分析し、元のコードに戻すことを指します。これは、不正アクセス(マルウェア)で使用されることがあります。


脆弱性診断 攻撃者は、コードの脆弱性を利用して、意図的にコードを変更し、バグを引き起こします。これにより、Windowsでブルースクリーンが発生したり、一般的なアプリケーションでエラーメッセージが表示されることがあります。これらの脆弱性を特定し、対策を講じるのが脆弱性診断です。


※ CPUの演算処理において ビッグエンディアンリトルエンディアンこれは重要な概念です。ビッグエンディアンは、通常、数字を記述する際に、大きい数字から小さい数字へと計算を進める方式です。一方、リトルエンディアンは、小さい数字から大きい数字へと計算を進める方式です。ビッグエンディアンは人間が理解しやすいですが、CPUは変換処理が必要なため、リトルエンディアンよりも処理速度が遅くなります。一般的には、CPUはリトルエンディアンで処理されることが多いです。



Ⅲ. メモリアーキテクチャ

  1. 記憶

CPUが動作を行う場所として一般的に認識されています。 RAM (ランダムアクセスメモリ)これを「SSD」と呼ぶと理解しても構いません。HDDに比べて高速であり、CPUと同様にフォン・ノイマンアーキテクチャを採用しています。しかし、リソースが限られているため、揮発性メモリを使用しています。以前は、シングルタスクモードでは、一つのプログラムが完了するまで他のプログラムが動作できず、プロセッサの資源を無駄にしていました。しかし、一つのCPUでも マルチタスク現在、複数のタスクを同時に処理することが可能になったのは、効率的なスケジュール管理技術のおかげです。


※ Windows で動作中のプロセスの一覧を表示するコマンド 「タスクリスト」その際に出力されるPIDは、実行するたびにランダムに変わります。


スケジュール管理によって並列処理が可能になったとのことですが、CPUとRAMは限られている中で、どのように実現しているのでしょうか?


すぐに 仮想メモリ それは、仮想メモリを利用しているからです。隣の画像のように、まず実際のメモリではなく、仮想メモリを作成します。仮想メモリでは、画像のようにA、B、Cプログラム(アプリケーション)がそれぞれメモリを一つずつ使用しているように見せかけます。では、実際のメモリはどのように利用されるのでしょうか?

以下に示す画像のように MMU(メモリ管理ユニット)その存在により、MMUは仮想メモリを実際の物理メモリにマッピングする役割を果たします。CPUがプロセスを実行する際に、メモリに アクセスするたびに、仮想メモリのアドレスを物理メモリのアドレスに変換する。そうですね。


※ 後で利用する予定ですが、実際にはRAMだけでなく、ディスクも併用されます。Windowsの場合、「設定」→「システム」→「詳細」→「詳細設定」→「詳細」の項目で、「仮想メモリ」の設定が表示されます。


では、次に実際の動作方法について説明します。一般的には、 DRAMこれは、スタック、ヒープ、コード領域、データ領域など、さまざまな値を格納する場所ですが、DRAM以外の場所も含まれます。 SRAMそのようなものがあります。 SRAM(静的ランダムアクセスメモリ)これは、固定メモリとして機能します。 DRAM(ダイナミック・ランダムアクセスメモリ)保存されている複数のプログラム(写真のA、B、C)のうち、Aプログラムが最初に実行されると仮定した場合、まずCPUのレジスタをAプログラムに割り当て、その後Bプログラムが実行される際に、元のレジスタに戻すという仕組みです。つまり、 コンテキストの切り替えSRAMは高速で高価なデバイスであるため、多くのCPUを使用することで、その高い多処理能力を発揮します。つまり、DRAMの物理メモリ上で実行されているプログラムはすべて、SRAMを通じて、複数の仮想メモリに保存され、必要に応じてSRAMが切り替えて同時に処理できる、という仕組みです。


さらに、このマルチタスク作業のために、最初に言及した スケジューリングの手法これは、関連技術の一つで、単一のプロセッサ(CPU、GPU)上で、プログラム(プロセス、アプリケーション)を交互に実行する方法です。 TDM(時間分割多重化)そのようなものがあります。


TDMは、数秒ごとにどの仮想メモリを動作させるかをランダムに決定します。仮想メモリの動作順序は変わり、実際に実行されているプログラムには物理メモリを隠します(物理メモリに割り当てられている)。そして ページこの仮想メモリ空間は、一定のサイズで独立して存在します。


もし、C言語でアプリケーションを開発する場合、 コンパイル => リンカー(目的コード .obj)=> ファイルシステム(実行ファイル、EXEなど)=> (ローダー:カーネルとメモリにアプリケーションの実行ファイルを割り当てる) 順番に動作します。



上記の画像を参照すると、理解しやすくなるでしょう。C言語は、メモリを直接管理する言語であるため、メモリ空間への割り当てや、アドレス値の配置について理解しやすいと言われています。多くのアプリケーションがC言語で開発されており、Windows用の実行ファイル(EXE)は、コンパイルとリンカーのプロセスを経て、私たちが利用する様々なアプリケーションに変換されます。実行ファイルのヘッダー部分については、後述するPEviewで説明しますが、プログラムの実行に関連する情報(モジュール、IAT、EAT、メモリなど)が含まれています。


※ C言語だけでなく、コンパイルの過程で 引っかかりこのコンパイラは、データベースとの連携、ネットワーク接続、テスト、環境変数の設定など、実行フローを制御したり、まだ実装されていない関数やハードウェアの制御が必要な場合に、自動的にコードを追加します。



Ⅳ. デバッガー

デバッグこれは、すでに馴染みのある概念ですが、「ソフトウェアのバグ」とは、コンピュータの動作に問題が生じる原因を指し、そのバグを見つけたり修正したりする作業のことです。Windowsの実行ファイルの種類の例として EXE、SCR、DLL、SYS 背があります。すべて PE (Portable Executable) 形式または構造これらは、Windows上で実行されるプログラムの構造を定義するものです。特に、EXEファイルはよく知られています。また、SCRファイルは、画面保護プログラムの実行ファイルであり、DLL(動的リンクライブラリ)としては、KERNEL32.dllなどが挙げられます。SYSファイルは、ドライバーに関連する実行ファイルと考えることができます。さらに、Windows上で実行可能なスクリプトファイルとして、BATやPS1などがあります。これらのスクリプトファイルは、コマンドの自動化に利用されることが一般的です。


※ 脆弱性診断の場合、多くはOSに依存したスクリプトを使用します。例えば、顧客のサーバーに別途プログラムをインストールすることを考えてみましょう。それは可能でしょうか? 顧客のコンピュータに無断でアクセスすることはできないため、そのようなことはできないと考えるのが妥当です。必ずしもそうではありませんが、一般的にはそうであると考えられます。


※ KERNEL32.dllは、Windowsアプリケーションのすべての関数が定義されているため、多くのアプリケーションがこのカーネルを動的に参照して利用しています。詳細については、Microsoftのウェブサイトで確認できます。

Windows カーネルモードのカーネルライブラリ - Windows ドライバー

※ SYS ドライバの実行に必要なファイルが存在するのは、Windowsはドライバに直接アクセスできないため、API(アプリケーションプログラミングインターフェース)を通じてアクセスする必要があるからです。


DLLファイルについてもう少し詳しく説明します。Windowsの実行ファイルには、 IAT(インポートアドレステーブル) EAT(エクスポートアドレステーブル)これらの機能があります。DLLは、コードの保守管理のために、複数の関数やクラスを含む小さなモジュールとして構成されています。IATとEATは、DLLファイルを参照し、モジュールの関数を実行します。実行ファイル内のIATには、どのWindows DLLファイルの関数を使用するかを整理し、EATが参照して、外部のDLLファイルの関数を呼び出して使用した後、解放します。


デバッガーには様々なツールがありますが、今回私が知ったツールは GHIDRA、Cheat Engine、HxD、OllyDbg、PEview、IDA 背格について。デバッガーツールは、ハッキングツールとしても使用できます。例えば、HxDはPEファイルを16進数で表示し、OllyDbgは、今回の実習でコードを分析する練習に役立ちました。


文字が小さすぎて見えない可能性があるかもしれませんが 赤い部分は、アセンブリ言語で記述されたプログラムコードです。そこで見ることができる場所です。 右側の黄色い部分は、レジスタ部分です。(省略) 以下の右側の紫色部分は、スタック領域です。最後に 左下の紫色部分は、メモリのダンプ その一部です。


PEviewというプログラムを利用して 'IMAGE_OPTIONAL_ヘッダー', 'SECTION .rdata'このプログラムの実行に関する様々な情報を得ることができます。まず、学習した内容をまとめると、どちらの場合も PEヘッダーこれらは「PEヘッダー」に記載されており、これには実行に必要な全般的な情報(ドライバ、DLL、メモリのアドレス情報など)が含まれています。「IMAGE_OPTIONAL_ヘッダー」で特に注目すべき点は 「入場ポイントの住所」わあ 「イメージベース」これは、「エントリポイントのアドレス」を指します。これは、実行ファイルがメモリにマッピングされた後、コードの開始位置を示します。「イメージベース」は、メモリに割り当てられた際に、基準となるアドレスを持ちます。「イメージベース」は、通常、EXEファイルの場合は0x0040000、DLLの場合は0x10000000です。したがって、これらの値を足したものが、プログラムの開始位置となります。さらに 「コードの基礎」しかし、これはコードセクション(全体のコード)の開始地点を意味します。通常、「エントリポイントのアドレス」と「コードのベース」は同じです。最後に 「データディレクトリの数」これは、データディレクトリの数を表します。「SECTION .rdata」には、上記で説明したIATの情報が含まれています。


その他、まだ試せていない機能があり、学習が必要です。


このデバッガーツールを使用して、実行ファイルを分析するために プログラミング言語これは重要な情報ですね。まずは オペコードわあ オペランドそこに存在します。OpCodeは、実際の動作を実行するための命令です。



そのような命令が存在します。オペランド(オペコード)は、どのようなデータを対象に演算を行うかを指定するもので、必ずしも存在しない場合もあります。つまり、オペランド(パラメータ)は、レジスタやメモリのアドレス、参照値など、演算の対象となるものを指すと考えられます。



おまけ

アプリケーションの理解と活用に関する最初の授業が始まりました。オンライン授業で、主に理論的な内容が中心でしたが、やはり理論的な部分は難しいと感じました。実際に1学期分の内容を短期間で学習する必要があるため、このブログ記事のために教えていただいた情報やキーワードを基に、さらに学習する必要があり、3時間以上かかったようです…😅 まだまだ理解が足りないため、もう少し頑張る必要があるかもしれません。