Path: utzoo!attcan!uunet!mcvax!hp4nl!botter!star.cs.vu.nl!...@cs.vu.nl From: a...@cs.vu.nl (Andy Tanenbaum) Newsgroups: comp.os.minix Subject: MINIX for the 386 Message-ID: <1836@ast.cs.vu.nl> Date: 20 Dec 88 14:50:13 GMT Sender: a...@cs.vu.nl Reply-To: a...@cs.vu.nl (Andy Tanenbaum) Organization: VU Informatica, Amsterdam Lines: 73 The subject of the 386 has come up several times recently. It is my understanding that 1.3 should work on most vanilla 386 boxes. However, the question remains about virtual memory, using protected mode, etc. Some thoughts on the subject. It is very unlikely that MINIX 2.0 will go native on the x86 (x=2, 3). It will be enough work just incorporating all the recent (and future) fixes, software etc. and having a go at POSIX compatibility. My goal is still to keep it simple enough for students to understand it. With respect to others who want to hack it to use paging etc., I would suggest keeping the following firmly in mined. The 386 developers are free to change everything everywhere and then distribute diffs against 1.3. However, at some point in the future, 1.3 may be considered obsolete, and people will want diffs against 2.0. The best way to make sure this is not a huge amount of work is to be conservative and change as little as possible, and make those changes as localized as possible. For example, I would suggest forgetting about mapping files into the address space as it requires major changes to the file system. Similarly, I would forget 16 of the 386's 48 address bits and just concentrate on making a virtual memory system that uses a single 32-bit segment. In effect, this simulates the 68020, and should make porting to 68020 (68030) systems straightforward. I would also suggest really making an effort to resist changing anything that doesn't really have to be changed in the name of compatibility. For example, the whole business of keeping track of memory in clicks is probably viable if you just set the click to the page size instead of 16 bytes. Files that have only a few changes should be marked #ifdef i386 in analogy with the current #ifdef i8088. Avoid using #else, since #ifdef may be any of 8088, 80386, Atari, and (eventually) Amiga. Try to put large chunks of new code as procedures in a separate file. Thus I can imagine some procedures becoming: xxx() { #ifdef i386 foobar() return; #endif ... original code ... } or something like that. If whole files have to be replaced, just replace them and change the makefile. In short, I am making a plea for making an effort to take compatibility fairly seriously, and make as few changes as possible, and make these as cleanly as possible so that they can be transferred to 2.0 when the time comes. In principle I am willing to make the 386 stuff a permanent part of the system, but only if it fits in well. The Atari FS and MM are examples of where this has happened. The changes needed for the Atari are minor, so there is one FS that is good on PC and ST, and one MM for PC and ST. This is not true of the kernel unfortunately. Looking at the 1.3 FS and MM is a worthwhile exercise. The Vrije Universiteit is going to start working on a 386 compiler soon. Whether this will fit on the 8088 is as yet unknown. We have an ANSI standard C compiler, and it definitely does not fit in the 64K + 64K model, so 2.0 will continue to use the K&R-compatible compiler now in use, at least for the 8088. The 286 has such an awful architecture that I am not inclined to cater to it at all, despite the fact that my own machine is a 286 and our department has a room full of them. Another thing: please stick to the original programming style in terms of layout, comments etc. It looks funny to have mixed styles all over the place. I posted a document on MINIX-style some time ago and can send a copy to anyone who missed it. Andy Tanenbaum (a...@cs.vu.nl)
Path: utzoo!utgpu!watmath!clyde!att!osu-cis!tut.cis.ohio-state.edu! bloom-beacon!think!ames!amdcad!sun!pitstop!sundc!seismo!uunet!munnari! otc!metro!ipso!runx!brucee From: bru...@runx.ips.oz (Bruce Evans) Newsgroups: comp.os.minix Subject: Re: Minix on 386 machines Message-ID: <1912@runx.ips.oz> Date: 27 Dec 88 05:31:22 GMT References: <5998@louie.udel.EDU> <15061@mimsy.UUCP> Reply-To: bru...@runx.OZ (Bruce Evans) Organization: RUNX Un*x Timeshare. Sydney, Australia. Lines: 67 I now have Minix working well in protected mode on the 386. The main limits are that segments are still 64K and no use is made of paging. I have some support for 32 bit executables and a 32 bit compiler to produce these (and itself) within the old limit of 64K text and 64K data. The 64K limit will eventually vanish when mpx88.s and klib88.s are rewritten and kernel/mm/fs are recompiled with 32 bit sizes. I plan to post the changes necessary for the 16 bit protected mode system sometime in January (after my RS232 stuff). These will provide increased system reliability and access to lots of memory. This should be valuable even without 32 bit sizes. The diffs may be a lot smaller than for RS232, but my kernel diffs are now 237K (counting RS232) and I'm concerned about separating what's needed. Also, there is a fair amount of 386 assembler (much easier to work with than 286) which will have to be reduced to asld's level. (Does asld even have the '&', '|' C operators? I don't think it has #if.) The system retains the ability to run unprotected and configures this way automatically for 286's and 88's (apart from *wini.c). Because of this, I haven't worried much about putting #ifdef i80386 everywhere it belongs. The cost is 5 to 10K of unused code/data on an 88, and (very) few extra decisions at run time based on the 'processor' variable. My debugger (just posted) works on the protected mode and 32 bit code by switching to real mode, limited to addresses below 1M. Apart from this, real mode is not used so the system could be made to run 286 protected mode by modifying the TSS structure and eliminating the 386 assembler code. Techical details ---------------- Users run at privilege 3 Servers 1 Interrupt handlers 0 Servers could be run at privilege 0 with less interrupt latency but the level switch gives a convenient stack frame (straight into proc table - less dangerous than on 88). I have an out of date version which does task switching. This is superficially nicer, perhaps not requiring any assembler in interrupt handlers, but what I wrote came out larger and slower (context switch 10-20% slower. Protected mode switching is already 10-20% slower). Minix centralizes the task switching, unlike the hardware. The process table has extra entries for FSREG, GSREG and all register slots are expanded to longs. The process table also holds the LDT register (constant after init) and a 2 entry LDT to hold segment descriptors for code and data. New kernel files: const386.h - addendum to const.h pm.c - mainly initialization of GDT entries and interrupt handler stubs (asm) Changed kernel files: mpx88.s - 8088 version already rewritten, new savep and restartp klib88.s - everywhere it uses physical addresses redone directly (flat 4G seg) system.c - fork and exec need to build segment descriptors. This is the main dynamic difference and is "simple". proc.c - "unnecessary" large changes supported by mpx88.s clock.c - "unnecessary" small changes supported by mpx88.s others - minor changes in const.h, proc.h, type.h, dmp.c, main.c ... Changed mm/fs/lib files: A new magic number in the exec header for 386 executables has to be fetched and passed to the kernel so the 32-bit bit can be set if required. Both mm and fs have to ask kernel about memory allocation. Bruce Evans Internet: bru...@runx.ips.oz.au UUCP: uunet!runx.ips.oz.au!brucee
Path: utzoo!utgpu!watmath!clyde!att!osu-cis!tut.cis.ohio-state.edu! bloom-beacon!think!ames!amdcad!sun!pitstop!sundc!seismo!uunet!munnari! otc!metro!ipso!runx!brucee From: bru...@runx.ips.oz (Bruce Evans) Newsgroups: comp.os.minix Subject: Re: MINIX for the 386 Message-ID: <1914@runx.ips.oz> Date: 27 Dec 88 05:39:43 GMT References: <1836@ast.cs.vu.nl> Reply-To: bru...@runx.OZ (Bruce Evans) Organization: RUNX Un*x Timeshare. Sydney, Australia. Lines: 19 I think my 386 port follows Andy's guidelines well. My diffs for mm are only 6K, and for fs only 2K, and most of this is for stuff done non-portably in the first place. I don't think we have benefited enough from the Atari port though. Changing the click size from 16 to 256 didn't quite work since there is some segment arithmetic also using the magic 16. I would like to see a summary of PC/Atari Minix kernel differences (except drivers). And are the mm/fs/commands really much the same? There seem to be a lot of old PC bugs cropping up again in the Atari postings. The Minix coding style guidelines did not reach here. Please repost them. I have some problems with the style, mainly indenting a full tab stop at a time and contortions to avoid this going off the page, and the ugliness that has crept in from not updating comments with the code (ornate comments tend to produce larger diffs than code). Also, elle with linewrap wraps at column 78, messing up the formatting. Bruce Evans Internet: bru...@runx.ips.oz.au UUCP: uunet!runx.ips.oz.au!brucee