[comp.os.minix] MINIX Limitations

stuart@bms-at.UUCP (05/07/87)

Well, I love and am devoted to the design of MINIX, but already I
am  itching  for  improvement.   One  thing  about  MINIX, all my
complaints are due to it's  minimal  nature,  not  to  underlying
problems.

wini.c supports big disk just fine, but fsck is not so good.   It
calls  a  low level diskio() routine with a 16-bit sector number.
I have hacked read_partition() to  compute  part_size,  tracksiz,
and  cylsiz  as well as part_offset (since my disk doesn't happen
to have 4 heads).  I hacked devio() to not add part_offset and to
check  last_sector  against part_size instead of 65536.  I hacked
diskio() to add part_offset itself.  part_offset is set to 0  for
floppies.   This allows any size disk with a partition limited to
32 Meg (just like DOS !?!).  Unfortunately, fsck now goes into  a
CPU loop when trying to check a file system.  I print out all the
values computed by read_partition(), and they are correct. I will
post the changes when they work.

sh doesn't seem to  disable  signals  for  background  processes.
Using DEL interrupts back ground compiles.

The single thread file system is the pits.  Hard disk I/O has  to
wait   for   the  floppy,  and  Control-S  stops  all  background
processing.   Since  MINIX  is  suitable  for  many  applications
besides  file-systems requiring multi-thread control, it would be
nice to have a general way to do it.  Is there a  way  to  handle
co-routines  in  'C'  without  kernel  additions?   If all thread
transfers are at the  same  level,  a  big  case  statement  will
suffice.   It  would  be  nice  to be able to suspend a (logical)
operation while in a function, however.  I am  thinking  about  a
library routine

        void split(int (*)(int),int,int)          

which will make n  stack  areas  each  with an invocation of  the
function  passed.   The   invocations   will   receive   a  small
integer  to   identify themselves.   When  all  invocations  have
returned,  the  stack  space  is  released  and split()  returns.
There  is  another  function, link(),   which   runs   the  other
invocations.  Any machine able to longjump() should be able to do
this.  Should signalling between invocations be  supported  also?
A file system would have a dispatcher loop which would restart  a
given thread depending on the message arriving.  Does this scheme
allow this?  How could C code determine stack space  requirements
in a portable manner?  

Earlier, someone suggested  using a MINIX task for  each  device.
This  would  stop  the really annoying problems.  The floppy will
still hold up the harddisk for filesystem (as opposed to  device)
calls, however.

I have read about the Mach-1 system.  It is designed  for  32-bit
systems  with  MMU's.   It  has  a  design  similar to MINIX, but
differs in what the kernel supports.  The Mach-1  kernel  handles
memory  management  as  well  as  message passing and scheduling.
MINIX handles fixed length messages and scheduling.  MINIX can do
anything  Mach-1  can,  however,  by  sending messages to special
drivers that copy and otherwise manage memory.  I like this extra
modularity,  although  it  results  in  extra messages for common
operations like file/database servers.
-- 
Stuart D. Gathman	<..!seismo!dgis!bms-at!stuart>