Help us understand the problem. What is going on with this article?

CPUとOSとアプリケーションの関係

More than 3 years have passed since last update.

プログラムはなぜ動くのかという本を読んだので、まとめました。

CPUについて

  • Central Processiong Unit(中央処理装置)の略
  • 内部は数百万〜数億個のトランジスタで構成されている
  • CPUは「レジスタ」「制御装置」「演算装置」「クロック」の4要素から構成されている
    • レジスタ:処理対象となる命令やデータを格納する領域。一種のメモリのようなもの
    • 制御装置:メモリ上の命令やデータをレジスタに読み出し、命令の実行結果に応じてコンピュータ全体を制御する
    • 演算装置:メモリからレジスタに読み出されたデータを演算する役目を持ちます
    • クロック:クロック信号を発生させるもの

メモリ

  • 通常メモリと呼ぶのは メインメモリ(主記憶)のこと
  • 命令やデータを格納する
  • データには、「演算に使われる値」と「メモリのアドレスを表す値」の2種類がある
  • 1バイト(= 8bit)ずつにアドレスと呼ぶ番号が付いている
  • CPUはこのアドレスを指定してメイン・メモリに格納された命令やデータを読みだしたり、逆にデータを書き込んだりする

プログラムの流れ

  1. クロック信号に合わせて制御装置がメモリから命令やデータを読みだす
  2. その命令を解釈・実行することで演算装置でデータが演算される
  3. その結果に応じて制御装置がコンピュータを動かす

レジスタの種類

  • アキュムレータ
    • 演算を行うデータ及び演算後のデータを格納する
  • フラグ・レジスタ
    • 演算処理後のCPUの状態を格納する
  • プログラムカウンタ
    • 次に実行する命令が格納されたメモリーのアドレスを格納する
  • ベースレジスタ
    • データ用のメモリー領域の先頭アドレスを格納する
  • インデックス・レジスタ
    • ベースレジスタからの相対アドレスを格納する
  • 汎用レジスタ
    • 任意のデータを格納する
  • スタックレジスタ
    • スタック領域の先頭アドレスを格納する

CPUが実行できるマシン語命令

  • データ転送命令
    • レジスタとメモリー、メモリーとメモリー、レジスタと周辺装置の間でデータを読み書きする
  • 演算命令
    • アキュムレータで算術演算、論理演算、比較演算、シフト演算を行う
  • ジャンプ命令
    • 条件分岐、繰り返し、無条件のジャンプを行う
  • コール・リターン命令
    • 関数を呼び出す・呼び出し元に戻る

2進数について

浮動小数点数

  • 小数点数を「符号」「仮数」「基数」「指数」という4つの部分に分けて表す。

メモリーについて

  • DRAM、SRAM、ROMなどの種類がある

DLL(Dynamic Link Library)

  • プログラム実行時にライブラリが動的に結合されるもの。

プログラムが動く環境

  • マシン語になっているコードを「ネイティブコード」という

プログラムを実行したときに何が起こるのか?

  • プログラムを実行するにはメモリーに読み込む必要がある
  • アプリケーションプログラムはファイルとして、ストレージに格納されている。これを実行ファイルと呼ぶ
  • OS毎に、実行ファイルの形式が定められている
  • 実行ファイルを元にメモリー何に確保されていく領域を「セクション」と呼ぶ
  • このようにして作られたメモリーの状態を「実行イメージ」と呼ぶ
  • プロセスは
    • 実行イメージ
    • 仮想メモリの状態
    • 実行中のCPU内部情報
    • カーネル側の管理情報 を含めたもの

BIOS

  • Basic Input/Output Systemの略
  • ROMに記憶され、予めコンピュータ本体に内蔵されているプログラム
  • キーボード、ディスク、グラフィックボードなどの基本制御プログラムのほか、「ブート・ストラップ・ローダー」を起動する機能を持っている

ブート・ストラップ・ローダー

  • ブート・ストラップ・ローダーは、起動ドライブの先頭領域に記憶された小さなプログラム
  • コンピュータの電源を入れると、BIOSがハードウェアの正常動作を確認し、問題なければブート・ストラップ・ローダーを起動します。
  • ブート・ストラップ・ローダーの役割は、ハードディスクなどに記録されたOSをメモリにロードして実行すること

コンパイル

  • コンパイルして生成されるのはオブジェクトファイル
  • 複数のオブジェクトファイルを結合して1つのEXEファイルを生成する処理がリンク
  • sprintf()などの関数は、ソースコードではなくライブラリファイルの形でコンパイラと一緒に提供される。このような関数を標準関数と呼ぶ

OSとアプリケーションの関係

  • モニタープログラムという、プログラムのロードと実行する機能を持つものがOSの原型
  • そこに、基本的な入出力をおkなう部分的なプログラムがモニター・プログラムに追加された。
  • OSのハードウェア制御機能は小さな関数の集合体として提供されているのが一般的。これらの関数、および関数を呼び出す行為のことをシステム・コールと呼ぶ
  • time()やprintf()の内部でシステムコールが行われている。
  • C言語などの高水準言語は、特定のOSに依存しないもので、WindowsやLinuxでも基本的に同じソースコードを使えるようにするために高水準言語では独自の関数名を使い、それがコンパイルされる時にだいとうするOSのシステム・コールに変換される
  • ネットワーク機能や、データベース機能は、OSに近い存在なので、ミドルウェアと総称されます。
  • OSとミドルウェアをまとめて、システムソフトウェアと呼ぶこともあります。
  • プラグ&プレイは、新しい装置を接続すると、すぐに使える仕組みのこと。
  • デバイスドライバはOSの一部

アセンブリ言語について

  • ネイティブコードの命令に、その機能を表す英語の略称を付けたものをニーモニックという。アセンブリ言語では、ニーモニックをつかってプログラムを記述する。

ハードウェア

  • ディスプレイに表示されている情報を常に記憶しているメモリーのことを、VRAM(Video RAM)という
  • 現在のパソコンでは、ビデオ・カードやグラフィックス・ボードと呼ばれる専用のハードウェア上に、メイン・メモリーとは独立したVRAMとGPU(Graphics Processing Unit)が装備されている

時間があるときに、もう少しわかりやすくまとめたいと思います!

hellokenta
Software Engineer at Standard Cognition inc Ex-EastMeetEast iOS, React Native, Ruby on Rails, Python https://twitter.com/hellokenta_ja
https://twitter.com/hellokenta_ja
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away