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

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

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

Ⅰ. 概要

まず、CPU(Central Processing Unit) Architecture の構造を見てみましょう。CISC(Complex Instruction Set Computer) と RISC(Reduced Instruction Set Computer) の設計方法の違いについて検討します。CPU Architecture Register の概念と種類について紹介します。Memory Architecture の構造を見てみましょう。MMU(Memory Management) の設計方法の違いについて検討します。 Unit)の役割と仮想メモリ(Virtual Address)の接続構造について学びます。開発したプログラムがどのように実行されるかを調べ、Debuggerの概念と実用について説明します。アセンブリ言語のコマンドと、および OpCode, Operandについて議論します。



Ⅱ. CPU アーキテクチャ

  1. CPU(Central Proccessing Unit)

CPU(Central Processing Unit)中央処理装置は、コンピュータにおいて重要な役割を果たし、メモリ、解釈、演算、制御の機能を実行します。現在勉強している内容は、 CPU重点は、操作の構造を理解することであり、それらを作成する方法やプログラム構造を解釈する方法ではありません。要約すると、まず Stored-program conceptこれを理解する必要があります。現代のすべてのコンピュータは、フォン・ノイマンが発明したプログラム指示方式で動作しているため、アプリケーションは、先ほど説明したのと同じ方法でメモリに格納されます。 CPU一度に一つの行(一つのデータ)を実行し、実行結果をメモリに書き戻す。次に、次の命令行を取得して実行します。このプロセスは無限に繰り返されます。 Stored-program conceptつまり、


  1. CISC(Complex Instruction Set Computer), RISC(Reduced Instruction Set Computer)


それから CPUは Stored-program conceptどうやってやるの? CISCと RISC 設計方法それは存在する。 CISC上の表に示すように 複雑なコマンド、可変長コマンドをサポートし、互換性が高いですが、速度は遅いです。 比較的高価であり、大量の電力を消費します。 これは多くの通常のデスクトップで見ることができます Intel, AMDあります。 RISCは 単純なコマンド、固定長の命令を実行し、比較的高速で安価であり、消費電力も少ない。 つまり、私たちがスマートフォンの主なチップと呼んでいるものは ARM, Mips, GPUあります。


プロセッサとプロセスの違いを理解することは有用です。プロセッサとは、CPUやGPUなどの物理デバイスを指し、プロセスとは実行中のプログラム(アプリケーション)を意味します。


※Windowsなどのオペレーティングシステムをインストールするには、CISCベースのCPUが必要です。しかし、MacBookはRISCベースのCPUを使用しているため、通常の方法でWindowsを使用することはできません。


  1. 登録

上記 CPUは Stored-program concept彼はそれをしていると言いました。だから CISCと RISC 設計アプローチによって異なります CPUその場合、実際にプログラムを保存し、命令(データ)を実行し、その結果を再び保存するにはどうすればよいのでしょうか。


まさに CPU の内部です。 Register そのせいです。 Register多目的な収納スペースです General Purpose Register 32ビット 8と Segment Register 16ビット 6, Program Status and Control Register 1 x 32bit, Instruction Pointer 1 x 32bitそれは次のものから構成されています


① 汎用レジスタ

汎用レジスターとして、さまざまな値を格納します。

汎用レジスタ

保存する値の種類

EAX

数学的に計算された値、関数の戻り値 (Return)

EBX

ESIは、EDIレジスタとメモリアドレスを組み合わせることができます

ECX

繰り返し処理中に反復回数(カウンタ)を保存し、実行する

EDX

EAXと組み合わせて使用され、符号拡張、大きな数の乗算、除算などの算術演算の補助として役立ちます。

ESI, EDI

データを操作(文字列比較)またはコピーする場合、ESI はソースデータのアドレス(元のデータのアドレス)を保存し、EDI はターゲットアドレス(コピー後にデータが移動されるアドレス)を保存します。

ESP

スタック (Stack)最下部の最後のアドレスが保存されています

EBP

スタック (Stack)アドレスバーの上部は、最初のアドレスが保存されている場所です。

※ 後で説明しますが、スタック (Stack) は LIFO 構造体 (Last で First Out) です。データを挿入するときに追加される最後の要素であり、削除される最初の要素です。


