v6read#3

13

Click here to load reader

Upload: magoroku-yamamoto

Post on 31-May-2015

1.019 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: V6read#3

オペ―レーティングシステムの読み書き#3

2011/11/7

Nagoya geekbar

Page 2: V6read#3

今回は

user構造

proc構造

Page 3: V6read#3

C言語の空間モデル

Text 命令列の格納領域

Data 非0で初期化されたデータ領域

Bss 0で初期化されたデータ領域

Stack 自動(auto)変数の格納領域

関数呼び出し時のレジスタ退避域

注)スレッドは、まだ存在しないので対象外

Page 4: V6read#3

変数の宣言と空間配置

int i; // Bss

Int j = 1; // Data

main()

{

static int k = 1; // Data

int l = 1; // Stack

int m; // Stack

:

}

Page 5: V6read#3

a.outと空間の関係

text

data

header

3076 /* read in first 8 bytes

3077 * of file for segment

3078 * sizes:

3079 * w0 = 407/410/411

3080 * w1 = text size

3081 * w2 = data size

3082 * w3 = bss size

3083 */

a.out

text

data

bss

stack

・関数を呼び出すと自動的に割り当てる。

・呼び出しからの復帰に備えてレジスタの内容を退避。

exec(2)

CPU PC

Page 6: V6read#3

割り込みが起こると……..

text

data

bss

stack

CPU PC

text

data

bss

stack

PSWのモードがカーネルモードに変わり、空間が切り替わる。割り込みの種類に応じて、ベクターテーブルの値がPCに書き込まれる

① ②

割り込みの種類に応じて、ベクターテーブルの値がPCに書き込まれる

アプリケーション カーネル

Page 7: V6read#3

struct user

空間の切り替え 1

text

data

bss

stack

CPU PC

text

data

bss

アプリケーション カーネル PSW

APR0

APR1

APR2

APR3

APR4

APR5

APR6

APR7

APR0

APR1

APR2

APR3

APR4

APR5

APR6

APR7

00: カーネルモード

11: ユーザモード

11用 00用

stack

I/Oレジスタ

Page 8: V6read#3

空間の切り替え 2

text

data

bss

stack

text

data

bss

user

IOレジスタ

text

data

bss

stack

user

text

data

bss

stack

user

text

data

bss

stack

user

text

data

bss

stack

user

savu(u.u_rsav);

retu(rp->p_addr);

Page 9: V6read#3

Unixの空間モデル

アプリとカーネルのアドレス域は分離

仮想記憶サポートで少し変わるけど、v6の時点では完全に別空間

各アプリケーションの空間は独立

カーネルの空間は

Text,Data,Bssは一部を除いて共有

Stackはアプリ毎に個別

Stackはstruct userのページの後半

Page 10: V6read#3

PPDA - Per Processor Data Area

OSを読み解く場合に最初に注目する構造

プロセスなどの実行単位毎に割り当てる領域

UNIXの場合はuserとproc

Page 11: V6read#3

struct user

0413 struct user

0414 {

0415 int u_rsav[2]; /* save r5,r6 when exchanging stacks */

0416 int u_fsav[25]; /* save fp registers */

0417 /* rsav and fsav must be first in structure */

0418 char u_segflg; /* flag for IO; user or kernel space */

0419 char u_error; /* return error code */

0420 char u_uid; /* effective user id */

0421 char u_gid; /* effective group id */

0422 char u_ruid; /* real user id */

0423 char u_rgid; /* real group id */

0424 int u_procp; /* pointer to proc structure */

Page 12: V6read#3

struct proc

0358 struct proc

0359 {

0360 char p_stat;

0361 char p_flag;

0362 char p_pri; /* priority, negative is high */

0363 char p_sig; /* signal number sent to this process */

0364 char p_uid; /* user id, used to direct tty signals */

0365 char p_time; /* resident time for scheduling */

0366 char p_cpu; /* cpu usage for scheduling */

0367 char p_nice; /* nice for scheduling */

0368 int p_ttyp; /* controlling tty */

0369 int p_pid; /* unique process id */

0370 int p_ppid; /* process id of parent */

0371 int p_addr; /* address of swappable image */

0372 int p_size; /* size of swappable image (*64 bytes) */

0373 int p_wchan; /* event process is awaiting */

0374 int *p_textp; /* pointer to text structure */

0376 } proc[NPROC];

Page 13: V6read#3

おわり