- x86の歴史 - corei7から64bit modeに変更された - 8086 16bit --> 8086 == z84 <- z8000 - 4004 - CPUは起動すると16bit(8086)が起動する->32->64の順で立ち上がっていく - 8086で動くものはある程度8086でも動く その変換はどこでする? EFIあたりで処理をしても良い - Segment Register と Addr Resgisterを使う - Segment Registerは CD,DS,EC,GS,SSの種類があるが、歴史的な理由でUNIXではシステム用とユーザー用の2種類しか使わない - CSはスレッドでも利用する。 rax rbx rcx rdp rip rsp これにr8~r15が追加される Logical -> Phiの変換表はTLB(キャッシュ)に入る為、キャシュの内部の処理を見ながらアクセスする Logical + offsetの加算値をTLBで比較して、一致していればアドレスを取得する用になっている CPUから外の空間にアクセスする時はメモリコントローラの命令として処理される。 データの読み込みはキャッシュのinvalidが担当、コードの書き換え(OSロード時)はキャッシュのrehashが必要となる。 TLBのクリアは特権命令, user側はTLBミスは管理していない. cache crea,pre fetchは用意されている。 [リバースページテーブル](https://www.ibm.com/developerworks/jp/linux/library/l-memmod/index.html) invarse pagetable xv6は2段のページテーブルで構築されているはず [jxxx|yyyyy| ]からそれぞれ2つページテーブルにアクセスしている デバイスドライバ/filesystemなどを読む必要があります ページテーブル ==> 単なるメモリ空間なので、ポインタ演算で実装されていた。 物理と論理で同じ区域を確保する - build build時のもの - device timer割り込み処理を計算していく - usr clock signal などのregisterを管理している - buf.h ras piが持っているファームウエアの記述 mkfs - ファイルシステム作るやつ memide - ディスコントロラーをmemoryにmappingする spinlock - multiprocessorを管理する奴 swtch.S vim