Linuxカーネルの仮想メモリ管理(一)


Linuxカーネルの仮想メモリの管理は、プロセスをベースにしており、各プロセスには自分の空き容量があります.システム空間はすべてのプロセスで共有されています.仮想空間に対してよく使うデータ構造vm_アーアアウstructで説明します
 
struct vm_area_struct {
	struct mm_struct * vm_mm;	/* The address space we belong to. */
	unsigned long vm_start;		/* Our start address within vm_mm. */
	unsigned long vm_end;		/* The first byte after our end address
					   within vm_mm. */

	/* linked list of VM areas per task, sorted by address */
	struct vm_area_struct *vm_next;

	pgprot_t vm_page_prot;		/* Access permissions of this VMA. */
	unsigned long vm_flags;		/* Flags, listed below. */

	rb_node_t vm_rb;

	/*
	 * For areas with an address space and backing store,
	 * one of the address_space->i_mmap{,shared} lists,
	 * for shm areas, the list of attaches, otherwise unused.
	 */
	struct vm_area_struct *vm_next_share;
	struct vm_area_struct **vm_pprev_share;

	/* Function pointers to deal with this struct. */
	struct vm_operations_struct * vm_ops;

	/* Information about our backing store: */
	unsigned long vm_pgoff;		/* Offset (within vm_file) in PAGE_SIZE
					   units, *not* PAGE_CACHE_SIZE */
	struct file * vm_file;		/* File we map to (can be NULL). */
	unsigned long vm_raend;		/* XXX: put full readahead info here. */
	void * vm_private_data;		/* was vm_pte (shared mem) */
};
 そのうちvm_startとvm_endは虚存空間を決定しました.vm_page_protとvm_lagsはページのアクセス権限を表します.同じプロセスの全区間は仮想アドレスの高低順にリンクされています.vm_nextは次の区間を指して、リニアリンクを構成します.
 
区間の数が大きい時にAVLツリーを作ります.検索時間の複雑さはolog(n)です.そのうちvm_mm指向mm_struct構造は、プロセスユーザ空間の抽象であり、task_structの中に該当する針がmm_を指しています.struct
struct mm_struct {
	struct vm_area_struct * mmap;		/* list of VMAs */
	rb_root_t mm_rb;
	struct vm_area_struct * mmap_cache;	/* last find_vma result */
	pgd_t * pgd;
	atomic_t mm_users;			/* How many users with user space? */
	atomic_t mm_count;			/* How many references to "struct mm_struct" (users count as 1) */
	int map_count;				/* number of VMAs */
	struct rw_semaphore mmap_sem;
	spinlock_t page_table_lock;		/* Protects task page tables and mm->rss */

	struct list_head mmlist;		/* List of all active mm's.  These are globally strung
						 * together off init_mm.mmlist, and are protected
						 * by mmlist_lock
						 */

	unsigned long start_code, end_code, start_data, end_data;
	unsigned long start_brk, brk, start_stack;
	unsigned long arg_start, arg_end, env_start, env_end;
	unsigned long rss, total_vm, locked_vm;
	unsigned long def_flags;
	unsigned long cpu_vm_mask;
	unsigned long swap_address;

	unsigned dumpable:1;

	/* Architecture-specific MM context */
	mm_context_t context;
};
 mmapは虚存区間構造の単一線形リストを作成するために使用されます.mmapavlは虚存区間を作るAVLツリーに使用される.mmapcacheは最近使った虚存空間を指します.mm_countはキューの中(AVLツリー)にいくつかの虚存構造があると説明します.pdgは、プロセスのページディレクトリを指し、実行時には、pdgは物理アドレスに変換してレジスタCR 3に保存される.