12. RKDA – DISK ADDRESS REGISTER
5420: rkaddr(bp)
5421: struct buf *bp;
5422: {
5423: register struct buf *p;
5424: register int b;
5425: int d, m;
5426:
5427: p = bp;
5428: b = p->b_blkno;
5431: d = p->b_dev.d_minor;
5436: return(d<<13 | (b/12)<<4 | b%12);
5437: }
2012/3/24 12
13. RKCS – CONTROL STATUS REGISTER
5092: #define IENABLE 0100 IDE
5093: #define WCOM 02 FUNCTION
5094: #define RCOM 04 FUNCION
5095: #define GO 01 GO
2012/3/24 13
14. GO - RKCS
操作する人が書き込む
Function の3ビットの機能を制御する
指定した処理が開始されるまで値はそのまま
2012/3/24 14
15. IDE - RKCS
1をセットすると完了時に220ベクタの割り込
みを発生する
2012/3/24 15
44. filsys - filsys.h
5561: struct filsys
5562: {
5563: int s_isize; /* size in blocks of I list */
5564: int s_fsize; /* size in blocks of entire volume */
5565: int s_nfree; /* number of in core free blocks (0-100) */
5567: int s_free[100]; /* in core free blocks */
5568: int s_ninode; /* number of in core I nodes (0-100) */
5569: int s_inode[100]; /* in core free I nodes */
5570: char s_flock; /* lock during free list manipulation */
5571: char s_ilock; /* lock during I list manipulation */
5572: char s_fmod; /* super block modified flag */
5573: char s_ronly; /* mounted read-only flag */
5574: int s_time[2]; /* current date of last update */
5575: int pad[50];
5576: };
2012/3/24 44
45. dir – param.h user.h
param.h
0106: #define ROOTINO 1 /* i number of all roots */
0107: #define DIRSIZ 14 /* max characters per directory
*/
user.h
0431: struct { /* current directory entry */
0432: int u_ino;
0433: char u_name[DIRSIZ];
0434: } u_dent
u_ino 14文字固定長
2012/3/24 45
53. proc – proc.h
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 */
0375:
0376: } proc[NPROC];
2012/3/24 53
54. user – user.h
0413: struct user
0414: {
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 */
0425: char *u_base; /* base address for IO */
0426: char *u_count; /* bytes remaining for IO */
0427: char *u_offset[2]; /* offset in file for IO */
0428: int *u_cdir; /* pointer to inode of current directory */
0429: char u_dbuf[DIRSIZ]; /* current pathname component */
0430: char *u_dirp; /* current pointer to inode */
0431: struct { /* current directory entry */
0432: int u_ino;
0433: char u_name[DIRSIZ];
0434: } u_dent;
0435: int *u_pdir; /* inode of parent directory of dirp */
0438: int u_ofile[NOFILE]; /* pointers to file structures of open files */
0139: #define NOFILE 15 /* max open files per process */
2012/3/24 54
55. 空間構造
PSW PC
text
data
bss
user user user user
kstack kstack kstack kstack
IOレジスタ
text text text text
data data data data
bss bss bss bss
stack stack stack stack
2012/3/24 55
65. 名前空間 – namei namei.c
7507: /* 7525:
7508: * Convert a pathname into a pointer to 7526: /*
7509: * an inode. Note that the inode is locked. 7527: * If name starts with '/' start from
7510: * 7528: * root; otherwise start from current dir.
7511: * func = function called to get next char of 7529: */
name 7530:
7512: * &uchar if name is in user space 7531: dp = u.u_cdir;
7513: * &schar if name is in system space 7532: if((c=(*func)()) == '/')
7514: * flag = 0 if name is sought 7533: dp = rootdir;
7515: * 1 if name is to be created 7534: iget(dp->i_dev, dp->i_number);
7516: * 2 if name is to be deleted 7535: while(c == '/')
7517: */ 7536: c = (*func)();
7518: namei(func, flag) 7537: if(c == '¥0' && flag != 0) {
7519: int (*func)(); 7538: u.u_error = ENOENT;
7520: { 7539: goto out;
7521: register struct inode *dp; 7540: }
7522: register c;
7523: register char *cp;
7524: int eo, *bp;
2012/3/24 65
102. incore – bio.c
4896: /* See if the block is associated with some buffer
4897: * (mainly to avoid getting hung up on a wait in breada)
4898: */
4899: incore(adev, blkno)
4900: {
4901: register int dev;
4902: register struct buf *bp;
4903: register struct devtab *dp;
4904:
4905: dev = adev;
4906: dp = bdevsw[adev.d_major].d_tab;
4907: for (bp=dp->b_forw; bp != dp; bp = bp->b_forw)
4908: if (bp->b_blkno==blkno && bp->b_dev==dev)
4909: return(bp);
4910: return(0);
4911: }
2012/3/24 102