② セグメントレジスタ

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

セグメントレジスタ

保存する値の種類

CS

Code Segment、コード領域の開始アドレス

SS

Stack Segment、スタック領域の開始アドレス

DS

Data Segment、データ領域の開始アドレス

ES, FS, GS

Data Segment はデータ領域の開始アドレスですが、ES では文字列、FS では追加データ(特殊な目的のデータ)、GS ではさまざまなアプリケーション用に格納されています。

③ プログラム状態および制御レジスタ

コントロールレジスタ

保存する値の種類

キャリーフラグ(CF)

加算や減算でオーバーフローが発生したときに 1 に設定されます (Borrow)

パリティフラグ(PF)

演算の結果が偶数の場合は 1 に、奇数の場合は 0 に設定します

補助フラグ(AF)

16(8)ビット演算では、オーバーフローが発生したときに、1に設定されます

ゼロフラグ(ZF)

演算の結果が0(等しい場合)のときは、1に設定します

サインフラグ(SF)

演算の結果が 1 (負の値、符号ビット) の場合、それを 1 に設定します

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

操作の結果が容量を超えた場合は、1に設定します

※ Zero Flag(ZF)の場合、通常の算術比較演算ではなく文字列比較演算を実行した結果が同じ場合は、0から1に設定されます。0の場合は、結果は異なると考えることができます。このレジスターは操作してコードの条件を変更できます。


④指示ポインタ

IP Register は、サーバの識別子として機能し、実行されるコード(実行される命令)の場所を示すネットワークの IP のアドレスです。32ビットシステムでは、これは EIP で、64ビットシステムでは RIP です。


※ IP Register を変更することで、プログラムの動作を任意に制御できます。RCE(Reverse Engineering): 逆組み、またはリバースエンジニアリングとは、既存のプログラムのコードを分析し、元のソースコードに戻すことです。ハッカー(マルウェア)の手法として利用されます。


※ 脆弱性評価: 攻撃者は、コードに存在する問題(脆弱性)を悪用してバグを引き起こすことができます。Windows では、ブルースクリーンが発生し、一般的なアプリケーションでは、エラー メッセージが表示されます。脆弱性評価とは、このような事態に備える方法や、脆弱性が存在する場所についての検討です。


※ CPU 計算プロセス中 Big-endianと Little-endianそれは存在する。 Big-endian通常、数字を下位から上位へと記述するように、数字を降順に操作するプロセスです。 Little-endianその一方で、操作を低い数値から高い数値へと実行するプロセスです。 Big-endian人間の目で読むのは簡単ですが、 CPUなぜなら変換プロセスを経る必要があるからです Little-endianいつもより遅いです。 CPUは Little-endianこれは処理されたものとみなすことができます。



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

  1. メモリ

CPU作品が上演される空間は通常、 RAMそれをディスクよりも高速であると考えてください。 CPUまた、von Neumann アーキテクチャでもあります。ただし、リソースが限られているため、不安定です。過去には、 Single Tasking効率的ではありませんでした。最初のプログラムが完了するまで、他のプログラムは実行できず、プロセッサリソースが無駄になっていました。しかし、シングルスレッドでは、 CPUまた、 Multi Tasking(マルチタスク処理)今日の多タスク処理を可能にするスケジューリング技術が実現しました。


※ Windows では、実行中のプロセスの一覧を表示するコマンドは 'tasklist' です。表示される PID は、プロセスを実行するたびにランダムに生成されます。


並列計算はスケジューリングによって可能といわれていますが、CPUやRAMが限られている場合、これはどのように実現するのでしょうか。


これは仮想メモリのおかげです。隣の図のように、まず実際のメモリの代わりに仮想メモリが作成されます。この仮想メモリでは、図中のプログラム(アプリケーション)A、B、Cがそれぞれメモリの一部分を占有しているように見えます。では、物理メモリはどのように使用されているのでしょうか。

これは、下の画像に示す MMU(Memory Management Unit) の存在によるものです。 MMU は仮想メモリを実際の物理メモリにマッピングします。CPU が Access(アドレス) のメモリにアクセスするとき、仮想メモリ内のアドレス (Virtual Memory Address) を物理メモリアドレス (Physical Memory Address) にマッピングします。


