Hi Bret, Yep! You said it all much better and in far greater detail than I went into.
Thanks. :-) Jerome > On Jan 23, 2023, at 1:54 PM, Bret Johnson <bretj...@juno.com> wrote: > > >> >> by the way, the 2 programs are the setup stuff and edlin. hardly >> rocket science. > > Even those two "simple" programs would probably be considered "rocket > science", or at least akin to "learning a foreign language", by most students > who are only used to modern technology and web apps. Low-level stuff like > I/O and IRQ and BIOS emulation isn't flamboyant enough for most younger > people to get involved with these days. > > **** > >> Perhaps it could be used to solve one of the most frequent problems >> I hear. Running FreeDOS on modern UEFI hardware. > > I think that is the main point of it all. > >> As we are all well aware, this cannot be directly accomplished and >> would require an abstraction layer between the OS and the actual >> hardware. > > It actually can, at least in certain situations. The fundamental problem, at > least as I see it, is I/O. I know a lot of the talk seems to be around sound > cards, but let's discuss it in terms of something a little simpler: joysticks. > > A regular, old-fashioned joystick uses an I/O port, specifically port 201h. > There is also a BIOS function that lets you access the joystick, INT 15.84. > Over the years as computers got faster and joysticks got more complicated > (more buttons and axes), the INT 15.84 BIOS interface effectively became > useless. Modern programs that want to use a joystick almost never use INT > 15.84 and instead try to talk to I/O port 201h directly. That has caused all > kinds of problems. > > Sound cards have a similar, yet slightly different, problem. There was NEVER > a widely support BIOS-level interface for sound cards. The de facto > "standards" that everyone seemed to base their sound card designs on were Ad > Lib and Sound Blaster which were fundamentally hardware (I/O) based and > proprietary (they also used things like DMA's and IRQ's). > > Now, we're in a world where USB is pretty much the standard port for > everything plugged into the computer (certainly for joysticks and to a large > extent for sound devices). From a hardware perspective, the USB host > controllers are the only things that actually talk to the "real" I/O ports > (sometimes PIO but usually MMIO). DOS programs still expect to see the > joysticks on I/O port 201h and the sound cards at various I/O ports, but > those ports don't exist on the real hardware any more and must somehow be > virtualized. > > The problem is even worse when you're using something like DPMI. DPMI does > allow thunking down to the lower level (the DOS/16-bit "layer") for > interrupts but doesn't provide a standard way to thunk for I/O ports. Since > a way to thunk I/O isn't provided, every single DPMI-based program needs to > understand things like USB and all the different kinds of devices that can be > USB-attached. Of course, none of them understand USB and none of them thunk > the I/O, either. > > It is possible to virtualize I/O in DOS with MS EMM386 and with Quailitas' > 386MAX. JEMM also has a proprietary way to virtualize I/O with JLOAD, and I > am currently trying to add the MS/Qualitas-style capability to JEMM. But > those methods will only work with programs that don't use DPMI or that thunk > the I/O from DPMI. IOW, many old programs would need to be rewritten change > the way they do things to work properly on modern hardware without a VM. > That ain't gonna happen. > > What a Virtual Machine does is provide another level of abstraction between > the real hardware (e.g., the I/O ports associated with the USB hardware) and > the virtualized hardware (e.g., I/O port 201h that a DPMI program is > expecting to see a joystick attached to). With this extra layer of > abstraction, the DPMI program doesn't need to do the "thunking" -- it is > handled "automatically" by the abstraction layer that sits between the real > hardware (real I/O ports) and the virtualized hardware (virtualized I/O > ports). > > That hardware abstraction layer is one of the main things that Virtual > Machines provide. Of course, different VMs virtualize different hardware > devices. I think they all do mice and keyboards and disks, a lot of them do > Ethernet cards and printers, but only some of them will do things like PC > Speakers and joysticks and sound devices. > > One of the main things that Windows has done is to move the BIOS _function_ > (an abstraction layer between the hardware and the software) up into the OS > itself. In fact, Microsoft at least used to call it the "Hardware > Abstraction Layer" or HAL, but I don't know if they still call it that or > not. *nix does something similar -- they have hardware-specific drivers > (that talk to devices at the I/O level) and then have a "layer" that a > program "talks to" when it wants to send or receive data from some particular > device. The program doesn't need to know what kind of hardware port the > device is attached to. > > DOS has always expected that abstraction layer to be provided by the BIOS. > For example, if you use the BIOS INT 13h function for disk access you don't > need to know if the DISK is MFM/RLL, ESDI, SCSI, IDE/ATA, USB, or whatever. > The INT 13h abstraction layer hides all that from you. The Ethernet packet > driver interface is similar -- it provides a standard software interface that > Ethernet programs can talk to and they don't need to understand the nuances > of every different kind of Ethernet card. While the Ethernet packet driver > interface doesn't actually exist in the BIOS, it provides an abstraction > layer similar to what a BIOS would provide if there were one. My DOS USB > drivers provide a similar BIOS-level interface for the USB host controllers > (but a specific USB device, like a joystick, needs an additional layer before > a program can "see" a USB joystick). > > In modern computers the BIOS abstraction layer no longer exists -- it has > been moved up into the (modern) OS itself. From a user perspective, I think > it was a very bad mistake to let that happen but we're way too far down the > road to go back. > >> A project could be created to provide a very thin Linux based system >> (possibly using an RTOS kernel) whose only job is to manage the >> abstraction layer and implement the virtual machine to run FreeDOS. >> >> This could be done almost transparently. Booting straight to DOS >> unless the user pressed a specific key (Like F1) during boot. >> >> Pressing such a key would bring up a BIOS like interface that could >> be used to change the virtual BIOS settings and configure drivers >> and such aspects of the host OS. >> >> Their job would be to create that interface and make it all work >> seemingly. Most of the pieces required exist. But, it would not be a >> small task to implement. > > No, it wouldn't. And I think you're also assuming it would be based on some > existing Linux VM (like QEMU or KVM or something like that). Some existing > VMs provide enough of a BIOS emulation that it may be a partial solution, but > it would need to provide enough specific hardware support that I'm not > exactly sure how "thin" it could actually be. It will still need to include > all the hardware drivers for all the modern hardware that could potentially > need to be virtualized to be used by the DOS VM. One advantage would be > standardization (e.g., all sound devices could be virtualized as one of the > SoundBlaster models). > >> It could yield much better performance and more accurate emulation >> than traditional virtual machines. With todays multi-core systems, >> individual cores could be dedicated to emulating various aspects of >> PC hardware. For example, one core could be dedicated to performing >> the tasks handled by a sound card. > > In theory, yes, but probably not a place to go. Modern systems generally run > too fast to run older programs correctly (especially games). I think such a > VM would still need to accurately emulate various types and speeds of > hardware rather than just running as fast as it can all the time, similar to > what some (but not all) modern VMs do. > >> I think such a project could appeal to many. There is a lot of >> interest in playing old games. Also, since this would be a generic >> legacy PC emulation layer. It could be used to install other >> Operating Systems like MS-DOS, PC-DOS, etc. > > Or even older versions of Windows. > > **** > >> I think I actually proposed a similar idea some time ago except that >> it was *itself* the OS, rather than a stripped-down Linux distro. >> Sort-of a pre-AMD64 PC emulator, virtualizing where possible, >> emulating where not. > > I think a "thin" Linux distro has the best chance of working and also the > best chance of getting volunteers to work on. You still need all the > real-to-virtual I/O port stuff to be handled somewhere/somehow, and I think > Linux would be the best place to find existing resources that could provide > the necessary level of support. You certainly can't expect to get it from MS. > >> As for all the people saying "make FreeDOS more like Linux", they >> don't seem to understand FreeDOS *or* Linux. > > Indeed. > > **** > >> This is a very sketchy thought, but... >> >> AIUI, the way that 386 memory managers for DOS work is that they put >> the CPU into protect mode, map RAM into upper memory blocks as DOS >> wants, then start a single, non-multitasking V86 mode VM for DOS >> itself. >> >> That basic process would be enough to boot a DOS instance, wouldn't >> it? > > No, not really. Before you can run a Memory Manager you need a BIOS and an > OS to install it on. > >> "All" it needs is a memory manager that can start as a 32-bit >> process, set up a few interrupts -- INT 11 for the hard disk, for >> instance -- start a single V86 process, and then kick DOS off in >> that process. Then a stub program for DOS to load in CONFIG.SYS to >> enable the memory manager. > > No, not quite. For example, the way MS Windows worked (back before NT when > Windows was actually a DOS program) was that when Windows started it would > send a special call to EMM386 that told EMM386 to shut itself off. Windows > would transfer a little bit of information from EMM386 (but it would NOT, > e.g., transfer the I/O virtualization information) and then would handle the > EMM386 stuff 'The Windows Way". When Windows exited, it would tell EMM386 to > turn on again. Exactly how that all worked was proprietary to MS which is > why other memory managers are incompatible with Windows. Bob Smith and > Qualitas managed to work through some of those issues, but I'm not sure they > ever figured out the whole thing. I do believe 386MAX was able to work with > Windows, at least partially. BTW, this process was called GEMMIS (if you > want to try and look it up). > >> Normally, DOS starts EMM386 or JEMM386 or whatever. This way round, >> JEMM386 starts DOS. > > Nice thought, but I don't think it will work. You need much more than a > memory manager -- you really need a BIOS and an OS also. Even though I don't > particularly like Jerome's idea of a "Thin Linux" (I really would like things > to run on real hardware), it may be the most reasonable solution. > > **** > >> There could be a small image containing a thin linux host that is >> booted by system. Possibly in it’s own partition or image file. >> This host then provides an abstraction layer which then boots the >> system like it was a PC with a legacy BIOS. Most likely providing a >> some abstracted and emulated hardware like a SoundBlaster compatible >> audio card. The Client OS (FreeDOS) would be installed to a normal >> partition on the drive. >> >> Providing support to also map things like I/O ports from the host OS >> to the client, to allow the possibility of connecting real legacy >> hardware to the machine (like CNC machines and TTY devices). > > Again, I think the I/O stuff is the real point to emphasize, though I'm not > sure how effective you can be in mapping I/O ports for old hardware. You > don't even have a real ISA bus any more (at least not any ISA card slots) -- > even that is "virtualized" and only exists in the software/firmware. > > **** > > Here's maybe another way to think about it. DOS was originally written to > site "on top" of the BIOS, and the BIOS sat directly "on top" of the > hardware. In DOS you could bypass the BIOS and go directly to the hardware > if you wanted, but it was usually better to go through the BIOS (at least if > the BIOS did what you wanted it to do). The way modern hardware works, > that's not really possible any more. Now, the "BIOS" is simply an > "abstraction layer" in the OS itself. To virtualize a BIOS for DOS to use, > the OS must inject a new "translation layer" between the real hardware and > the BIOS that DOS needs to virtualize the old types of hardware (I/O ports) > that no longer exist. The way this is done on modern machines is to > completely "encircle" DOS in a Virtual Machine rather than simply providing a > "translation layer" between the BIOS and the hardware. > > For awhile, the UEFI manufacturers provided a CSM (Compatibility Support > Module) as the "translation layer" so you didn't need a VM. But they've even > stopped doing that nowadays. So, we'll either need to come up with a > "generic CSM" that doesn't need a VM but still provides the needed level of > hardware support both now and in the future, or we'll need to do some kind of > "thin VM" as Jerome is suggesting. I think the second option has a better > chance of long-term viability even though I would prefer the first. > > I also think the second would be something that might be more interesting to > Google aficionados but it is FAR from trivial. > > _______________________________________________ > Freedos-devel mailing list > Freedos-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/freedos-devel _______________________________________________ Freedos-devel mailing list Freedos-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/freedos-devel