* Copyright (c) 1982, 1986, 1989 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)init_main.c 7.20 (Berkeley) %G%
extern int (*mountroot
)();
* 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
* - process 2 to page out
register struct pgrp
*pg
;
* set up system process 0 (swapper)
p
->p_p0br
= u
.u_pcb
.pcb_p0br
;
setredzone(p
->p_addr
, (caddr_t
)&u
);
MALLOC(pgrphash
[0], struct pgrp
*, sizeof (struct pgrp
),
if ((pg
= pgrphash
[0]) == NULL
)
panic("no space to craft zero'th process group");
MALLOC(pg
->pg_session
, struct session
*, sizeof (struct session
),
if (pg
->pg_session
== NULL
)
panic("no space to craft zero'th session");
pg
->pg_session
->s_count
= 1;
pg
->pg_session
->s_leader
= 0;
* These assume that the u. area is always mapped
* to the same virtual address. Otherwise must be
* handled when copying the u. area in newproc().
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
=
* configure virtual memory system,
* Initialize the file systems.
* Get vnodes for swapdev, argdev, and rootdev.
if (bdevvp(swapdev
, &swapdev_vp
) ||
bdevvp(argdev
, &argdev_vp
) ||
bdevvp(rootdev
, &rootvp
))
panic("can't setup bdevvp's");
p
->p_quota
= u
.u_quota
= getquota(0, 0, Q_NDQ
);
* Initialize tables, protocols, and set up well-known inodes.
* Block reception of incoming packets
* until protocols have been initialized.
/* kick off timeout driven events by calling first time */
/* set up the root file system */
panic("cannot mount root");
* Setup rootdir and u.u_cdir to point to it.
if (VFS_ROOT(rootfs
, &rootdir
))
panic("cannot find root vnode");
enablertclock(); /* enable realtime clock interrupts */
expand(clrnd((int)btoc(szicode
)), 0);
(void) swpexpand(u
.u_dsize
, (size_t)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
* 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
[2].p_flag
|= SLOAD
|SSYS
;
proc
[2].p_dsize
= u
.u_dsize
= nswbuf
*CLSIZE
*KLMAX
;
* 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
;
* 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
;
* Count swap devices, and adjust total swap space available.
* Some of this space will not be available until a swapon()
* 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
;
* If there are multiple swap areas,
* allow more paging operations per second.
maxpgio
= (maxpgio
* (2 * nswdev
- 1)) / 2;
if (bdevvp(swdevt
[0].sw_dev
, &swdevt
[0].sw_vp
))
printf("swfree errno %d\n", error
); /* XXX */
panic("swapinit swfree 0");
* Now set up swap buffer headers.
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
++) {