* Called from cold start routine as
* soon as a stack and segmentation
* clear and free user core
* call all initialization routines
* fork - process 0 to schedule
* - process 1 execute bootstrap
* loop at loc 13 (0xd) in user mode -- /etc/init
proc
[0].p_addr
= firstaddr
;
proc
[0].p_flag
|= SLOAD
|SSYS
;
rootdir
= iget(rootdev
, (ino_t
)ROOTINO
);
rootdir
->i_flag
&= ~ILOCK
;
u
.u_cdir
= iget(rootdev
, (ino_t
)ROOTINO
);
u
.u_cdir
->i_flag
&= ~ILOCK
;
expand(USIZE
+ btoc(szicode
));
u
.u_dsize
= btoc(szicode
);
estabur(0, btoc(szicode
), 0, 0, RO
);
copyout((caddr_t
)icode
, (caddr_t
)0, szicode
);
* Return goes to loc. 0 of user init
* iinit is called once (from main)
* very early in initialization.
* It reads the root's super block
* and initializes the current date
* from the last modified date.
* panic: iinit -- cannot read the super
* block. Usually because of an IO error.
register struct buf
*cp
, *bp
;
register struct filsys
*fp
;
register unsigned i
, j
;
(*bdevsw
[major(rootdev
)].d_open
)(rootdev
, 1);
bp
= bread(rootdev
, SUPERB
);
bcopy(bp
->b_un
.b_addr
, cp
->b_un
.b_addr
, sizeof(struct filsys
));
mount
[0].m_dev
= rootdev
;
/* on boot, read VAX TODR register (GMT 10 ms.
* clicks into current year) and set software time
* in 'int time' (GMT seconds since year YRREF)
for (i
= 0 , j
= YRREF
; j
< YRCURR
; j
++)
i
+= (SECYR
+ (j
%4?0:SECDAY
)) ;
time
= udiv(mfpr(TODR
),100) + i
;
* This is the set of buffers proper, whose heads
* were declared in buf.h. There can exist buffer
* headers not pointing here that are used purely
* as arguments to the I/O routines to describe
* I/O to be done-- e.g. swbuf for
char buffers
[NBUF
][BSIZE
+BSLOP
];
* Initialize the buffer I/O system by freeing
* all buffers and setting all device buffer lists to empty.
bfreelist
.b_forw
= bfreelist
.b_back
=
bfreelist
.av_forw
= bfreelist
.av_back
= &bfreelist
;
bp
->b_un
.b_addr
= buffers
[i
];
bp
->b_forw
= bfreelist
.b_forw
;
bfreelist
.b_forw
->b_back
= bp
;
for (bdp
= bdevsw
; bdp
->d_open
; bdp
++) {