* Kernel size over 64K: what is needed, how to implement? @ 2012-02-17 18:20 Jody Bruchon 2012-02-17 22:51 ` David Given 0 siblings, 1 reply; 9+ messages in thread From: Jody Bruchon @ 2012-02-17 18:20 UTC (permalink / raw) To: ELKS Mailing List ELKS can't compile to a size over 64K (the entire kernel must be in the same code segment). ELKS will quickly expand beyond 64K simply by selecting too many features. We need to be able to grow larger than 64K, and I would like to discuss how to do this. My understanding is that bcc/ld86 doesn't deal with 8086 far pointers at all. The outline of the process as it appears to me is as follows: * Support must be added to bcc/ld86 need to be able to use far pointers. * A file format must be specified that includes relocation tables for far pointers. * A loader stub must be added to the kernel to relocate its own far pointers at boot. * After this is done, support should be added to load userland executables this way too. I'd like to know what everyone's thoughts are on this. If we do this work, we will be further tying ourselves to bcc. I am seriously considering adding a repository for dev86 to the ELKS project so that we can change the toolchain as needed with more convenience (comments on this are also welcome.) I see that there is an "ELKS format executable" but it appears that it only deals with memory allocation technicalities, so that isn't very helpful. Thoughts? Jody Bruchon ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Kernel size over 64K: what is needed, how to implement? 2012-02-17 18:20 Kernel size over 64K: what is needed, how to implement? Jody Bruchon @ 2012-02-17 22:51 ` David Given 2012-02-19 21:36 ` David Given 0 siblings, 1 reply; 9+ messages in thread From: David Given @ 2012-02-17 22:51 UTC (permalink / raw) To: ELKS Mailing List [-- Attachment #1: Type: text/plain, Size: 2334 bytes --] On 17/02/12 18:20, Jody Bruchon wrote: [...] > * Support must be added to bcc/ld86 need to be able to use far pointers. > * A file format must be specified that includes relocation tables for > far pointers. > * A loader stub must be added to the kernel to relocate its own far > pointers at boot. > * After this is done, support should be added to load userland > executables this way too. Far pointers are big, expensive and slow, and incredibly fiddly to deal with --- it's not a flat 32-bit address space; consider that 0x00010000 and 0x00000010 address the same byte of memory, and that 0x0000ffff + 1 is not 0x00010000. This means that pointer arithmetic becomes painfully non-trivial. Adding far pointer support to userland executables also completely scuppers the ability to move executables around in memory, as each one gets tied to a particular set of segments. Which means no swap! Alternative options are: (a) move chunks of stuff out of the kernel and put it into userland daemons. This means that each kernel or daemon can remain a small mode executable. This is what Minix on 8086 and 286 did, and it was very successful. This is particularly attractive for big, standalone modules like filesystems or the TCP/IP stack; but the downside is that it's rather un-Linux-like, as it will require a certain amount of kernel reengineering. (b) compromise, and use *medium* mode for the kernel. Medium mode executables use 32 bit code pointers and 16 bit data pointers. The advantage of this is that nobody does pointer arithmetic on function pointers, so all the weird pointer normalisation issues go away. But even though you can use as much code as you want, you're still limited to 64kB of combined stack/data space. Regarding C compilers --- has anyone ever tried Open Watcom? It claims to support all these weird 8086 segmentation modes, and there is a Linux version. It's also supposed to produce pretty decent code, which may well be more compact than bcc's and so save crucial kernel space. Never touched it myself, though. -- ┌─── dg@cowlark.com ───── http://www.cowlark.com ───── │ │ "Never attribute to malice what can be adequately explained by │ stupidity." --- Nick Diamos (Hanlon's Razor) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 254 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Kernel size over 64K: what is needed, how to implement? 2012-02-17 22:51 ` David Given @ 2012-02-19 21:36 ` David Given 2012-02-19 23:01 ` Kirn Gill 0 siblings, 1 reply; 9+ messages in thread From: David Given @ 2012-02-19 21:36 UTC (permalink / raw) To: ELKS Mailing List [-- Attachment #1: Type: text/plain, Size: 3250 bytes --] On 17/02/12 22:51, David Given wrote: [...] > Regarding C compilers --- has anyone ever tried Open Watcom? It claims > to support all these weird 8086 segmentation modes, and there is a Linux > version. It's also supposed to produce pretty decent code, which may > well be more compact than bcc's and so save crucial kernel space. Never > touched it myself, though. I just had a play. Apparently Open Watcom produces OMF object files, which none of myself, binutils-multiarch or file have ever heard of. Rumour has it that the Open Watcom linker is capable of being scripted --- I don't know whether this is to a useful extent. OTOH the code is definitely good. Here's a source file: int global; fnord(a, b) int a; int b; { int i = a + b; int j = global - a; global += i; return j; } (K&R C because I wanted to use the same file for Open Watcom and bcc; Open Watcom supports ANSI. It even supports some C99.) In fastcall mode, Open Watcom produces: 0000 @fnord: 0000 01 C2 add dx,ax 0002 8B 1E 00 00 mov bx,word ptr _global 0006 29 C3 sub bx,ax 0008 89 D8 mov ax,bx 000A 01 16 00 00 add word ptr _global,dx 000E C3 ret In cdecl mode, it produces: 0000 _fnord: 0000 55 push bp 0001 89 E5 mov bp,sp 0003 8B 46 04 mov ax,word ptr 0x4[bp] 0006 8B 56 06 mov dx,word ptr 0x6[bp] 0009 01 C2 add dx,ax 000B 8B 1E 00 00 mov bx,word ptr _global 000F 29 C3 sub bx,ax 0011 89 D8 mov ax,bx 0013 01 16 00 00 add word ptr _global,dx 0017 5D pop bp 0018 C2 04 00 ret 0x0004 bcc produces (and you may want to brace yourselves): _fnord: push bp mov bp,sp push di push si dec sp dec sp mov ax,4[bp] add ax,6[bp] mov -6[bp],ax dec sp dec sp mov ax,[_global] sub ax,4[bp] mov -8[bp],ax mov ax,[_global] add ax,-6[bp] mov [_global],ax mov ax,-8[bp] add sp,*4 pop si pop di pop bp ret Note that that last is without optimisation; when I try -O I get an error message about not being able to find /usr/lib/bcc/rules.start. Is optimisation supported for the 8086? Also I notice that the bcc code seems to be returning the value in ax, so I may not have got the calling conventions to match. If anyone actually wanted to use this, I suspect the easiest thing to do would be to compile with Open Watcom, disassemble the object files and use a script of some kind to convert them to gas syntax. Which would suck, but is almost certainly easier than adding OMF support to dev86. -- ┌─── dg@cowlark.com ───── http://www.cowlark.com ───── │ │ "Never attribute to malice what can be adequately explained by │ stupidity." --- Nick Diamos (Hanlon's Razor) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 254 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Kernel size over 64K: what is needed, how to implement? 2012-02-19 21:36 ` David Given @ 2012-02-19 23:01 ` Kirn Gill 2012-02-20 0:51 ` David Given 0 siblings, 1 reply; 9+ messages in thread From: Kirn Gill @ 2012-02-19 23:01 UTC (permalink / raw) To: David Given; +Cc: ELKS Mailing List Wow. Just wow. I am not keen on assembler, but I can quite well understand what is going on here. OpenWatcom cdecl is nicer for debugging because it generates a frame pointer on the stack. Fastcall makes smaller (and likely faster) code. Both blow bcc away (which I'm not even sure what all the code it's generating is doing, or much less even needed) OMF is the Object Module Format defined by Intel for the 16-bit PC OSes. It's nearly universal as a format during the 16-bit DOS, OS/2 and Windows era. Watcom still uses it for two reasons: 1.) It has support for segments, including in the OMF-386 variant. 2.) Near universal compatibility with the vast majority of 16-bit development systems for DOS, OS/2 1.x, and Win16 in existence. See http://en.wikipedia.org/wiki/Relocatable_Object_Module_Format for a basic brief. As for interpreting the format, see http://www.azillionmonkeys.com/qed/Omfg.pdf (it's worth noting that "omfg" is probably an accurate response to OMF as an object format. Especially after reading this doc.) Sent from my HTC Inspire™ 4G on AT&T On Sun, Feb 19, 2012 at 16:36, David Given <dg@cowlark.com> wrote: > On 17/02/12 22:51, David Given wrote: > [...] >> Regarding C compilers --- has anyone ever tried Open Watcom? It claims >> to support all these weird 8086 segmentation modes, and there is a Linux >> version. It's also supposed to produce pretty decent code, which may >> well be more compact than bcc's and so save crucial kernel space. Never >> touched it myself, though. > > I just had a play. Apparently Open Watcom produces OMF object files, > which none of myself, binutils-multiarch or file have ever heard of. > Rumour has it that the Open Watcom linker is capable of being scripted > --- I don't know whether this is to a useful extent. > > OTOH the code is definitely good. Here's a source file: > > int global; > > fnord(a, b) > int a; > int b; > { > int i = a + b; > int j = global - a; > global += i; > return j; > } > > (K&R C because I wanted to use the same file for Open Watcom and bcc; > Open Watcom supports ANSI. It even supports some C99.) > > In fastcall mode, Open Watcom produces: > > 0000 @fnord: > 0000 01 C2 add dx,ax > 0002 8B 1E 00 00 mov bx,word ptr _global > 0006 29 C3 sub bx,ax > 0008 89 D8 mov ax,bx > 000A 01 16 00 00 add word ptr _global,dx > 000E C3 ret > > In cdecl mode, it produces: > > 0000 _fnord: > 0000 55 push bp > 0001 89 E5 mov bp,sp > 0003 8B 46 04 mov ax,word ptr 0x4[bp] > 0006 8B 56 06 mov dx,word ptr 0x6[bp] > 0009 01 C2 add dx,ax > 000B 8B 1E 00 00 mov bx,word ptr _global > 000F 29 C3 sub bx,ax > 0011 89 D8 mov ax,bx > 0013 01 16 00 00 add word ptr _global,dx > 0017 5D pop bp > 0018 C2 04 00 ret 0x0004 > > bcc produces (and you may want to brace yourselves): > > _fnord: > push bp > mov bp,sp > push di > push si > dec sp > dec sp > mov ax,4[bp] > add ax,6[bp] > mov -6[bp],ax > dec sp > dec sp > mov ax,[_global] > sub ax,4[bp] > mov -8[bp],ax > mov ax,[_global] > add ax,-6[bp] > mov [_global],ax > mov ax,-8[bp] > add sp,*4 > pop si > pop di > pop bp > ret > > Note that that last is without optimisation; when I try -O I get an > error message about not being able to find /usr/lib/bcc/rules.start. Is > optimisation supported for the 8086? Also I notice that the bcc code > seems to be returning the value in ax, so I may not have got the calling > conventions to match. > > If anyone actually wanted to use this, I suspect the easiest thing to do > would be to compile with Open Watcom, disassemble the object files and > use a script of some kind to convert them to gas syntax. Which would > suck, but is almost certainly easier than adding OMF support to dev86. > > -- > ┌─── dg@cowlark.com ───── http://www.cowlark.com ───── > │ > │ "Never attribute to malice what can be adequately explained by > │ stupidity." --- Nick Diamos (Hanlon's Razor) > -- To unsubscribe from this list: send the line "unsubscribe linux-8086" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Kernel size over 64K: what is needed, how to implement? 2012-02-19 23:01 ` Kirn Gill @ 2012-02-20 0:51 ` David Given 2012-02-20 13:13 ` Alan Carvalho de Assis 0 siblings, 1 reply; 9+ messages in thread From: David Given @ 2012-02-20 0:51 UTC (permalink / raw) To: ELKS Mailing List [-- Attachment #1: Type: text/plain, Size: 1999 bytes --] On 19/02/12 23:01, Kirn Gill wrote: > Wow. Just wow. I am not keen on assembler, but I can quite well > understand what is going on here. OpenWatcom cdecl is nicer for > debugging because it generates a frame pointer on the stack. Fastcall > makes smaller (and likely faster) code. Both blow bcc away (which I'm > not even sure what all the code it's generating is doing, or much less > even needed) Well, bcc *is* a tiny compiler intended to run natively on 16-bit platforms, and Open Watcom is an 900kB behemoth... and even that's tiny compared to llvm. I'm not surprised bcc makes poor code. (Hey, look, there's an Open Watcom 16-bit C++ compiler! That'll be, um, useful.) > OMF is the Object Module Format defined by Intel for the 16-bit PC > OSes. It's nearly universal as a format during the 16-bit DOS, OS/2 > and Windows era. Watcom still uses it for two reasons: 1.) It has > support for segments, including in the OMF-386 variant. 2.) Near > universal compatibility with the vast majority of 16-bit development > systems for DOS, OS/2 1.x, and Win16 in existence. Yes, I figured that out eventually. I did find one guy who has some OMF patches for binutils: http://bpj-code.blogspot.com/2011/09/omf-support-for-binutils.html ...but it's not complete and he doesn't say which version of binutils it's for. TBH, the easiest approach to using Open Watcom would probably be to retool entirely for it: produce ELKS executables and a kernel image directly from their linker. At least ELKS doesn't have any shared library horrors to deal with, which means that the output files are fairly simple. No idea whether it's actually possible, though. PS. No need to cc me on replies --- I am a list subscriber! -- ┌─── dg@cowlark.com ───── http://www.cowlark.com ───── │ │ "Never attribute to malice what can be adequately explained by │ stupidity." --- Nick Diamos (Hanlon's Razor) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 254 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Kernel size over 64K: what is needed, how to implement? 2012-02-20 0:51 ` David Given @ 2012-02-20 13:13 ` Alan Carvalho de Assis 2012-02-21 18:24 ` Juan Perez-Sanchez [not found] ` <FC79A7424F669341A72EFA787A3C767541F8ECD7@exchdb1-vm-srv.infopulse.local> 0 siblings, 2 replies; 9+ messages in thread From: Alan Carvalho de Assis @ 2012-02-20 13:13 UTC (permalink / raw) To: ELKS Mailing List Hi David On 2/19/12, David Given <dg@cowlark.com> wrote: > Yes, I figured that out eventually. I did find one guy who has some OMF > patches for binutils: > > http://bpj-code.blogspot.com/2011/09/omf-support-for-binutils.html > > ...but it's not complete and he doesn't say which version of binutils > it's for. > Nice finding. > TBH, the easiest approach to using Open Watcom would probably be to > retool entirely for it: produce ELKS executables and a kernel image > directly from their linker. At least ELKS doesn't have any shared > library horrors to deal with, which means that the output files are > fairly simple. No idea whether it's actually possible, though. > I think Open Watcom is a good option, but it should be much effort to make ELKS compile with it and at end of day we will be limited to only microprocessors supported by Open Watcom. We could take on look on GCC port for 8086, you could find more information about it on this mailing list archive. In fact those GCC patch for 8086 were applied to GCC mainline, but few time after that they were removed. Best Regards, Alan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Kernel size over 64K: what is needed, how to implement? 2012-02-20 13:13 ` Alan Carvalho de Assis @ 2012-02-21 18:24 ` Juan Perez-Sanchez 2012-02-22 0:31 ` David Given [not found] ` <FC79A7424F669341A72EFA787A3C767541F8ECD7@exchdb1-vm-srv.infopulse.local> 1 sibling, 1 reply; 9+ messages in thread From: Juan Perez-Sanchez @ 2012-02-21 18:24 UTC (permalink / raw) To: linux-8086 On 2/20/12, Alan Carvalho de Assis <acassis@gmail.com> wrote: > >> TBH, the easiest approach to using Open Watcom would probably be to >> retool entirely for it: produce ELKS executables and a kernel image >> directly from their linker. At least ELKS doesn't have any shared >> library horrors to deal with, which means that the output files are >> fairly simple. No idea whether it's actually possible, though. >> > > I think Open Watcom is a good option, but it should be much effort to > make ELKS compile with it and at end of day we will be limited to only > microprocessors supported by Open Watcom. > > We could take on look on GCC port for 8086, you could find more > information about it on this mailing list archive. In fact those GCC > patch for 8086 were applied to GCC mainline, but few time after that > they were removed. > A simpler path is to use the utility to convert from *.exe to elks executable: http://www.alfonsomartone.itb.it/fhlvnr.html The suggestion is to use watcom to produce exe files and use the tcc4elks utility to convert to elks executables. Its necessary to: 1. Port the utility to linux 2. Create the c library compiling libc from bcc using open watcom. Probably its convenient to host the utility under the tools directory of elks. This approach is limited to small memory model. With respect to the kernel, probably will be necessary to write a similar utility. Juan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Kernel size over 64K: what is needed, how to implement? 2012-02-21 18:24 ` Juan Perez-Sanchez @ 2012-02-22 0:31 ` David Given 0 siblings, 0 replies; 9+ messages in thread From: David Given @ 2012-02-22 0:31 UTC (permalink / raw) To: linux-8086 [-- Attachment #1: Type: text/plain, Size: 1188 bytes --] On 21/02/12 18:24, Juan Perez-Sanchez wrote: [...] > The suggestion is to use watcom to produce exe files and use the > tcc4elks utility > to convert to elks executables. Allegedly the Watcom linker can produce flat files directly: http://wiki.osdev.org/Watcom ELKS binaries are really simple; IIRC they're just a file header and then the text and data segments concatenated together. (Anyone got a link?) It may be possible to persuade the linker to emit them without needing conversion. I also see that the Watcom linker can emit ELF and COFF files, but I don't know whether it can emit the 16-bit versions (which are a rather esoteric discipline). What format is the kernel image in? The hard-to-find Watcom linker manual is here, and the FORMAT directive is documentated on page 61: http://www.openwatcom.org/ftp/manuals/current/lguide.pdf PS. Please don't cc me with replies; I am a list subscriber! -- ┌─── dg@cowlark.com ───── http://www.cowlark.com ───── │ │ "Never attribute to malice what can be adequately explained by │ stupidity." --- Nick Diamos (Hanlon's Razor) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 254 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <FC79A7424F669341A72EFA787A3C767541F8ECD7@exchdb1-vm-srv.infopulse.local>]
* RE: Kernel size over 64K: what is needed, how to implement? [not found] ` <FC79A7424F669341A72EFA787A3C767541F8ECD7@exchdb1-vm-srv.infopulse.local> @ 2012-02-22 14:53 ` Andrey Romanenko 0 siblings, 0 replies; 9+ messages in thread From: Andrey Romanenko @ 2012-02-22 14:53 UTC (permalink / raw) To: Andrey Romanenko; +Cc: linux-8086@vger.kernel.org >We could take on look on GCC port for 8086, you could find more >information about it on this mailing list archive. In fact those GCC >patch for 8086 were applied to GCC mainline, but few time after that >they were removed. Hello, I think GCC is the compiler targeted to bigger systems where no problem with memory limit exist. (there are very similar difference between ELKS and real Linux kernel, ELKS designed with 64kb limit in mind.) We could consider to use SDCC instead, btw from now on SDCC support "named address space" http://sdcc.sourceforge.net/doc/sdccman.html/node64.html this feature potentially may add multi data segments executables to ELKS. Also, It seems to me that all those systems supported by SDCC are very similar to 8088 computer because of their 64kb address space limit. thanks, Andrey ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-02-22 14:53 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-17 18:20 Kernel size over 64K: what is needed, how to implement? Jody Bruchon
2012-02-17 22:51 ` David Given
2012-02-19 21:36 ` David Given
2012-02-19 23:01 ` Kirn Gill
2012-02-20 0:51 ` David Given
2012-02-20 13:13 ` Alan Carvalho de Assis
2012-02-21 18:24 ` Juan Perez-Sanchez
2012-02-22 0:31 ` David Given
[not found] ` <FC79A7424F669341A72EFA787A3C767541F8ECD7@exchdb1-vm-srv.infopulse.local>
2012-02-22 14:53 ` Andrey Romanenko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox