『Linuxオペレーティングシステム原理』第一章:ARM-Linuxオペレーティングシステムアドレス空間

3046 ワード

本文はmstar 801プラットフォームLinux 2に基づいている.6.35.11.
S 3 C 2440 Aのアドレス空間「micro 2440開発」第1章:S 3 C 2440 Aのアドレス空間、すなわちARMハードウェアのアドレス空間を分析した.比較学習として、Linuxオペレーティングシステム、すなわちソフトウェア定義のアドレス空間を見てみましょう.
               
====================================================================================================================================
一、なぜ仮想メモリ管理が必要なのか.
第一に、各プロセスに独立したアドレス空間を持たせることが、仮想メモリ管理を導入する最も主要な目的です.独立アドレス空間とは、異なるプロセスの同じVAがMMUによって異なるPAにマッピングされ、あるプロセスでどのアドレスにアクセスしても他のプロセスのデータにアクセスできないことを意味する.
第二に、各プロセスに独立した4 GBの空間を持たせ、プログラムを書くのも便利で、各プロセスにアドレス範囲を割り当てる必要はありません.
第三に、VAからPAへのマッピングの導入は、連続メモリの分周と解放にも便利です.
第四に、一つのシステムが同時に多くのプロセスを実行している場合、各プロセスに割り当てられたメモリの和は実際に使用可能な物理メモリより大きい可能性がある.仮想メモリ管理により、この場合も各プロセスが正常に動作します.各プロセスで割り当てられた仮想メモリページは、物理メモリのページボックスにマッピングしたり、ディスクに一時的に保存したりして、これらのページボックスを使用したときにディスクからメモリにロードしたりすることができます.専門用語は「ページ変更」と呼ばれています.
第五:仮想メモリ管理は物理ページのアクセス権を制御することができる.
==========================================================================Linuxカーネルはこの4 GBの空間を2つの部分に分けている:最も高い1 GB(仮想アドレス0 xC 000 0000から0 xFFFFFFFFFFFF)はカーネルに使用され、「カーネルアドレス空間」と呼ばれ、より低い3 GB(仮想アドレス0 x 0000から0 xBFFFFFFFFFFFFFFFF)はプロセスに使用され、「ユーザアドレス空間」と呼ばれている.各プロセスはシステム呼び出しによってカーネルに入ることができるため、Linuxカーネル空間はシステム内のすべてのプロセスによって共有される.これにより,各プロセスは4 GBの仮想アドレス空間(仮想メモリとも呼ばれる)を持つことができる.
いずれの時点でもARM上では1つのプロセスのみが実行されます.したがって,ARMにとって,いずれの時点でもシステム全体に4 GBの仮想アドレス空間が1つしか存在せず,この仮想アドレス空間はこのプロセス向けである.プロセスが切り替わると、仮想アドレス空間も切り替わる.
しかし、任意のアプリケーションが与える仮想アドレスは最終的に物理アドレスに変換されなければならない.したがって、仮想アドレス空間は物理メモリ空間にマッピングされなければならず、このマッピング関係はARMアーキテクチャに規定されたデータ構造によって確立される必要がある.これがセグメント記述子テーブルとページテーブルであり,Linuxは主にページテーブルによってマッピングされる.
したがって、ARM-Linuxオペレーティングシステムでは、各プロセスのページテーブルを作成します.
1.カーネル空間の仮想アドレス
カーネル空間は各仮想アドレス空間の最高1 GBを占めているが、物理メモリへのマッピングは常に最低(0 x 0000)から始まる.このように規定されているのは,カーネル空間と物理メモリとの間に簡単な線形マッピング関係を確立するためである.このうち3 GB(0 xC 000 0000)は物理アドレスとカーネル空間仮想アドレス間のシフト量であり,LinuxコードではPAGE_と呼ぶ.OFFSET.
  kernel2.6.35.11/arch/arm/Kconfig
config PAGE_OFFSET
	hex
	default 0x40000000 if VMSPLIT_1G
	default 0x80000000 if VMSPLIT_2G
	default 0xC0000000
  kernel2.6.35.11/arch/arm/include/asm/memory.h
#define PAGE_OFFSET		UL(CONFIG_PAGE_OFFSET)

また、RAMにおけるカーネルのアドレスオフセットも定められている:kernel 2.6.35.11/arch/arm/Makefile
textofs-y	:= 0x00008000
......
TEXT_OFFSET := $(textofs-y)

====================================================================================================================================
ユーザーステータスポインタとカーネルステータスポインタからカーネルアドレス空間とユーザーアドレス空間を分析しますか?
カーネル関数copy_from_userとcopy_to_userの使用はプロセスコンテキストと結合されています.ドライバでこの2つの関数を使用する場合は、システム呼び出しを実装する関数で使用する必要があります.割り込み処理を実装する関数では使用できません(割り込みにはプロセスコンテキスト切替があるため).次に、操作されたページが書き換えられる可能性があるため、この2つの関数はスリープする可能性があるため、割り込みコンテキストでは使用できません.
分析:同じプロセスコンテキストのユーザー状態とカーネル状態;カーネル状態は、ユーザ状態の仮想メモリアドレスに直接アクセスできるが、逆に、ユーザ状態の仮想アドレスが0〜3 GBに限定されているため、だめである.
したがって、プロセスコンテキスト=ユーザレベルコンテキスト+レジスタコンテキスト+システムレベルコンテキスト(メモリ管理情報);システム呼び出しは、呼び出しプロセスのプロセスコンテキストでカーネルが実行されます.