home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd2.bin / dosutils / bootlin / technic.doc < prev    next >
Text File  |  1994-10-16  |  5KB  |  91 lines

  1. This file describes the loading process of Linux used by BOOTLIN.
  2. People not interested in modifying the assembler source of BootLinux
  3. should not read this document (except those that are curious).
  4.  
  5. Here are the steps of loading process:
  6. (1)    clear screen, print system configuration and check for
  7.     386, 640K base memory and 1M extended memory.
  8.     shrink the stack to lower the lowest address usable for loading
  9.     the kernel.
  10. (2)    parse options
  11. (3)    try to open the image file. possibly ask a new name and retry(3).
  12. (4)    load bootsector at 9000h:0; check for AA55h bootable flag at 9000h:1FEh
  13. (5)    determine setup length, using the sector count found at offset 497 in
  14.     the boot sector if present (or the default value of 4); load setup at
  15.     9020h:0
  16. (6)    loads the kernel into memory. Two strategies are possible, depending
  17.     on BOOTLIN loading address in the base memory:
  18. 0      1      2      3      4      5      6      7      8      9      A x 64K
  19. |------|------|------|------|------|------|------|------|------|------
  20. <-(a)->                                ^-(c)
  21.        <--------------------------(b)------------------------->
  22.                                  (d)-^
  23.     (c) is the loading zone of bootsector and setup. (length 8K)
  24.     (d) is reserved for moving some part of BOOTLIN. (length 4K)
  25.     BOOTLIN is approx. 6K, so the total reserved memory is 18K, and a
  26.     kernel will be loadable if its size remains less than <free mem> - 18K.
  27.  
  28. (6a)    BOOTLIN is loaded in (a): the kernel is directly loaded in the
  29.     part of memory it expects to be. If the kernel is more than 512K,
  30.     the remaining part will be loaded between (c) and (d), then an
  31.     error message will be issued (kernel more than 512K or not enough
  32.     memory).
  33.  
  34. (6b)    BOOTLIN extends over (b) (this is mainly the case if BootLinux is run
  35.     from the DOS command line): the kernel is loaded just after the stack
  36.     of BOOTLIN, up to the end of (b). If more of the image is to be loaded,
  37.     it is loaded between (c) and (d). If more is to be loaded, then there
  38.     is not enough memory, and the corresponding message is issued.
  39.     The space between (c) and (d) is 64-4-8=52K.
  40.  
  41. (7)    the bootsector is updated with informations provided on the command
  42.     line via options, and the informations about LINUX are displayed.
  43.  
  44. (8)    checks for non-null root fs device number. If this is not the case,
  45.     asks for it and redisplay LINUX informations.
  46.  
  47. (9)    run LINUX, depending on wether (6) was (6a) or (6b):
  48.  
  49. (6a)->(9a)    BOOTLIN redirects Int 15h (in case HIMEM.SYS is loaded), then
  50.     merely jumps into the setup code.
  51.  
  52. (6b)->(9b)    the setup does a few things, then finally jumps into
  53.     the kernel code, expecting it at address 1000h:0. This is
  54.     obviously not the case here.
  55.     The kernel code could be moved to its right address before
  56.     jumping to the setup, but it would crash DOS programs and DOS
  57.     itself, so it is not possible because the setup uses a few
  58.     DOS/BIOS interrupts: int 11h, 13h, 15h and 16h. Int 13h may be
  59.     redirected by a disk cache, and Int 15h is nearly always redirected
  60.     by HIMEM.SYS.
  61.     The solution is to wait the call to the last interrupt to move
  62.     the kernel code to its right place. After the move, interrupts must
  63.     be disabled (cli) to avoid a possible call to Int 8 (timer) that would
  64.     crash the computer.
  65.     This is done by moving the appropriate BOOTLIN move code in zone
  66.     (d), and redirecting int 13h and int 15h to this code.
  67.     To handle correctly linux v1.1, int 11h is also redirected and
  68.     emulated; it is actually the last int called, but this way int 13h
  69.     can still be considered the last, and the one that must do the hard
  70.     job.
  71.     In fact, it is int 13h that can be considered called the last, but
  72.     int 15h has to be redirected in every case, since the possible presence
  73.     of HIMEM.SYS would make Int 15h report a false value of the
  74.     available extended memory. The real value is always fetched by
  75.     BOOTLIN in the CMOS, for its own use first, then to supply to
  76.     the setup when it needs it.
  77.     Linux 1.1's setup also calls int 13h twice with the same parameters,
  78.     the first being a dummy one ("Bootlin needs this to be done early" !).
  79.     Some code has added to check that int 13h will do its job only if the
  80.     int 15h has already been called.
  81.  
  82. NOTE that (9b) operations depend closely on the setup calling given
  83. interrupts in a given order with given parameters in the registers.
  84. A change of these dependencies in the setup would imply:
  85. (1) changes in BootLinux, possibly major.
  86. (2) nearly sure incompatibility with previous versions.
  87.  
  88. NOTE the setup changed in linux v1.1, but BootLinux could be adapted to it
  89. and remains compatible with previous versions.
  90.  
  91.