/* init_main.c 6.4 84/07/08 */
#include "../machine/pte.h"
#include "../h/protosw.h"
#include "../machine/reg.h"
#include "../machine/cpu.h"
extern struct user u
; /* have to declare it somewhere! */
* 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 2 to page out
* - process 1 execute bootstrap
* loop at loc 13 (0xd) in user mode -- /etc/init
* set up system process 0 (swapper)
p
->p_p0br
= u
.u_pcb
.pcb_p0br
;
setredzone(p
->p_addr
, (caddr_t
)&u
);
* This assumes that the u. area is always mapped
* to the same physical address. Otherwise must be
* handled when copying the u. area in newproc().
u
.u_nd
.ni_iov
= &u
.u_nd
.ni_iovec
;
for (i
= 1; i
< NGROUPS
; i
++)
for (i
= 0; i
< sizeof(u
.u_rlimit
)/sizeof(u
.u_rlimit
[0]); i
++)
u
.u_rlimit
[i
].rlim_cur
= u
.u_rlimit
[i
].rlim_max
=
u
.u_rlimit
[RLIMIT_STACK
].rlim_cur
= 512*1024;
u
.u_rlimit
[RLIMIT_STACK
].rlim_max
= ctob(MAXSSIZ
);
u
.u_rlimit
[RLIMIT_DATA
].rlim_max
=
u
.u_rlimit
[RLIMIT_DATA
].rlim_cur
= ctob(MAXDSIZ
);
p
->p_maxrss
= RLIM_INFINITY
/NBPG
;
p
->p_quota
= u
.u_quota
= getquota(0, 0, Q_NDQ
);
* Initialize tables, protocols, and set up well-known inodes.
cinit(); /* needed by dmc-11 driver */
* Block reception of incoming packets
* until protocols have been initialized.
fs
= mountfs(rootdev
, 0, (struct inode
*)0);
bcopy("/", fs
->fs_fsmnt
, 2);
/* kick off timeout driven events by calling first time */
/* set up the root file system */
rootdir
= iget(rootdev
, fs
, (ino_t
)ROOTINO
);
u
.u_cdir
= iget(rootdev
, fs
, (ino_t
)ROOTINO
);
* Set the scan rate and other parameters of the paging subsystem.
* make page-out daemon (process 2)
* the daemon has ctopt(nswbuf*CLSIZE*KLMAX) pages of page
* table so that it can map dirty pages into
* its address space during asychronous pushes.
proc
[0].p_szpt
= clrnd(ctopt(nswbuf
*CLSIZE
*KLMAX
+ UPAGES
));
proc
[1].p_stat
= SZOMB
; /* force it to be in proc slot 2 */
proc
[2].p_flag
|= SLOAD
|SSYS
;
proc
[2].p_dsize
= u
.u_dsize
= nswbuf
*CLSIZE
*KLMAX
;
expand(clrnd((int)btoc(szicode
)), 0);
(void) swpexpand(u
.u_dsize
, 0, &u
.u_dmap
, &u
.u_smap
);
(void) copyout((caddr_t
)icode
, (caddr_t
)0, (unsigned)szicode
);
* Return goes to loc. 0 of user init
* Initialize hash links for buffers.
register struct bufhd
*bp
;
for (bp
= bufhash
, i
= 0; i
< BUFHSZ
; i
++, bp
++)
bp
->b_forw
= bp
->b_back
= (struct buf
*)bp
;
* Initialize the buffer I/O system by freeing
* all buffers and setting all device buffer lists to empty.
register struct buf
*bp
, *dp
;
for (dp
= bfreelist
; dp
< &bfreelist
[BQUEUES
]; dp
++) {
dp
->b_forw
= dp
->b_back
= dp
->av_forw
= dp
->av_back
= dp
;
residual
= bufpages
% nbuf
;
for (i
= 0; i
< nbuf
; i
++) {
bp
->b_un
.b_addr
= buffers
+ i
* MAXBSIZE
;
bp
->b_bufsize
= (base
+ 1) * CLBYTES
;
bp
->b_bufsize
= base
* CLBYTES
;
binshash(bp
, &bfreelist
[BQ_AGE
]);
bp
->b_flags
= B_BUSY
|B_INVAL
;
* Count swap devices, and adjust total swap space available.
* Some of this space will not be available until a vswapon()
* system is issued, usually when the system goes multi-user.
for (swp
= swdevt
; swp
->sw_dev
; swp
++) {
if (swp
->sw_nblks
> nswap
)
nswap
= ((nswap
+ dmmax
- 1) / dmmax
) * dmmax
;
* Initialize linked list of free swap
* headers. These do not actually point
* to buffers, but rather to pages that
* are being swapped in and out.
register struct buf
*sp
= swbuf
;
for (i
=0; i
<nswbuf
-1; i
++, sp
++)
* Initialize clist by freeing all character blocks, then count
* number of character devices. (Once-only routine)
register struct cblock
*cp
;
ccp
= (ccp
+CROUND
) & ~CROUND
;
for(cp
=(struct cblock
*)ccp
; cp
< &cfree
[nclist
-1]; cp
++) {