Marsの5εcur1ty備忘録

不定期的にCTF、脆弱性検証、バグバウンティレポート分析など、情報セキュリティを中心とした技術ブログを更新します。

32bit, 64bit CPUとはナニ?

こんにちは、Marsです。

 

 今日は、CPUとメモリの構造を語りつつ、32 bit CPUと64 bit CPUの意味および関係について話したいと思います。

 

 パソコンを購入する際に、CPUの隣に32bit, 64bit と書いているとみなさんは気づいているでしょう。32 bit CPU, 64 bit CPUについて大体知ってるぞ、という方もいらっしゃると思いますが、

 

 XX bit CPUのXX bitは、ずばり、一回の処理でCPUが処理できる情報量です。

 32bit CPUは、一回につき2^32の情報を処理することができ、64bit CPUは、一回につき2^64bitの情報を処理することができます。

 

 メモリの具体的な構造を解剖し、32bit CPUを例にして説明したいと思います。

 今ここで、4GBのメモリがあるとします。

Image result for ã¡ã¢ãª ã¢ãã¬ã¹

画像の参照元

http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2009/2010-02-02/index.html

 

 アドレスは、0x00000000から0xffffffffまであります。つまり、2^32個のアドレスがあります。ここでは一番下のテキスト領域に焦点を当てます。

 

 このテキスト領域は、実行するプログラム本体の機械語が入っています。機械語の例を示します。

f:id:z773733850:20181217235316p:plain

 このように、左側灰色の部分はアドレスで、右の部分はプログラム本体(機械語)です。

 これから初心者のためにこの図について説明しますが、知っている方は、適当に読み飛ばしてくださいね^^

 アドレスは左から右へ00000000,00000001,00000002,00000003のように1アドレスごとに進み、0000000Fまで行くと改行し、1行に16アドレスがあります。

 1アドレスが格納するデータの大きさは、常に1バイト(=8bit)です。つまり、2^8の情報です。機械語の部分を見ると、1桁の数字は16通りの数字を表すことができ(0~F )、つまり2^4です。1個のアドレスが格納しているデータは、図の中では2個の数字で表しています。例えば、6行目の1列目にある69(16進数)とは、メモリにあるアドレスが00000050に格納されているデータであり、2進数で表すと01101001になります。その右の73を格納しているメモリアドレスは、+1で00000051になります。
 

 メモリの説明はここまでにします。次に、CPUのレジスタを説明します。

 CPUの中には、レジスタというものがあります。パソコンは、主にCPUにあるレジスタとメモリとハードディスクの間のやりとりで動作しています。いずれも記憶装置です。

 

 メモリからレジスタにデータを渡すことはロード(Load)と言い、レジスタからメモリにデータを渡すことはストア(Store)と言います。

 

 プログラムを実行する直前に、レジスタはメモリから機械語コードをロードします。しかし、レジスタは数に限りがあり、1個のレジスタに入れるデータの大きさも限られています。

f:id:z773733850:20181218003013p:plain

 

 図のように、一回のロードは1命令(1行)だけ取り出します。ここまでは命令の内容を取り出すだけで、まだその命令を実行していません。プログラムを実行する際にも命令レジスタが使われ、大きさも変わりません。

 

 ここで本題に戻ります。32bit CPUの32bitとは何ぞや?

 

 「命令レジスタが1回につき処理できる命令の大きさである」

 

 簡単に言えば、命令レジスタ/命令の容量、またはです。

 

 処理する命令は、メモリからの読み出し命令だったり、データの読み書きだったりとして様々です。

 

 先ほど説明したメモリのテキスト領域からデータをロードする際に、32bitのCPUは32bitのデータしかレジスタにロードできず、一方、64bitのCPUは64bitのデータをレジスタにロードすることができます。

 

 先ほどの機械語の例でいうと、32bitの場合、

f:id:z773733850:20181218013516p:plain

    1個の四角で囲んだ範囲は1回の命令が扱うフィールドです。その範囲は32bitになります。

 

 64bitの場合は、データが以下のように読み出されます。

f:id:z773733850:20181218014234p:plain

  1個の四角で囲んだ範囲は64bitです。

 

 64bitのCPUのメリットは、32bitのCPUに比べて1回の命令につき処理できる情報量が多いことです。

 

 1回の処理につき、64bitのCPUは32bitのCPUより2^64/2^32=2^32=4294967296倍もの情報を処理することができます。めちゃくちゃ早いです@o@!

 

    最後に、もう一度整理しましょう。

 32bit CPUの32bitとは、

 「命令レジスタが1回につき処理できる命令の大きさである」

 

 つまり、命令レジスタ(ウツワ)が1命令(ナカミ)を実行する際に、その器の大きさが32bitということです。

 

 実際、32bitのパソコンは2018年現在ではほとんど見かけなくなっています。ほとんどの場合は64bitになりました\^o^/

 

    もし興味があれば、仮想マシンとかに32bitのOSと64bitのOSを入れて動作速度を比べてみましょう!(暇人かよ!#)

 

 あっ、補足ですが、64bitのCPUのパソコンで32bitのOSは使えますが、32bitのCPUのパソコンで64bitのOSを動作することができません!

 

 理由は簡単ですが、32bitのCPUのパソコンで64bitのOSを動作できないのは、命令レジスタの大きさが足りないからです!最大0.8mlのインクが入る万年筆に1.6mlのインクを入れたい場合を考えましょう。溢れ出て、インクがこぼれてしまいますね...

 

 64bitのCPUのパソコンは、命令レジスタが64bitで、実質下位の32bitだけ使えば32bitのOSを動かすことができます。(上位レジスタがもったいないですが。。。)

 

 読んでくれて、ありがとうございました。

Copyright Mars 2019