Files
2024-02-19 00:25:02 -05:00

710 lines
28 KiB
Plaintext

Subject: Linux-Development Digest #544
From: Digestifier <Linux-Development-Request@senator-bedfellow.MIT.EDU>
To: Linux-Development@senator-bedfellow.MIT.EDU
Reply-To: Linux-Development@senator-bedfellow.MIT.EDU
Date: Sat, 12 Mar 94 20:13:05 EST
Linux-Development Digest #544, Volume #1 Sat, 12 Mar 94 20:13:05 EST
Contents:
Startup code (DOS boot program) (Jon Peatfield)
<< IDE Performance Package >> (Mark Lord)
mouse and SCSI controller help??! (Paul Corley Rounsavall)
Re: PLEASE use the GPL (La Monte Yarroll)
Should a file system error cause a kernel panic? (Brandon C Long)
Kernel startup prosedure (Sami-Pekka Hallikas)
Re: kernel mmap() , MAP_SHARED/PROT_READ/PROT_WRITE (Arindam Banerji)
----------------------------------------------------------------------------
From: jp107@amtp.cam.ac.uk (Jon Peatfield)
Subject: Startup code (DOS boot program)
Date: Fri, 11 Mar 1994 03:11:18 GMT
While this isn't strictly to do with the linux kernel itself I hope
that noone will mind too much. (flames>/dev/null please)
I've recently been giving myself headaches trying to understand the
startup code for the kernel (boot/startup.S mainly), while not
understanding 8086 assembler, so please make allowances if I'm
completely wrong.
I'm trying to write a loader which starts Linux from a running DOS
environment. The reason for doing this is that I need to run Linux on
machines where for various reasons I can't overwrite the boot sectors
and using boot floppies are frowned on. The UMSDOS fileing system
allows the sharing of the disks so all (ha) I need is a boot program.
I've tried the bootlin stuff referenced by the LILO documentation but
it doesn't work on any of the machines I've tried it on.
From looking at the code in startup.S it seems clear that the startup
can be split into 2 sections:
1. getting parameters from the BIOS and selecting screen size etc
2. setting up the machine, moving the kernel and starting it
The former need to be done while BIOS calls work, while the latter
don't. The problem I have is that DOS seems to have linked itself
into the INT vectors for some of the calls that (1) makes, so I can't
make them after placing the kernel in memory (at 0x010000 anyway),
since this may have overwritten these handlers.
What I propose to do is:
a. From a DOS executable load the kernel into some memory (may need
DOS network devices etc up)
b. Make BIOS calls needed by (1) to get parameters.
c. Disable interrupts, move myself to beyond 0x098000 (and jump there)
d. move kernel to where it wants to live including the first 2.5K at
0x090000 the rest at 0x010000, copy parameters from (b)
e. Run the (2) startup code thus starting the kernel.
What I'd like to do is to derive the parts of code needed for (b) and
(e) automatically from startup.S so that if/when startup.S is changed
this program can be easily changed. Since I don't know 8086 assembler
I'd like to keep most of the rest in a higher-level language if
possible.
Can anyone tell me:
If I'm wasting my time 'cos they have solved this problem already (please)?
If I'm on the right track or have missed something obvious?
Any help would be gratefully recieved.
-- Jon Peatfield (DAMTP unix network admin)
--
Jon Peatfield, Computer Officer, the DAMTP, University of Cambridge
Telephone: (+44 223) 3-37852 Mail: J.S.Peatfield@amtp.cam.ac.uk
PP breaks RFC-822 when forwarding SMTP->SMTP mail. PP: Just say NO.
------------------------------
From: mlord@bnr.ca (Mark Lord)
Subject: << IDE Performance Package >>
Date: 12 Mar 1994 23:49:54 GMT
Back in September/1993 I posted a patch file to enable MultipleMode
on supporting IDE drives. The original patch was updated once, and
then set aside due to problems with error recovery on writes.
Here is the first major revision to the patch since that time.
Features:
-- source compatible with 99pl15 and pre-1.0 kernels
-- automatic drive identification/display at kernel boot time
(with optional detailed info display)
-- detects IDE drives which reliably support MultipleMode
-- safely enables 8-sector MultipleMode on newer drives
(all 2+ sector READs use it, including PAGING requests)
(all 2-8 sector WRITEs use it, including PAGING requests)
-- error recovery mechanism respected (it works) for READs & WRITEs
-- MultipleMode is automatically shut off if errors occur
-- performs lower overhead bulk transfers of multiple sectors
-- safely enables interrupts during data transfers
(for the first N-1 words of an N word transfer)
(this feature can be turned off with #ifdef)
To be added someday:
-- support for a second IDE controller (up to 4 drives).
Normally, READ/WRITE operations involving more than one disk sector (512bytes)
transfer a single sector at a time, providing an interrupt after each sector
to signal when the drive is ready for the next sector to be transferred.
Under linux, most disk operations involve groups of 2 or 8 (paging) sectors.
MultipleMode is a hardware feature of nearly all IDE drives sold these days.
It provides an alternate set of READ/WRITE commands which can transfer more
than a single sector at a time between interrupts, up to a configured limit.
Use of this can greatly reduce kernel overhead, since the disk interrupt
handlers get invoked fewer times for the same amount of data. The savings are
in the entry_save_regs_check_status and restore_regs_exit portions of the
handlers, perhaps 10-20% of the total execution paths. Thus, raw device speed
increases of 10-20%, and a corresponding 10-20% reduction in kernel CPU usage,
can be observed with faster drives.
To measure the change in raw device speed try this as a before/after test:
sync
time dd if=/dev/hda of=/dev/null bs=1024k count=30
Run the second command twice in a row to negate most caching effects,
and then divide 30MB by the measured elapsed/total time in seconds
to give the effective raw device READ speed in MB/sec. To measure
WRITE speed, you could try a similar test on an unused swap partition,
being careful to do a swapoff first, and a mkswap afterwards.
The default setting is for 8-sector multiple mode. I recommend this value
as the absolute minimum, so that paging requests can be accomodated.
It also works just fine for me in everyday use. Larger settings are not
recommended either, as they provide no significant added benefits, and can
increase I/O latency on READ operations.
The other big benefit of this patch is that the disk driver is much friendly
to serial/network I/O, as it avoids disabling interrupts during data transfers
to/from the drive. If this breaks your system, there is an #ifdef near the
top to turn off this function.
Enjoy, and let me know if it works/breaks for you.
-ml
mlord@bnr.ca
--- hd.c.orig Fri Jan 21 12:50:11 1994
+++ hd.c Sat Mar 12 14:47:45 1994
@@ -14,8 +14,13 @@
*
* Thanks to Branko Lankester, lankeste@fwi.uva.nl, who found a bug
* in the early extended-partition checks and added DM partitions
+ *
+ * IDE IRQ-unmask & drive-id & multiple-mode code added by Mark Lord.
*/
+#define HD_UNMASK_INTR 1 /* set to 0 to mask other IRQs during hd I/O */
+#define VERBOSE_DRIVEID 0 /* set to 1 for more drive info at boot time */
+#define MAX_MULTIPLE 8 /* set to 1 to disable multiple mode support */
#include <linux/errno.h>
#include <linux/signal.h>
@@ -208,6 +213,133 @@
outb_p(cmd,++port);
}
+#define WIN_MULTREAD 0xC4 /* read multiple sectors */
+#define WIN_MULTWRITE 0xC5 /* write multiple sectors */
+#define WIN_SETMULT 0xC6 /* enable read multiple */
+#define WIN_IDENTIFY 0xEC /* ask drive to identify itself */
+
+static int mult_count[MAX_HD] = {0,}, writing_mult;
+
+#if VERBOSE_DRIVEID
+
+char *cfg_str[] =
+{ "", " HardSect", " SoftSect", " NotMFM", " HdSw>15uSec", " SpinMotCtl",
+ " Fixed", " Removeable", " DTR<=5Mbs", " DTR>5Mbs", " DTR>10Mbs",
+ " RotSpdTol>.5%", " dStbOff", " TrkOff", " FmtGapReq", "",
+};
+
+char *SlowMedFast[] = {"slow", "medium", "fast"};
+char *BuffType[] = {"?", "1Sect", "DualPort", "DualPortCache"};
+
+#define YN(b) (((b)==0)?"no":"yes")
+
+static void rawstring (char *prefix, char *s, int n)
+{
+ printk(prefix);
+ if (*s) {
+ int i;
+ for (i=0; i < n && s[i^1] == ' '; ++i); /* strip blanks */
+ for (; i < n && s[i^1]; ++i)
+ if (s[i^1] != ' ' || ((i+1) < n && s[(i+1)^1] != ' '))
+ printk("%c",s[i^1]);
+ }
+}
+
+static void dmpstr (char *prefix, unsigned int i, char *s[], unsigned int maxi)
+{
+ printk(prefix);
+ printk( (i > maxi) ? "?" : s[i] );
+}
+
+static void dump_identity (unsigned int dev, unsigned short ib[])
+{
+ int i;
+ char dashes[] = "\n+-------------------------------------------------------------------+\n";
+ printk (dashes);
+ printk ("hd%c: Drive Identification Info:\n", dev+'a');
+ rawstring (" Model=",(char *)&ib[27],40);
+ rawstring (", FwRev=",(char *)&ib[23],8);
+ rawstring (", SerialNo=",(char *)&ib[10],20);
+ printk ("\n Config={");
+ for (i=0; i<=15; i++) if (ib[0] & (1<<i)) printk (cfg_str[i]);
+ printk (" }\n");
+ printk (" Default c/h/s=%d/%d/%d, TrkSize=%d, SectSize=%d, ECCbytes=%d\n",
+ ib[1],ib[3],ib[6],ib[4],ib[5], ib[22]);
+ dmpstr (" BuffType=",ib[20],BuffType,3);
+ ib[47] &= 0xFF;
+ printk (", BuffSize=%dKB, MaxMultSect=%d\n", ib[21]/2, ib[47]);
+ printk (" Features: DblWordIO=%s, LBA=%s, DMA=%s",
+ YN(ib[48]&1),YN(ib[49]&0x20),YN(ib[49]&0x10));
+ dmpstr (", tPIO=",ib[51]>>8,SlowMedFast,2);
+ if (ib[49]&0x10 && (ib[53]&1)==0)
+ dmpstr (", tDMA=",ib[52]>>8,SlowMedFast,2);
+ printk ("\n (%s): Current c/h/s=%d/%d/%d, TotSect=%d",
+ (((ib[53]&1)==0)?"maybe":"valid"),
+ ib[54],ib[55],ib[56],*(int *)&ib[57]);
+ if (ib[49]&0x20)
+ printk (", LBAsect=%d", *(int *)&ib[60]);
+ printk ("\n (%s): CurMultSect=%d", ((ib[53]&1)==0)?"maybe":"valid",
+ (ib[59]&0x10)?ib[59]&0xFF:0);
+ if (ib[49]&0x10)
+ printk (", DMA-1w=%04X, DMA-mw=%04X", ib[62], ib[63]);
+ printk ("%s\n",dashes);
+}
+#endif /* VERBOSE_DRIVEID */
+
+static void set_multiple_intr(void)
+{
+ unsigned int dev = DEVICE_NR(CURRENT->dev);
+
+ if (inb_p(HD_STATUS)&(BUSY_STAT|ERR_STAT)) {
+ mult_count[dev] = 1; /* disable multiple mode */
+ printk (" hd%c: set multiple mode failed\n", dev+'a');
+ } else {
+ printk (" hd%c: enabled %d-sector multiple mode\n",
+ dev+'a', mult_count[dev]);
+ }
+ do_hd_request();
+ return;
+}
+
+static void identify_intr(void)
+{
+ unsigned short ib[64];
+ unsigned int dev = DEVICE_NR(CURRENT->dev);
+
+ if (inb_p(HD_STATUS)&(BUSY_STAT|ERR_STAT))
+ printk (" hd%c: multiple mode not supported\n", dev+'a');
+ else {
+ insw(HD_DATA,(char *)ib,64); /* get first 128 ID bytes */
+ sti();
+#if VERBOSE_DRIVEID
+ dump_identity(dev, ib);
+#endif /* VERBOSE_DRIVEID */
+ if (ib[27]) {
+ int i;
+ for (i=27; i<= 46; i++)
+ ib[i] = (ib[i]>>8) | (ib[i]<<8);
+ printk (" hd%c: %-.40s (%dMB IDE w/%dKB Cache)\n",
+ dev+'a', (char *)&ib[27], ib[1]*ib[3]*ib[6] / 2048, ib[21]>>1);
+ /* skip troublesome older drives with (MaxMult < 32) */
+ if ((i = ib[47] & 0xff) >= 32)
+ mult_count[dev] = MAX_MULTIPLE;
+ else
+ printk (" hd%c: older drive, multiple mode not enabled\n", dev+'a');
+ }
+ insw(HD_DATA,(char *)ib,64); /* flush remaining 384 ID bytes */
+ insw(HD_DATA,(char *)ib,64);
+ cli();
+ insw(HD_DATA,(char *)ib,64);
+ if (mult_count[dev] > 1) { /* try to enable multiple mode */
+ hd_out(dev,mult_count[dev],0,0,0,WIN_SETMULT,&set_multiple_intr);
+ if (!reset)
+ return;
+ }
+ }
+ do_hd_request();
+ return;
+}
+
static int drive_busy(void)
{
unsigned int i;
@@ -243,6 +375,11 @@
repeat:
if (reset) {
+ for (i=0; i < NR_HD; i++) {
+ if (mult_count[i] > 1)
+ printk (" hd%c: multiple mode disabled\n", i+'a');
+ mult_count[i] = 1; /* disable multiple mode */
+ }
reset = 0;
i = -1;
reset_controller();
@@ -310,8 +447,8 @@
static void read_intr(void)
{
- int i;
- int retries = 100000;
+ unsigned int dev = DEVICE_NR(CURRENT->dev);
+ int i, retries = 100000, msect = mult_count[dev];
do {
i = (unsigned) inb_p(HD_STATUS);
@@ -333,22 +470,33 @@
do_hd_request();
return;
ok_to_read:
- insw(HD_DATA,CURRENT->buffer,256);
- CURRENT->errors = 0;
- CURRENT->buffer += 512;
- CURRENT->sector++;
- i = --CURRENT->nr_sectors;
- --CURRENT->current_nr_sectors;
+#if HD_UNMASK_INTR
+ sti(); /* permit other IRQs during xfer */
+#endif
+ if ((i = CURRENT->current_nr_sectors) > msect)
+ i = msect;
+ msect -= i;
+ CURRENT->sector += i;
+ CURRENT->current_nr_sectors -= i;
+ insw(HD_DATA,CURRENT->buffer,(i<<8)-1); /* xfer all but final word */
+ CURRENT->buffer += i<<9; /* incr buffer ptr by byte count */
+ cli(); /* mask IRQs before completing xfer */
+ *((short *)(CURRENT->buffer-2)) = inw(HD_DATA); /* xfer final word */
+
#ifdef DEBUG
- printk("hd%d : sector = %d, %d remaining to buffer = %08x\n",
- MINOR(CURRENT->dev), CURRENT->sector, i, CURRENT->
- buffer);
+ printk("hd%c: read: %d sectors(%d-%d), remaining=%d, buffer=%08x\n",
+ dev+'a', i, CURRENT->sector-i, CURRENT->sector-1,
+ CURRENT->nr_sectors, (int) CURRENT->buffer);
#endif
- if (!i || (CURRENT->bh && !SUBSECTOR(i)))
+ CURRENT->nr_sectors -= i;
+ i = CURRENT->nr_sectors; /* in case it's freed by end_request */
+ if (!CURRENT->current_nr_sectors)
end_request(1);
if (i > 0) {
+ CURRENT->errors = 0;
+ if (msect)
+ goto ok_to_read;
SET_INTR(&read_intr);
- sti();
return;
}
(void) inb_p(HD_STATUS);
@@ -370,8 +518,19 @@
continue;
if ((i & STAT_MASK) != STAT_OK)
break;
- if ((CURRENT->nr_sectors <= 1) || (i & DRQ_STAT))
- goto ok_to_write;
+ if (!(i & DRQ_STAT)) {
+ if (writing_mult || CURRENT->nr_sectors <= 1) {
+ end_request(1);
+#if (HD_DELAY > 0)
+ last_req = read_timer();
+#endif
+ do_hd_request();
+ return;
+ }
+ } else {
+ if (CURRENT->nr_sectors > 1)
+ goto ok_to_write;
+ }
} while (--retries > 0);
sti();
printk("HD: write_intr: status = 0x%02x\n",i);
@@ -384,23 +543,19 @@
do_hd_request();
return;
ok_to_write:
- CURRENT->sector++;
- i = --CURRENT->nr_sectors;
- --CURRENT->current_nr_sectors;
+ CURRENT->errors = 0;
CURRENT->buffer += 512;
- if (!i || (CURRENT->bh && !SUBSECTOR(i)))
+ CURRENT->sector++;
+ CURRENT->nr_sectors--;
+ if (!--CURRENT->current_nr_sectors)
end_request(1);
- if (i > 0) {
- SET_INTR(&write_intr);
- outsw(HD_DATA,CURRENT->buffer,256);
- sti();
- } else {
-#if (HD_DELAY > 0)
- last_req = read_timer();
+#if HD_UNMASK_INTR
+ sti();
#endif
- do_hd_request();
- }
- return;
+ outsw(HD_DATA,CURRENT->buffer,255);
+ cli();
+ SET_INTR(&write_intr);
+ outw(((short *)CURRENT->buffer)[255],HD_DATA);
}
static void recal_intr(void)
@@ -482,7 +637,6 @@
for (i=0; i < NR_HD; i++)
recalibrate[i] = 1;
reset_hd();
- sti();
return;
}
if (recalibrate[dev]) {
@@ -490,11 +644,41 @@
hd_out(dev,hd_info[dev].sect,0,0,0,WIN_RESTORE,&recal_intr);
if (reset)
goto repeat;
- sti();
return;
}
+ if (!mult_count[dev]) {
+ mult_count[dev] = 1; /* as default, disable multiple mode */
+ hd_out(dev,0,0,0,0,WIN_IDENTIFY,identify_intr);
+ if (reset)
+ goto repeat;
+ return;
+ }
+ if (CURRENT->cmd == READ) {
+ unsigned int cmd = mult_count[dev] > 1 ? WIN_MULTREAD : WIN_READ;
+ hd_out(dev,nsect,sec,head,cyl,cmd,&read_intr);
+ if (reset)
+ goto repeat;
+ return;
+ }
if (CURRENT->cmd == WRITE) {
- hd_out(dev,nsect,sec,head,cyl,WIN_WRITE,&write_intr);
+ unsigned int cmd, wcnt;
+ if ((wcnt = mult_count[dev]) > 1
+ && nsect <= wcnt
+ && nsect == CURRENT->current_nr_sectors) {
+ wcnt = (nsect<<8) - 1;
+ writing_mult = 1;
+ cmd = WIN_MULTWRITE;
+ } else {
+ wcnt = 255;
+ writing_mult = 0;
+ cmd = WIN_WRITE;
+ }
+#ifdef DEBUG
+ printk("hd%c: writing %d sectors(%d-%d), buffer=%08x\n",
+ dev+'a', (wcnt+1)>>8, CURRENT->sector,
+ CURRENT->sector+nsect-1, (int) CURRENT->buffer);
+#endif
+ hd_out(dev,nsect,sec,head,cyl,cmd,NULL);
if (reset)
goto repeat;
if (wait_DRQ()) {
@@ -502,15 +686,13 @@
bad_rw_intr();
goto repeat;
}
- outsw(HD_DATA,CURRENT->buffer,256);
- sti();
- return;
- }
- if (CURRENT->cmd == READ) {
- hd_out(dev,nsect,sec,head,cyl,WIN_READ,&read_intr);
- if (reset)
- goto repeat;
+#if HD_UNMASK_INTR
sti();
+#endif
+ outsw(HD_DATA,CURRENT->buffer,wcnt);
+ cli();
+ SET_INTR(&write_intr);
+ outw(((short *)CURRENT->buffer)[wcnt],HD_DATA);
return;
}
panic("unknown hd-command");
--
mlord@bnr.ca Mark Lord BNR Ottawa,Canada 613-763-7482
------------------------------
From: pcr1@super7.ERC.MsState.Edu (Paul Corley Rounsavall)
Subject: mouse and SCSI controller help??!
Date: 12 Mar 1994 23:55:34 GMT
I have just installed Linux slackware 1.1.2. I love this OS. I have a
Buslogic Local Bus SCSI-2 controller card (BT445) that is have major problems
with DOS. I am about to send the card back and get another. I was
considering a Adaptec. Any suggestions on which controller to purchase with
regards to price ( about $250-$300 ) and Linux compatability. I have seed
several posts here about different Adaptec cards and problems. Is this
typical of Adaptec?
Also, I have a Prohance 40 button programmable trackball. I was wondering
if anyone has this device working in Xfree86. If so, could you mail me what
ever it was you did to get it working? I was also curious as to how to go
about writing my own driver for the programmable buttons? I have some ideas
on the algorithm, but where should I start? Is there a mouse driver already
installed in Linux or X? Or does X handle everything straight from the port?
Thanks in advance for any suggestions, hints, or comments.
Paul
pcr1@erc.msstate.edu
------------------------------
From: piggy@hilbert.maths.utas.edu.au (La Monte Yarroll)
Subject: Re: PLEASE use the GPL
Date: 11 Mar 1994 03:32:23 GMT
Has anyone ever asked the FSF for permission to use a modified version
of the GPL?
--
La Monte H. Yarroll Home: piggy@baqaqi.chi.il.us
Work: piggy@hilbert.maths.utas.edu.au
If you remember nothing else: piggy@acm.org NIC Handle: LY
GPL - "Just give source a chance."
------------------------------
From: blong@dcl-nxt44 (Brandon C Long)
Subject: Should a file system error cause a kernel panic?
Date: 10 Mar 1994 17:18:43 GMT
Recently I've been having a problem with one of my e2fs file partitions
that causes the kernel to panic whenever anyone attempts to login from
console. (Or possibly at all, since the crash which caused the errors
took all my network configuration with it).
What I'm asking is why should this cause the kernal to panic? Unix is
supposed to be the wonderfully resilient operating system, but if a file
system error can cause a machine freeze, that just doesn't seem to make
sense. I thought kernal panics should be due to configuration problems,
ie at boot up, or memory parity errors, or kernel bugs (such as the swap
bug in pl13)?
Any thoughts?
BTW, in case you are curious, here was my post to c.o.l.h (with no help yet
offered) about my e2fs problems.
Subject: [Q] EXT2FS panic:buffer head pointer is NULL
Recently, my IDE controller froze up (I think) and a hard reboot was
necessary. After the computer was turned off and back on, the hard drie
controller was fine (well, it seems fine).
DOS booted fine (no surprise there).
Linux booted fine, until it reached rc.inet1, etc. It seems that /conf
as in /conf/net was turned into a file. I don't run bootutils, so it
does not fsck the hard drive at boot up. I logged in, su'ed to root,
and ran e2fsck -avf /dev/hda3 and it ticked away for quite a bit.
It got caught on /usr/bin/ld (it just kept counting it) so I went to
another virtual console and killed e2fsck. I did it again, and the
same thing happened, so I deleted /usr/bin/ld (which had become a
directory) e2fsck ran fine, reported that the file system had been changed,
etc. I started my attempt at putting things back together, when I got a
kernel panic. Now, my machine boots fine, but any attempt to log in
hangs after the motd, with:
kernel panic: EXT2-FS panic (device 3/3): ext2_find_entry: buffer head pointer
is NULL
So, I downloaded the slackware 1.1.2 boot disk and root disk, and ran e2fsck
off of it. It had quite a bit to say about the drive, but said it fixed it.
Booting the hard drive still gave the same error.
When the kernel panics, you can still type into the window, but it does nothing
and a reset is necessary (not doing the fs any good)
The installation was originally a SLS 1.01 (i think) and had been changed
quite a bit since then (new X, pl15h kernel, libc4.5.19, net 2, shadow, etc.)
Like I said, no bootutils. Its a 486/33 with 16megs and 2 hard drives.
BTW, looking around the hard drive mounted on the root disk from slackware
produced the same kernel panic and hang.
The ext2 partition was probably a .1 or .2 originally, and the e2fsck is now
.4, I don't know if that would be a problem or not. I have run e2fsck before,
but . . .
Any help would be greatly appreciated. Most of my important files are
on a separate (and newer) partition, but I really don't want to reinstall
if I don't have to.
Since I post this, I have grabbed the new e2fsck, and tried it. Although it
came up with some new errors (and fixed them) the kernel still panics upon
login, or if the partition is used from the slackware boot disk.
Brandon
================================================================================
> Brandon Long ][ Yeah, I blong here too. [
> Computer Engineering ][ "A man who could make so vile a pun would not [
> University of Illinois ][ scruple to pick a pocket." -- John Dennis [
> Urbana-Champaign ][ blong@uiuc.edu blong@sumter.cso.uiuc.edu (NeXT) [
===========<a href="http://www.cen.uiuc.edu/~bl6456/> blong </a>================
The aforementioned views may not be those of this fine University.
Let's just say that I would be really surprised if they were.
--
================================================================================
> Brandon Long ][ Yeah, I blong here too. [
> Computer Engineering ][ "A man who could make so vile a pun would not [
> University of Illinois ][ scruple to pick a pocket." -- John Dennis [
------------------------------
From: semi@dream.nullnet.fi (Sami-Pekka Hallikas)
Subject: Kernel startup prosedure
Date: Fri, 11 Mar 1994 02:59:50 GMT
What is FULL Kernel startup prosedure. So what kernel loads before init?
First system loads kernel and I need to know EVERY programs needed after
that.. Is it going like this:
Kernel
if exist init
do
init
rc
else
bash
done
Also I like to know how to make programs to use shared libraries
(/lib/libc.so.???).
Please, email answers to me.
--
+--------------------------+----------+-------------------------------------+
| semi@dream.nullnet.fi | OH1KYL | MAIL MEDIA. Do Not Expose to Flame! |
| samip@freeport.uwasa.fi +----------+-------------------------------------|
| semi@freenet.hut.fi | Dream World BBS * 358-21-4389843 * 24H * 9600 |
+--------------------------+------------------------------------------------+
------------------------------
From: axb@defender.dcrl.nd.edu (Arindam Banerji)
Subject: Re: kernel mmap() , MAP_SHARED/PROT_READ/PROT_WRITE
Date: 12 Mar 1994 15:24:33 GMT
Although, David Jordan had done some work in instantiating C++ objects in
shared memory, some problems with his approach were quite obvious. I have since
then constructed an implementation of C++ objects in shared memory. This
implementation at present runs only on AIX, but could be ported to other
systems, with some effort. I've since written a paper on this. Send me some
e-mail, and I'll point you in the right direction.
=============================================================================
Arindam Banerji (219)-631-5273 (Voice)
384 FitzPatrick Hall (219)-631-5772 (Voice)
Dept. of Computer Science and Engineering (219)-273-0862 (Voice)
University of Notre Dame (219)-631-9260 (FAX)
Notre Dame, IN 46556 axb@cse.nd.edu (E-mail)
=============================================================================
------------------------------
** FOR YOUR REFERENCE **
The service address, to which questions about the list itself and requests
to be added to or deleted from it should be directed, is:
Internet: Linux-Development-Request@NEWS-DIGESTS.MIT.EDU
You can send mail to the entire list (and comp.os.linux.development) via:
Internet: Linux-Development@NEWS-DIGESTS.MIT.EDU
Linux may be obtained via one of these FTP sites:
nic.funet.fi pub/OS/Linux
tsx-11.mit.edu pub/linux
sunsite.unc.edu pub/Linux
End of Linux-Development Digest
******************************