※後でやるように思えるかもしれませんが、実際にはメモリはRAMだけでなくディスクでも使用されます。Windowsの場合、[設定] - [システム] - [情報] (下部) - [詳細システム設定] (中部) - [詳細] タブの [設定] - [仮想メモリ] を参照してください。


では、実際にどのように機能するかを見てみましょう。一般的に言えば、 DRAMは Stack, Heap, コード領域は、単にDRAMだけでなく、データ領域内の複数の値を格納する領域です。 SRAMそれは存在する。 SRAM(Static Random Access Memory)固定メモリです DRAM(Dynamic Random Access Memory)複数のプログラムが保存されています(上の写真を参照) A, B, C) 中間 A プログラムが最初に実行される場合、優先順位が与えられます CPUレジスタを割り当てました B プログラムが実行されているとき、既存のレジスタを置き換え、割り当てます。つまり、 スイッチ (Conetxt Switching) . SRAM は高速で高価なデバイスであるため、SRAMが高くなり、CPUではマルチタスク処理に優れたパフォーマンスが得られます。要するに、DRAMの物理メモリで実行されているプログラムはすべて(複数の仮想メモリに格納され)おり、必要なときにSRAMによって同時に実行されるように切り替えられます(マルチタスク処理)。


さらに、このマルチタスクについて、先ほども述べました スケジューリング技術これを実装するために、単一プロセッサなどの関連技術が使用されます。CPU, GPU)各プログラム(プロセス、アプリケーション)を順に実行する TDM(Time Division Multiplex)それは存在する。


TDMシステムは、数秒ごとにランダムに実行する仮想メモリを決定します。仮想メモリは順番に切り替わり、実際に実行中のプログラムから物理メモリが隠されます(物理メモリに割り当てられているとは言え)。 ページ(Page)仮想メモリのアドレス空間は、固定サイズで独立しています。


C言語でアプリケーションを開発する場合、プロセスは次のようになります:コンパイル =>リンカー (オブジェクトコード .obj)>ファイルシステム (実行可能ファイル、例えば EXE)>ローダー (アプリケーション実行可能ファイルをカーネルとメモリに割り当てる)



上の画像でご覧いただけるように、C はメモリを直接管理する言語であり、メモリの割り当てやアドレス値のマッピング方法がわかりやすいです。多くのアプリケーションが C で開発されています。 Windows 実行可能ファイル (EXE)このコンパイラとリンカーBinary - 私たちが使用するさまざまなアプリケーションは、コンピュータが機械語で実行できるプロセスを通じて作成されます。実行可能ファイルのヘッダ部分は次のようになります。 PEview先ほども述べたように、プログラム実行に関連する情報(モジュール、 IAT, EAT, メモリなどの情報が含まれています。


C は唯一の言語ではありませんが、コンパイラによってコンパイル時に追加されるコードがあります。これを Stub と呼びます。コンパイラは、データベース統合、ネットワーク接続、テスト、環境変数の設定などの実行フローの制御や、まだ実装されていない関数やハードウェアを制御する際に、このコードを自動的に追加します。



Ⅳ. デバッガ

デバッグすでにご存知かもしれませんが、コンピュータの不具合を「バグ」と呼び、そのバグを発見して修正するプロセスを「バグ追求」と言います。 Windows実行可能ファイルの種類として EXE, SCR, DLL, SYS 他にもあります。全員 PE(Portable Executable) Format(フォーマット) または Structure(構造)次の手順に従ってください。簡単です。 PE 構造 Windows実行可能ファイルは通常、構成ファイルで定義されます EXEたくさん見かけます。また、見慣れないものもあります。 SCRはスクリーンセーバーの実行可能ファイルです DLL(Dynamic Link Library)カーネルは通常KERNEL32.dll)それは存在する。 SYSこれらはドライバ関連の実行可能ファイルです。また、 Windows実行可能なスクリプト用のファイルとして BAT, PS1あります。このスクリプトファイルは、コマンド自動化コーディングで広く使用されています。


