Proc structure in 4.3
Dave Grubbs
dgg at ci-dandelion.UUCP
Sat Nov 1 09:23:17 AEST 1986
A couple weeks ago, I found this in unix-wizards and couldn't believe it, so
I saved it for the day I would have time to check it out:
> Path: ci-dandelion!talcott! ... !brl-smoke!smoke!ron at BRL.ARPA
> From: ron at BRL.ARPA
> Newsgroups: net.unix-wizards
> Subject: brl-vgr Bug Report
> Date: 13 Oct 86 23:03:55 GMT
>
> Subject: Warning to those who would change proc.h
> Index: sys/h/proc.h 4.3BSD
>
> Description:
> Changing the length of the proc structure so that it is not
> double word aligned anymore will cause the system to crash
> in bizarre ways.
> Repeat-By:
> Add a word to the proc structure and then put a load on the
> system. Soon things like ps will stop working and then the
> whole machine will experience a strange trap.
> Fix:
> 1. Don't change the proc structure.
> 2. If you do, pad it out to the next double word.
>
I still don't believe it. I worked with System V for a year as a developer, I
worked on Project Athena for two years and changed all sorts of things without
showing this sort of problem. I now work on Ultrix source code, which has
been hacked even more, by DEC and by me and it works perfectly. The reason is
pretty obvious. The C compiler on all the SysV, 4.2, 4.3 and Ultrix systems I
have worked on have all aligned every field in a structure to their own size.
(i.e. longs on double word, words on word boundaries)
The proc structure starts with a (struct proc *), which means that all the
array elements (each of which is a structure) start on long word boundaries,
no matter what the structure ends with or what size the last element is.
Run the following program: Note the results.
struct a {
struct a *ap;
char ac;
};
struct b {
struct b *bp;
short bc;
};
struct c {
struct c *cp;
long cc;
};
main()
{
struct a aa[10];
struct b bb[10];
struct c cc[10];
printf ("A: Element size(%d) array size(%d)\n", sizeof(aa[0]), sizeof(aa));
printf ("B: Element size(%d) array size(%d)\n", sizeof(bb[0]), sizeof(bb));
printf ("C: Element size(%d) array size(%d)\n", sizeof(cc[0]), sizeof(cc));
}
Output:
A: Element size(8) array size(80)
B: Element size(8) array size(80)
C: Element size(8) array size(80)
Something else must be wrong with whatever you did to the proc structure.
More information about the Comp.unix.wizards
mailing list