From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroups: alt.os.linux
Subject: V86, echo, *P=NULL etc updates
Date: 23 Jan 92 11:25:40 GMT
Organization: University of Helsinki

Replying to questions (mostly from the mailing-list - I'm trying to move
over to alt.os.linux):

> V86-mode and DOS sessions under Linux?

Right. Seems everybody wants these, but the problem is that Linux wasn't
designed with V86-mode in mind, and the memory management makes some
assumptions that are simply incompatible with V86 tasks. The problem is
that a V86-task /has to/ be at virtual address 0-1M, and doesn't care
about the current linux protections scheme that uses segments. All right
so far: but the current kernel also lives in that space. Ooops.

This means that either (1) the mm has to be totally rewritten, (2) we
resort to ugly tricks with changing IDT's and page tables by hand, or
(3) I come up with something clever.

(1) has several problems: the current mm may not be a work of art, but
it /does/ have the good point of working, and it's extremely simple.
Changing the mm to something more like "real" unices would complicate
things. I don't feel this is a good option.

(2) The "ugly" tricks needed are so ugly I'm probably going to have
nightmares just because I thought about them. Trust me: you don't want
DOS compatability that bad.

(3) is of course optimal: the problem is that the I want:
 - the first 16 megabytes to be "identity mapped" to the physical
   memory. This is one of the reasons the mm is so simple (and there is
   no need to translate DMA addresses etc)
 - the first megabyte (+64kB) would have to be paged memory for the V86
   mode (with all the current frills: demand loading, VM etc).
And these two things don't mix very well. So I thought V86 would have to
wait.

Things aren't really that bad: I brainstormed a little, and I think I've
got the problem solved by using segments and paging at the same time to
make the first 16M /look/ identity mapped, although they aren't. It's
not even going to be very ugly: just a few hacks, that could be said to
be "interesting". I'm not promising anything, though.

> [ echo command ]

No, there is no echo for linux. Not that big a problem: use

#! /bin/sh
echo $*

or port (or write) something in C if you wish. Using a shell-script
isn't that bad: it probably doesn't use much memory, as most of the
pages get to be shared.

> I get "*P=NULL" printed on the console.

Right.  This is a debugging message: the sleep-function changed
behaviour in 0.12, and I added a few sanity checks.  This message just
means that something is sleeping/waking up without using the proper
routines: I don't know where this happens, but at least it's harmless. 
If you know something that consistently brings up this message, I can
probably track it down.  I have seen it once, and didn't notice what
caused it.

> mvdir/rename system call

As already mentioned, it doesn't exist.  Yet.  I'm coding it right now,
and it will work today on my machine (I think), and by the weekend, I
should be able to send out (minor) kernel patches to get it working for
those that want it.  I hope.

> Shared libs

Seem to work.  The kernel features are there already (even in the
released 0.12), and pmacdona an I have made some simple scripts/programs
to create shared libraries from the current unshared ones.  Small
utility programs usually shrink to half their size, but my guess is that
debugging programs using shared libs will be impossible even when we do
get a debugger.  I think the 0.13 root-image will contain the first
"real" use of shared libraries.

> Linux-0.13

