[comp.sys.ibm.pc.misc] extended memory problem in protected mode

rbj@druhi.ATT.COM (Russell B. Jorgensen) (06/09/91)

I've been experimenting around with writing some protected mode programs
for my PC/AT (iAPX286 processor w/ 4 Mb).  But, I've run into a snag
when accessing memory over 1Mb.  Basically, both the 1st and 2nd meg of
memory seem to be physically the same, the 3rd and 4th meg of memory the
same, etc.  To prove the point to myself, I used the following subroutine --
it just writes 0, 1, 2, ... into the first location of each 64K segment,
and then prints out the value in the first location of each 64K segment.
As you can see from the output that follows, both the 1st and 2nd meg
of memory contain the values that were written into the 2nd meg, the 3rd
and 4th meg exhibit the same symptoms, etc.

The seg_alloc() routine searches the GDT for an empty slot, fills in the limit,
base_low, base_hi, and access fields, and returns a 32-bit pointer to the
base of the new segment.  The program was compiled large model.  I've
printed out the GDT to verify that seg_alloc() is working, and also verified
that the virtual addresses seg_alloc() is returning are sane.  I'm not
getting any general protection faults, so I'm 99% sure that all of my virtual
memory setup is sane.  I'd really appreciate it if somebody who has had
some experience with this would take a look at it -- I'm at my wit's end!
Thanks.

	Russ Jorgensen
	...!att!druhi!rbj
	rbj@druhi.att.com

P.S.  I run Microport SysV/AT UNIX most of the time, so I'm discounting
the possibility of a hardware problem, since UNIX is steady as a rock (ie.,
no weird crashes).

=========================  memory test subroutine =======================
extern char *seg_alloc();
unsigned int *vaddr[256];

void
tst_mem ()
{
	int i;
	unsigned long paddr;

	/* write into memory */
	paddr = 0L;
	for (i=0; i<256; i++) {
		vaddr[i] = (unsigned int *) seg_alloc (paddr, 0xffff);
		*(vaddr[i]) = i;
		paddr += 0x00010000L;
	}

	/* read from memory */
	for (i=0; i<256; i++)
		kprintf ("%4.4x ", *(vaddr[i]));
}

============================= output ==============================
0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 ffff 001b ffff ffff 484c 484c
0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 ffff 001b ffff ffff 484c 484c
0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f
0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f
0050 0051 0052 0053 0054 0055 ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
0050 0051 0052 0053 0054 0055 ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff