0622
- 1. .
.
第 1 回 UNIX V6 読書会
@bobuhiro11
@bobuhiro11 () 第 1 回 UNIX V6 読書会 1 / 24
- 3. UNIX V6? (2)
実行プログラム (プロセス) の管理
メモリ管理
ファイルシステム
ファイルと周辺デバイスで共通の I/O
割り込み
端末処理サポート
@bobuhiro11 () 第 1 回 UNIX V6 読書会 3 / 24
- 6. PDP11
DEC 社が開発したプロセッサ
1 ワード 16 ビット (命令,データを 16 単位で扱う)
デバイスをメモリの上位 8K バイトに割り当て
レジスタ 用途
r0,r1 計算用,関数の戻り値
r2,r3,r4 ローカル処理
r5 フレームポインタ
r6(sp) スタックポインタ
r7(pc) プログラムカウンタ
@bobuhiro11 () 第 1 回 UNIX V6 読書会 6 / 24
- 14. K&R C 言語
/* void func(int a,int b) */
void func(a,b)
int a;
int b;
{
...
}
/* a -= 1; */
a =- 1;
@bobuhiro11 () 第 1 回 UNIX V6 読書会 14 / 24
- 15. K&R C 言語
// char 1byte
// int 2byte
// void* 2byte
#define SW 0177570
struct{
int integ;
};
p = SW ->integ;
@bobuhiro11 () 第 1 回 UNIX V6 読書会 15 / 24
- 16. fork() を使ったプログラム
int main(void){
pid_t pid = fork ();
if( pid == 0)
printf("child [pid:%d] n", getpid ());
else
printf("parent [pid:%d] n", getpid ());
return 0;
}
// $ ./ fork
// parent [pid :39582]
// child [pid :39583]
@bobuhiro11 () 第 1 回 UNIX V6 読書会 16 / 24
- 17. C library – fork()
_fork:
mov r5 ,-(sp)
mov sp ,r5
sys fork
br 1f
bec 2f
jmp cerror
1:
mov r0 ,_par_uid
clr r0
2:
mov (sp)+,r5
rts pc
@bobuhiro11 () 第 1 回 UNIX V6 読書会 17 / 24
- 18. System Call – fork()
fork ()
{
register struct proc *p1 , *p2;
p1 = u.u_procp;
for(p2 = &proc [0]; p2 < &proc[NPROC ];
p2++)
if(p2 ->p_stat == NULL)
goto found;
u.u_error = EAGAIN;
goto out;
@bobuhiro11 () 第 1 回 UNIX V6 読書会 18 / 24
- 19. System Call – fork()
found:
if(newproc ()) {
u.u_ar0[R0] = p1 ->p_pid;
u.u_cstime [0] = 0;
u.u_cstime [1] = 0;
u.u_stime = 0;
u.u_cutime [0] = 0;
u.u_cutime [1] = 0;
u.u_utime = 0;
return;
}
u.u_ar0[R0] = p2 ->p_pid;
out:
u.u_ar0[R7] =+ 2;
}
@bobuhiro11 () 第 1 回 UNIX V6 読書会 19 / 24
- 21. newproc()
newproc ()
{
int a1 , a2;
struct proc *p, *up;
register struct proc *rpp;
register *rip , n;
p = NULL;
retry:
mpid ++;
if(mpid < 0) {
mpid = 0;
goto retry;
}
for(rpp = &proc [0]; rpp < &proc[NPROC ]; rpp ++) {
if(rpp ->p_stat == NULL && p== NULL)
p = rpp;
if (rpp ->p_pid == mpid)
goto retry;
}
if ((rpp = p)== NULL)
panic("no procs");
@bobuhiro11 () 第 1 回 UNIX V6 読書会 21 / 24
- 22. newproc()
rip = u.u_procp;
up = rip;
rpp ->p_stat = SRUN;
rpp ->p_flag = SLOAD;
rpp ->p_uid = rip ->p_uid;
rpp ->p_ttyp = rip ->p_ttyp;
rpp ->p_nice = rip ->p_nice;
rpp ->p_textp = rip ->p_textp;
rpp ->p_pid = mpid;
rpp ->p_ppid = rip ->p_pid;
rpp ->p_time = 0;
for(rip = &u.u_ofile [0]; rip < &u.u_ofile[NOFILE ];)
if(( rpp = *rip ++) != NULL)
rpp ->f_count ++;
if(( rpp=up ->p_textp) != NULL) {
rpp ->x_count ++;
rpp ->x_ccount ++;
}
u.u_cdir ->i_count ++;
@bobuhiro11 () 第 1 回 UNIX V6 読書会 22 / 24
- 23. newproc()
savu(u.u_rsav);
rpp = p;
u.u_procp = rpp;
rip = up;
n = rip ->p_size;
a1 = rip ->p_addr;
rpp ->p_size = n;
a2 = malloc(coremap , n);
if(a2 == NULL) {
rip ->p_stat = SIDL;
rpp ->p_addr = a1;
savu(u.u_ssav);
xswap(rpp , 0, 0);
rpp ->p_flag =| SSWAP;
rip ->p_stat = SRUN;
} else {
rpp ->p_addr = a2;
while(n--)
copyseg(a1++, a2++);
}
u.u_procp = rip;
return (0);
}
@bobuhiro11 () 第 1 回 UNIX V6 読書会 23 / 24