416 lines
8.2 KiB
HTML
416 lines
8.2 KiB
HTML
<HTML
|
|
><HEAD
|
|
><TITLE
|
|
>GRUB and LILO</TITLE
|
|
><META
|
|
NAME="GENERATOR"
|
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
|
|
REL="HOME"
|
|
TITLE="Linux i386 Boot Code HOWTO"
|
|
HREF="index.html"><LINK
|
|
REL="PREVIOUS"
|
|
TITLE="Internal Linker Script"
|
|
HREF="internel_lds.html"><LINK
|
|
REL="NEXT"
|
|
TITLE="FAQ"
|
|
HREF="faq.html"></HEAD
|
|
><BODY
|
|
CLASS="sect1"
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#840084"
|
|
ALINK="#0000FF"
|
|
><DIV
|
|
CLASS="NAVHEADER"
|
|
><TABLE
|
|
SUMMARY="Header navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TH
|
|
COLSPAN="3"
|
|
ALIGN="center"
|
|
>Linux i386 Boot Code HOWTO</TH
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="left"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="internel_lds.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="80%"
|
|
ALIGN="center"
|
|
VALIGN="bottom"
|
|
></TD
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="right"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="faq.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"></DIV
|
|
><DIV
|
|
CLASS="sect1"
|
|
><H1
|
|
CLASS="sect1"
|
|
><A
|
|
NAME="bootloader"
|
|
></A
|
|
>C. GRUB and LILO</H1
|
|
><P
|
|
> Both <A
|
|
HREF="http://www.gnu.org/software/grub"
|
|
TARGET="_top"
|
|
>GNU GRUB</A
|
|
> and
|
|
<A
|
|
HREF="http://freshmeat.net/projects/lilo"
|
|
TARGET="_top"
|
|
>LILO</A
|
|
>
|
|
understand the real-mode kernel header format and will load
|
|
the bootsect (one sector), setup code
|
|
(<EM
|
|
>setup_sects</EM
|
|
> sectors) and
|
|
compressed kernel image (<EM
|
|
>syssize</EM
|
|
>*16 bytes) into memory.
|
|
They fill out the loader identifier (<EM
|
|
>type_of_loader</EM
|
|
>)
|
|
and try to pass appropriate parameters and options to the kernel.
|
|
After they finish their jobs, control is passed to setup code.
|
|
</P
|
|
><DIV
|
|
CLASS="sect2"
|
|
><H2
|
|
CLASS="sect2"
|
|
><A
|
|
NAME="grub"
|
|
></A
|
|
>C.1. GNU GRUB</H2
|
|
><P
|
|
> The following GNU GRUB program outline is based on grub-0.93.
|
|
<TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="programlisting"
|
|
>stage2/stage2.c:cmain()
|
|
`-- run_menu()
|
|
`-- run_script();
|
|
|-- builtin = find_command(heap);
|
|
|-- kernel_func(); // builtin->func() for command "kernel"
|
|
| `-- load_image(); // search BOOTSEC_SIGNATURE in boot.c
|
|
| /* memory from 0x100000 is populated by and in the order of
|
|
| * (bvmlinux, bbootsect, bsetup) or (vmlinux, bootsect, setup) */
|
|
|-- initrd_func(); // for command "initrd"
|
|
| `-- load_initrd();
|
|
`-- boot_func(); // for implicit command "boot"
|
|
`-- linux_boot(); // defined in stage2/asm.S
|
|
or big_linux_boot(); // not in grub/asmstub.c!
|
|
|
|
// In stage2/asm.S
|
|
linux_boot:
|
|
/* copy kernel */
|
|
move system code from 0x100000 to 0x10000 (linux_text_len bytes);
|
|
big_linux_boot:
|
|
/* copy the real mode part */
|
|
EBX = linux_data_real_addr;
|
|
move setup code from linux_data_tmp_addr (0x100000+text_len)
|
|
to linux_data_real_addr (0x9100 bytes);
|
|
/* change %ebx to the segment address */
|
|
linux_setup_seg = (EBX >> 4) + 0x20;
|
|
/* XXX new stack pointer in safe area for calling functions */
|
|
ESP = 0x4000;
|
|
stop_floppy();
|
|
/* final setup for linux boot */
|
|
prot_to_real();
|
|
cli;
|
|
SS:ESP = BX:9000;
|
|
DS = ES = FS = GS = BX;
|
|
/* jump to start, i.e. ljmp linux_setup_seg:0
|
|
* Note that linux_setup_seg is just changed to BX. */
|
|
.byte 0xea
|
|
.word 0
|
|
linux_setup_seg:
|
|
.word 0
|
|
</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
</P
|
|
><P
|
|
> Refer to "<B
|
|
CLASS="command"
|
|
>info grub</B
|
|
>" for GRUB manual.
|
|
</P
|
|
><P
|
|
> One
|
|
<A
|
|
HREF="http://mail.gnu.org/archive/html/bug-grub/2003-03/msg00030.html"
|
|
TARGET="_top"
|
|
> reported GNU GRUB bug</A
|
|
> should be noted if you are
|
|
porting grub-0.93 and making changes to <EM
|
|
>bsetup</EM
|
|
>.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="sect2"
|
|
><H2
|
|
CLASS="sect2"
|
|
><A
|
|
NAME="lilo"
|
|
></A
|
|
>C.2. LILO</H2
|
|
><P
|
|
> Unlike GRUB, LILO does not check the configuration file
|
|
when booting system.
|
|
Tricks happen when <B
|
|
CLASS="command"
|
|
>lilo</B
|
|
> is invoked from terminal.
|
|
</P
|
|
><P
|
|
> The following LILO program outline is based on lilo-22.5.8.
|
|
<TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="programlisting"
|
|
>lilo.c:main()
|
|
|-- cfg_open(config_file);
|
|
|-- cfg_parse(cf_options);
|
|
|-- bsect_open(boot_dev, map_file, install, delay, timeout);
|
|
| |-- open_bsect(boot_dev);
|
|
| `-- map_create(map_file);
|
|
|-- cfg_parse(cf_top)
|
|
| `-- cfg_do_set();
|
|
| `-- do_image(); // walk->action for "image=" section
|
|
| |-- cfg_parse(cf_image) -> cfg_do_set();
|
|
| |-- bsect_common(&descr, 1);
|
|
| | |-- map_begin_section();
|
|
| | |-- map_add_sector(fallback_buf);
|
|
| | `-- map_add_sector(options);
|
|
| |-- boot_image(name, &descr) or boot_device(name, range, &descr);
|
|
| | |-- int fd = geo_open(&descr, name, O_RDONLY);
|
|
| | | read(fd, &buff, SECTOR_SIZE);
|
|
| | | map_add(&geo, 0, image_sectors);
|
|
| | | map_end_section(&descr->start, setup_sects+2+1);
|
|
| | | /* two sectors created in bsect_common(),
|
|
| | | * another one sector for bootsect */
|
|
| | | geo_close(&geo);
|
|
| | `-- fd = geo_open(&descr, initrd, O_RDONLY);
|
|
| | map_begin_section();
|
|
| | map_add(&geo, 0, initrd_sectors);
|
|
| | map_end_section(&descr->initrd,0);
|
|
| | geo_close(&geo);
|
|
| `-- bsect_done(name, &descr);
|
|
`-- bsect_update(backup_file, force_backup, 0); // update boot sector
|
|
|-- make_backup();
|
|
|-- map_begin_section();
|
|
| map_add_sector(table);
|
|
| map_write(&param2, keytab, 0, 0);
|
|
| map_close(&param2, here2);
|
|
|-- // ... perform the relocation of the boot sector
|
|
|-- // ... setup bsect_wr to correct place
|
|
|-- write(fd, bsect_wr, SECTOR_SIZE);
|
|
`-- close(fd);</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
>
|
|
<EM
|
|
>map_add(), map_add_sector()</EM
|
|
> and
|
|
<EM
|
|
>map_add_zero()</EM
|
|
> may call
|
|
<EM
|
|
>map_register()</EM
|
|
> to complete their jobs,
|
|
while <EM
|
|
>map_register()</EM
|
|
> will keep a list for
|
|
all (CX, DX, AL) triplets (data structure SECTOR_ADDR) used to
|
|
identify all registered sectors.
|
|
</P
|
|
><P
|
|
> LILO runs <TT
|
|
CLASS="filename"
|
|
>first.S</TT
|
|
> and <TT
|
|
CLASS="filename"
|
|
>second.S</TT
|
|
>
|
|
to boot a system.
|
|
It calls <EM
|
|
>second.S:doboot()</EM
|
|
> to load map file,
|
|
bootsect and setup code.
|
|
Then it calls <EM
|
|
>lfile()</EM
|
|
> to load the system code,
|
|
calls <EM
|
|
>launch2() -> launch() -> cl_wait() -> start_setup()
|
|
-> start_setup2()</EM
|
|
> and finnaly executes
|
|
"jmpi 0,SETUPSEG" instruction to run setup code.
|
|
</P
|
|
><P
|
|
> Refer to "<B
|
|
CLASS="command"
|
|
>man lilo</B
|
|
>" and
|
|
"<B
|
|
CLASS="command"
|
|
>man lilo.conf</B
|
|
>" for LILO details.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="sect2"
|
|
><H2
|
|
CLASS="sect2"
|
|
><A
|
|
NAME="bootloader_ref"
|
|
></A
|
|
>C.3. Reference</H2
|
|
><P
|
|
> <P
|
|
></P
|
|
><UL
|
|
><LI
|
|
><P
|
|
> <A
|
|
HREF="http://www.gnu.org/software/grub/"
|
|
TARGET="_top"
|
|
>GNU GRUB</A
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <A
|
|
HREF="http://www.openbg.net/sto/os/xml/grub.html"
|
|
TARGET="_top"
|
|
>GRUB Tutorial</A
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <A
|
|
HREF="http://freshmeat.net/projects/lilo"
|
|
TARGET="_top"
|
|
>LILO (freshmeat.net)</A
|
|
>
|
|
</P
|
|
></LI
|
|
><LI
|
|
><P
|
|
> <A
|
|
HREF="http://www.tldp.org/HOWTO/HOWTO-INDEX/os.html#OSBOOT"
|
|
TARGET="_top"
|
|
> LDP HOWTO-INDEX: Boot Loaders and Booting the OS</A
|
|
>
|
|
</P
|
|
></LI
|
|
></UL
|
|
>
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="NAVFOOTER"
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"><TABLE
|
|
SUMMARY="Footer navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="internel_lds.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="index.html"
|
|
ACCESSKEY="H"
|
|
>Home</A
|
|
></TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="faq.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
>Internal Linker Script</TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
> </TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
>FAQ</TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |