i386.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 378 行

C,V
378
字号
head	1.7;
access;
symbols;
locks
	dls:1.7; strict;
comment	@ * @;


1.7
date	97.09.21.19.29.30;	author dls;	state Dist;
branches;
next	1.6;

1.6
date	94.05.07.19.26.36;	author dls;	state Works;
branches;
next	1.5;

1.5
date	94.05.06.03.12.23;	author dls;	state Works;
branches;
next	1.4;

1.4
date	94.05.01.16.07.01;	author dls;	state Works;
branches;
next	1.3;

1.3
date	94.05.01.03.28.12;	author dls;	state Works;
branches;
next	1.2;

1.2
date	94.04.30.04.04.37;	author dls;	state Works;
branches;
next	1.1;

1.1
date	94.04.26.15.15.20;	author dls;	state Works;
branches;
next	;


desc
@@


1.7
log
@pre-3e code
@
text
@/* i386.c - setsegs */

#include <icu.h>
#include <i386.h>
#include <kernel.h>


#define	KCODE	1
#define	KSTACK	2
#define	KDATA	3

struct sd gdt_copy[NGD] = {
		/* 0th entry NULL */
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
		/* 1st, Kernel Code Segment */
	{ 0xffff, 0, 0, 6, 1, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 },
		/* 2nd, Kernel Data Segment */
	{ 0xffff, 0, 0, 2, 0, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 },
		/* 3rd, Kernel Stack Segment */
	{ 0xffff, 0, 0, 2, 0, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 },
};

extern struct sd gdt[];
extern struct segtr gdtr;

#define	HOLESIZE	((1024-640)/4)

long	initsp;		/* initial SP for nulluser() */

extern	char	*maxaddr;

/*------------------------------------------------------------------------
 * setsegs - initialize the 386 processor
 *------------------------------------------------------------------------
 */
setsegs()
{
	extern int	start, etext;
	struct sd	*psd;
	unsigned int	np, npages;

	npages = sizmem();
	maxaddr = (char *)(npages * NBPG - 1);

	psd = &gdt_copy[1];	/* kernel code segment */
	np = ((int)&etext + NBPG-1) / NBPG;	/* # code pages */
	psd->sd_lolimit = np;
	psd->sd_hilimit = np >> 16;

	psd = &gdt_copy[2];	/* kernel data segment */
	psd->sd_lolimit = npages;
	psd->sd_hilimit = npages >> 16;

	psd = &gdt_copy[3];	/* kernel stack segment */
	psd->sd_lolimit = npages;
	psd->sd_hilimit = npages >> 16;

	blkcopy(gdt, gdt_copy, sizeof(gdt_copy));
	initsp = npages*NBPG  - 4;
}

/*------------------------------------------------------------------------
 * init8259 - initialize the 8259A interrupt controllers
 *------------------------------------------------------------------------
 */
init8259()
{
	STATWORD	PS;

	/* Master device */
	outb(ICU1, 0x11);	/* ICW1: icw4 needed		*/
	outb(ICU1+1, 0x20);	/* ICW2: base ivec 32		*/
	outb(ICU1+1, 0x4);	/* ICW3: cascade on irq2	*/
	outb(ICU1+1, 0x1);	/* ICW4: buf. master, 808x mode */
	outb(ICU1, 0xb);	/* OCW3: set ISR on read	*/

	/* Slave device */
	outb(ICU2, 0x11);	/* ICW1: icw4 needed		*/
	outb(ICU2+1, 0x28);	/* ICW2: base ivec 40		*/
	outb(ICU2+1, 0x2);	/* ICW3: slave on irq2		*/
	outb(ICU2+1, 0xb);	/* ICW4: buf. slave, 808x mode	*/
	outb(ICU2, 0xb);	/* OCW3: set ISR on read	*/

	disable(PS);
}

pseg(psd)
struct sd	*psd;
{
	int		i;
	unsigned char	*pb = (unsigned char *)psd;
	unsigned int	base;
	unsigned int	limit;

	kprintf("pseg (%X)\n", pb);
	kprintf("hex:   %02x", (unsigned int)*pb++);
	for(i=1; i<8; ++i) {
		kprintf(" (%X)", pb);
		kprintf(" %02x", (unsigned int)*pb++);
	}
	limit = ((int)psd->sd_hilimit) << 16;
	limit |= psd->sd_lolimit;
	base = ((int)psd->sd_hibase) << 24;
	base |= ((int)psd->sd_midbase)<< 16;
	base |= psd->sd_lobase;
	
	kprintf("\nby field: base %X limit %d perm %d\n", base, limit,
		psd->sd_perm);
	kprintf("iscode %d isapp %d dpl %d present %d avl %d\n",
		psd->sd_iscode, psd->sd_isapp, psd->sd_dpl, psd->sd_present,
		psd->sd_avl);
	kprintf("mbz %d 32b %d gran %d\n", psd->sd_mbz, psd->sd_32b,
		psd->sd_gran);
}
@


1.6
log
@*** empty log message ***
@
text
@d40 1
a40 1
	unsigned int	np, npages, lostk, limit;
a42 1
	kprintf("setsegs, npages %d (%d bytes)\n", npages, npages * NBPG);
d58 1
a58 1
	bcopy(gdt_copy, gdt, sizeof(gdt_copy));
@


1.5
log
@*** empty log message ***
@
text
@a60 1
kprintf("initsp %X\n", initsp);
@


1.4
log
@*** empty log message ***
@
text
@d16 1
a16 1
	{ 0xffff, 0, 0, 7, 1, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 },
d18 1
a18 1
	{ 0xffff, 0, 0, 3, 0, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 },
d20 1
a20 1
	{ 0xffff, 0, 0, 3, 0, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 },
d23 1
a23 1
extern struct sd gdt[NGD];
d40 1
a40 1
	int		np, npages, lostk, limit;
d43 2
a44 2
	kprintf("setsegs, npages %d (%d bytes)\n", npages, npages * 4096);
	maxaddr = (char *)((npages + HOLESIZE) * NBPG - 1);
d52 2
a53 3
	np = npages + HOLESIZE;
	psd->sd_lolimit = np;
	psd->sd_hilimit = np >> 16;
d56 2
a57 3
	np = npages + HOLESIZE;
	psd->sd_lolimit = np;
	psd->sd_hilimit = np >> 16;
d59 1
a59 1
	bcopy(gdt_copy, gdt, sizeof(gdt));
d61 1
a61 3
kprintf("initsp %d\n", initsp);
kprintf("new stack seg\n");
pseg(psd);
d70 2
d86 1
a86 1
	disable();
d97 6
a102 3
	kprintf("pseg\nhex:   %02x", *pb++);
	for(i=1; i<8; ++i)
		kprintf(" %02x", *pb++);
a115 8
}

pstuff(count, newsp, oldsp, newspbase, oldspbase)
int	oldsp, newsp, count;
{
	kprintf("oldspbase %d newspbase %d\n", oldspbase, newspbase);
	kprintf("oldsp %d newsp %d count %d\n", oldsp, newsp, count);
	while(1);
@


1.3
log
@sort of works; delete SS segment stuff and it works.
@
text
@d57 3
a59 8
	limit = NULLSTK + 4;
	psd->sd_lolimit = limit;
	psd->sd_hilimit = limit >> 16;
	lostk = maxaddr + 1 - limit;
	psd->sd_lobase = (unsigned short) lostk;
	psd->sd_midbase = (unsigned char) (lostk >> 16);
	psd->sd_hibase = (unsigned char) (lostk >> 24);
	psd->sd_gran = 0;
d62 4
a65 1
	initsp = limit  - 4;
@


1.2
log
@,
@
text
@d1 1
a1 1
/* i386.c - init386 */
d5 1
d17 1
a17 1
		/* 2nd, Kernel Stack Segment */
d19 1
a19 1
		/* 3rd, Kernel Data Segment */
d24 1
a24 4
extern struct {
	unsigned int	len : 16;
	unsigned int	addr : 32;
} gdtr;
d33 1
a33 1
 * init386 - initialize the 386 processor
d36 1
a36 1
init386()
d38 1
a38 1
	extern int	start, end;
d40 1
a40 1
	int		np, npages, lostk;
d43 2
a44 2
	kprintf("init386, npages %d (%d bytes)\n", npages, npages * 4096);
	kprintf("_end = %d\n", &end);
a45 1
#ifdef notyet
d47 1
a47 1
	np = ((int)&end + NBPG-1) / NBPG;	/* # code pages */
a49 3
	psd->sd_lobase = (unsigned short) &start;
	psd->sd_midbase = (unsigned char) ((int)&start >> 16);
	psd->sd_hibase = (unsigned char) ((int)&start >> 24);
d51 2
a52 2
	psd = &gdt_copy[2];	/* kernel stack segment */
	np = (NULLSTK + NBPG-1) / NBPG;
d55 6
a60 1
	lostk = npages * NBPG - NULLSTK;
d64 1
a64 1
#endif /* notyet */
d67 1
a67 20
	initsp = (npages + HOLESIZE) * NBPG - 4;
	kprintf("initsp %d\n", initsp);
	lgdt();		/* also sets SP */
	kprintf("after gdtr loaded\n");
{ int i, j;
	unsigned char *p = &gdt[0];
	for (i=0; i<NGD; ++i) {
		kprintf("%d  %02x", i, *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x", *p++);
		kprintf(" %02x\n", *p++);
	}
}
	maxaddr = (char *)((npages + HOLESIZE) * NBPG - 1);
	/* initial stack at end of memory */
	kprintf("after stack moved\n");
d91 34
@


1.1
log
@Initial revision
@
text
@d3 1
d40 3
a42 2
	extern int	end;
	int		npages;
d47 20
d88 23
a110 1
	/* set up idt */
@

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?