I still don't know when this will be out: it depends on several things. 
Don't try to get TCP/IP, sockets and X all working in time for it - I
think it's going to be released February (mumble mumble 20?)th, and I'm
totally satisfied if it just adds the higher-level routines for VFS and
minor fixes (faster floppy, rename, one totally unnecessary panic-call
etc) and a init/login (I'll use the simple version available already if
the "real" version doesn't get implemented). 

Mail me about anything bigger you have already started on: we'll try to
work something out.

		Linus

PS. I still try to reply to all personal mail the same day I get it, but
I know I've missed some (not many though).  My mail-box grows by about
30-70 messages per day, so I definitely don't have time to go back and
check them out. Re-mail any questions/suggestions if you don't hear from
me.

From: fischer@iesd.auc.dk (Lars P. Fischer)
Newsgroups: alt.os.linux
Subject: Re: V86, echo, *P=NULL etc updates
Date: 23 Jan 92 19:18:36 GMT
Organization: Mathematics and Computer Science, University of Aalborg
In-Reply-To: torvalds@klaava.Helsinki.FI's message of 23 Jan 92 11:25:40 GMT


This is amazing. I am, for the first time ever, considering bying a
PC (yeah, right), just to run/hack Linux. Good work!

>>>>> "Linus" == Linus Benedict Torvalds (torvalds@klaava.Helsinki.FI)

> Shared libs

Linus> Seem to work.  The kernel features are there already (even in the
Linus> released 0.12), and pmacdona an I have made some simple scripts/programs
Linus> to create shared libraries from the current unshared ones.  Small
Linus> utility programs usually shrink to half their size,

Shared libs are a real advantage, and one you start having things like
X11 with HUGE libraries, shared libraries is a must. A set of 25
statically linked X11 utilities can eat your disk faster than you'd
ever imagine....

Linus>  but my guess is that debugging programs using shared libs will
Linus> be impossible even when we do get a debugger.

Yeah, debugging with shared libs can be a pain. I believe it's
important to have the option of doing a static link, just as you can
compile without optimization if need be. This would probably mean that
you need to copies of every lib - a dynamic and a static - but that's
not too bad. If works like that under SunOS (oops, Solaris-1), and
it's mostly pretty nice. The SunOS system of having shared libs with
version numbers is also a good idea -- makes it possible to update a
library withput messing up programs using the old version.


Keep up the good work!

/Lars
--
Lars Fischer, fischer@iesd.auc.dk | It takes an uncommon mind to think of
CS Dept., Aalborg Univ., DENMARK. | these things.  -- Calvin

From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroups: alt.os.linux
Subject: shared libs
Date: 23 Jan 92 19:59:46 GMT
Organization: University of Helsinki

In article < FISCHER.92Jan23191836@solsort.iesd.auc.dk> fischer@iesd.auc.dk 
(Lars P. Fischer) writes:
> Yeah, debugging with shared libs can be a pain. I believe it's
> important to have the option of doing a static link, just as you can
> compile without optimization if need be.

Yes, the shared libs are optional: change the libc.a and crt0.o files
and you can choose between shared/unshared libs. There weren't even any
changes to the compiler/linker: the shared libs are misusing the linker
a bit, but it works.

>			The SunOS system of having shared libs with
>version numbers is also a good idea -- makes it possible to update a
>library withput messing up programs using the old version.

Right.  Even this is handled "correctly" in linux: it would be even
better with hardcoded addresses in the shared lib, but that was too much
work, so we settled for version numbers.  It's going to be interesting
to see if the linux approach to shared libs even closely resembles
anything else: neither I nor pmacdona had any actual references to how
they "should" be implemented. 

		Linus

From: mb@smsc.sony.com (Michael Burg)
Newsgroups: alt.os.linux
Subject: Re: V86, echo, *P=NULL etc updates
Date: 23 Jan 92 21:00:23 GMT
Organization: Sony Microsystems Corp, San Jose, CA

In article <1992Jan23.112540.5889@klaava.Helsinki.FI> torvalds@klaava.Helsinki.FI 
(Linus Benedict Torvalds) writes:
>Replying to questions (mostly from the mailing-list - I'm trying to move
>over to alt.os.linux):
>
>> V86-mode and DOS sessions under Linux?
>
>Right. Seems everybody wants these, but the problem is that Linux wasn't
>designed with V86-mode in mind, and the memory management makes some
>assumptions that are simply incompatible with V86 tasks. The problem is
>that a V86-task /has to/ be at virtual address 0-1M, and doesn't care
>about the current linux protections scheme that uses segments. All right
>so far: but the current kernel also lives in that space. Ooops.
>

A V86-Task doesn't physically have to reside below the 1MB region. The V86
process running _thinks_ it's in the 1MB physical region with real-mode type
segments. From a memory management point of view a V86 task is basicly no
different from any other. The only major difference is that the task
might contains pages which are physically mapped to I/O devices (i.e.
video cards).  The pages within a V86 task can be swapped, relocated or
even shared.

In  commerical versions of Unix for the PC, the kernel support for V86 is
small compared to the entire package. Selected device drivers provide
additional support so devices can be shared between a V86 task and the
entire system.  The major of coding lies with the user process attempting
to simulate the BIOS, selected MS-DOS functions & various I/O ports and memory
locations. (timers, CMOS, interrupt controllers) The kernel provides support
for selected "privilage" instructions such as cli, sti, and the "duality" of
process that is containing a V86 task.  The kernel also provides a bigger time
slice for those processes which are V86 ones.

In the case of VPIX, the vpix process has a "duality" to it. Part of the
program is a normal "native" 32-bit task, the other half is a V86 task.
Switching from the native task to  the V86 task can be done with a IRET
instruction - (and with a little help from the kernel setting up the TSS
correctly). The V86 task traps back into the kernel or back to
the "native" user process depending on the instructions attempted inside
the V86 task. 

Intel has a system writer's book which contains a chapter on V86 support.


Michael Burg @ Sony Microsystems, San Jose CA      Phone: (408) 944-4032
E-Mail: mb@smsc.sony.com or ..!{uunet,mips}!sonyusa!mb

From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroups: alt.os.linux
Subject: Re: V86, echo, *P=NULL etc updates
Date: 24 Jan 92 11:37:09 GMT
Organization: University of Helsinki

In article <1992Jan23.210023.4021@smsc.sony.com> mb@smsc.sony.com (Michael Burg) 
writes:
>
>A V86-Task doesn't physically have to reside below the 1MB region.

No, but it /does/ have to be at VIRTUAL address 0.  Thus it IS a special
task: all other linux tasks are given 64M slices of the 4GB address
space, and can use segments to keep them off each others (and make them
beleive they are at address 0).  Not so a V86 task.  Other unices
haven't got this problem, as they use a flat 32-bit address space, and
change page tables when they change tasks: linux doesn't.  This has some
problems, but I'm willing to bet that linux has the simplest mm of any
unix that implementes paging/sharing/demand-loading/VM on a 386.  And
frankly, simplicity is the name of the game when you try to implement a
kernel from scratch.

I like the 386 chip (but x86, x<3 are pure sh*t, gimme 68k any day), but
there are two problems with it: write-protected pages are ignored in
kernel mode (corrected in the 486), and V86 cannot be relocated to an
arbitrary virtual address.  That's ok if you use only paging to
implement memory management, but frankly, I'd like to see something
where V86 can live /inside/ a 386-segment.  Remember: linux isn't really
unix: it's a operating system I wrote with the unix API in mind, and I
didn't do it the same way everybody else did. 

		Linus