※脆弱性の検出には、多くの場合、オペレーティングシステムに依存するスクリプトを使用します。たとえば、お客様のサーバに別のプログラムをインストールすることを想定しましょう。それは可能でしょうか。もちろん、お客様のコンピュータを改ざんすることはできないので、それは不可能だと言えます。そうではない場合もありますが、一般的にはそうであると言えます。


※ KERNEL32.dll には、Windows アプリケーションインターフェイスのすべての関数の定義が含まれており、多くのアプリケーションはこのカーネルを参照しています。詳細については、Microsoft の Web サイトを参照してください。

Windows Kernel-Mode カーネルライブラリ - Windows drivers

※ SYS ドライバ実行に関連するファイルがある理由 Windowsドライバは直接アクセスできず、ドライバは APIを通じて アクセスする必要があるからです。


DLL ファイルについてもう少し詳しく説明しましょう。 Windows 実行可能ファイルには、次のものが含まれています IAT(Import Address Table)と EAT(Export Address Table)あります。コードの保守管理のために DLL機能やクラスなど、小さなサイズのモジュールで構成されています。 IATと EATこれは DLL ファイルを指し、モジュールの関数を実行します。実行可能ファイルには、 IATどのようにして Windows DLL ファイル内のどの機能を使用するかを決定した後、 EATアプリケーションの外部にある DLL ファイルの関数を参照し、呼び出しし、使用後は解放します。


Toolにはいくつかのツールがありますが、今回紹介するのはDebugger用のTool GHIDRA (gidra)、Cheat Engine、HxD、OllyDbg、PEview、IDAなどです。Debugger Toolもハックツールとして使用でき、HxDの場合はPEファイルを十六進数形式で表示し、この演習でコードを分析するにはOllyDbgを使用できます。


テキストが見えにくい場合があります。 赤い部分が組み立て部分です(Assembly) コマンドとして動作するプログラムコードここが見られる場所です。 右側の黄色の部分です Register 部分, 下の右側の紫色の部分がスタックですStack) 地域, 最後に 左下の紫色の領域がメモリダンプです これはその一部です。


PEview プログラムを使用する 'IMAGE_OPTIONAL_HEADER', 'SECTION .rdata'を通じて プログラムの実行に関する多くの情報を得ることができます。学んだことをまとめると、両方の場合、次のことが分かります。 PE Header次のように述べられています PE Header実行に関連する一般情報(ドライバー、 DLL, メモリアドレス情報などが含まれますIMAGE_OPTIONAL_HEADER'注目すべき部分は 'Address of Entry Point'と 'Image Base'そうなんです」Address of Entry Point'実行可能ファイルとは、ファイルがメモリにマッピングされた後にコード実行が開始されるメモリ内のポイントを指します。'Image Base がメモリに割り当てられると、参照値が格納されます。Image Base は通常、EXE の場合は 0x0040000、DLL の場合は 0x10000000 です。したがって、これらの二つの値の合計がプログラムの起点となります。さらに、'Base の Code' は、コードセクション(全体のコード)の起点を表します。通常、 'Address of Entry Point' と 'Base of Code' は同じです。最後に、'Number of Data Directories' は、データディレクトリの数を表します。SECTION .rdata は、前述の IAT の内容を含んでいます。


さらに、このプログラムはまだ十分に活用されておらず、さらなる研究が必要です。


そのような Debugger Toolを使用して実行可能ファイルを分析する Assembly 言語まず、知っておくのは良いことです OpCodeと Operandあります。 OpCode実際の操作に関連するコマンドです



などの指示があります。Operand (オペコード) は、オペランドとしてどのデータを操作するかを示し、存在することもなく存在しないこともあります。つまり、Operand (パラメータ - Parameter) は、操作対象となるレジスタ、メモリアドレス、または参照値と考えることができます。



レビュー

アプリケーション理解と活用コースの最初の授業が始まりました。オンライン授業なので、主に理論の授業で、理論の授業は確かに難しいです。さらに、一学期で学ぶべき内容を凝縮しなければならなかったので、このブログ記事に提供された内容とキーワードに基づいてさらに勉強しなければならず、三時間以上かかりました…🤣 まだあまり理解できていないので、もう少し頑張らなければいけませんね。