| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- * The mysteries arround "0x7C00" in x86 architecture bios bootloader
- Do you know "0x7C00", a magic number, in x86 assembler programming ?
- "0x7C00" is the memory address which BIOS loads MBR(Master Boot Record, a first sector in hdd/fdd) into. OS or bootloader developer must assume that their assembler codes are loaded and start from 0x7C00.
- But... ''1st'' , you may wonder.
- >"I read all of Intel x86(32bit) programmers manual, but did not found the magic number 0x7C00."
- Yes. ''0x7C00 is NOT related to x86 CPU'' . It's natural that you couldn't find out it in cpu specifications from intel. Then, you wonder, "Who decided it ?"
- ''2nd'' , you may wonder:
- >"0x7C00 is 32KiB - 1024B at decimal number. What's this number means ?"
- Anyone decided it. But, why he/she decided such a halfway address?
- Hum...There're TWO questions(mysteries) arround the magic number "0x7C00".
- + Who decided "0x7C00" ?
- + What "0x7C00 = 32KiB - 1024B" means ?
- Okay, let's dive into the secret of BIOS for "IBM PC 5150", ancestor of modern x86(32bit) PCs, with me...!!
- #more||
- * "0x7C00" First appeared in IBM PC 5150 ROM BIOS INT 19h handler.
- Wandering arround the history of x86 IBM Compatible PC, you know ''IBM PC 5150'' is the ancestor of modern x86(32bit) IBM PC/AT Compatible PCs.
- This PC was released at 1981 August, with Intel 8088(16bit) and 16KiB RAM(for minimum memory model). BIOS and Microsoft BASIC was stored in ROM.
- When power on, BIOS processes "POST"(Power On Self Test) procedure, and after, ''call INT 19h'' .
- In INT 19h handler, BIOS checks that PC has any of floppy/hard/fixed diskette or not have.
- If PC has any of available diskkete, BIOS loads a first sector(512B) of diskette into 0x7C00.
- Now, you understand why you couldn't find out this magic number in x86 documents. ''This magic number belongs to BIOS specification.''
- * The origin of 0x7C00
- Stories surrounding IBM PC DOS, Microsoft, and SCP's 86-DOS are famous stories. See: [["A Short History of MS-DOS">http://www.patersontech.com/dos/Byte/History.html]].
- SCP's "86-DOS"(at 1980) is the reference OS for IBM PC DOS 1.0.
- 86-DOS(early called "QDOS") is CP/M compatible OS for 8086/8088 cpu. At 1979, Digital Research Inc didn't have developed CP/M for 8086/8088 cpu yet.
- SCP sold two S-100 bus board, one is 8086 CPU board, two is "CPU Monitor" rom board.
- "CPU Monitor" program provided bootloader and debugger. ''This "CPU Monitor" bootloader loaded MBR into "0x200", NOT "0x7C00"'' . In 1981, IBM PC DOS was the NEXT CP/M like OS for 8086/8088.
- So, I told you that "0x7C00 ''FIRST appeared'' in IBM PC 5150 ROM BIOS".
- Previous one, SCP's CPU Monitor bootloader loads into 0x200, not 0x7C00.
- ** Why that CPU Monitor's bootloader loeded MBR into "0x200" ?
- There're THREE reasons about "0x200".
- + 8086 Interrupts Vector use 0x0 - 0x3FF.
- + 86-DOS was loaded from 0x400.
- + 86-DOS didn't use interrupts vectors between 0x200 - 0x3FF.
- These reasons mean 0x200 - 0x3FF needed to be reserved and couldn't be in the way of an OS, no matter where 86-DOS or user application wanted to load.
- So Tim Paterson (86-DOS developer) chose 0x200 for MBR load address.
- * Q:Who decided "0x7C00" ? - A: IBM PC 5150 BIOS Developer Team.
- "0x7C00" was decided by IBM PC 5150 BIOS developer team (Dr. David Bradley).
- As mentioned above, this magic number was born at 1981 and "IBM PC/AT Compat" PC/BIOS vendors did not change this value for BIOS and OS's backward compatibility.
- Not Intel(8086/8088 vendor) nor Microsoft(OS vendor) decided it.
- * Q:What "0x7C00 = 32KiB - 1024B" means ? A: Affected by OS requirements and CPU memory layout.
- IBM PC 5150 minimum memory model had only 16KiB RAM. So, you may have a question.
- >"Could minimum memory model (16KiB) load OS from diskette ? BIOS loads MBR into 32KiB - 1024B address, but physical RAM is not enough..."
- No, that case was ''out of consideration'' . One of IBM PC 5150 ROM BIOS Developer Team Members, Dr. David Bradley says:
- >"DOS 1.0 required a minimum of 32KB, so we weren't concerned about attempting a boot in 16KB."
- (Note: DOS 1.0 required 16KiB minimum ? or 32KiB ? I couldn't find out which correct. But, at least, in 1981's early BIOS development, they supposed that 32KiB is DOS minimum requirements.)
- BIOS developer team decided 0x7C00 because:
- + They wanted to leave as much room as possible for the OS to load itself within the 32KiB.
- + 8086/8088 used 0x0 - 0x3FF for interrupts vector, and BIOS data area was after it.
- + The boot sector was 512 bytes, and stack/data area for boot program needed more 512 bytes.
- + So, 0x7C00, the last 1024B of 32KiB was chosen.
- Once OS loaded and started, boot sector is never used until power reset. So, OS and application can use the last 1024B of 32KiB freely.
- After OS loaded, memory layout will be:
- #pre||>
- +--------------------- 0x0
- | Interrupts vectors
- +--------------------- 0x400
- | BIOS data area
- +--------------------- 0x5??
- | OS load area
- +--------------------- 0x7C00
- | Boot sector
- +--------------------- 0x7E00
- | Boot data/stack
- +--------------------- 0x7FFF
- | (not used)
- +--------------------- (...)
- ||<
- That are the origin and reasons of "0x7C00", the magic number survived for about three decades in PC/AT Compat BIOS INT 19h handler.
- * References
- 86-DOS related:
- - "8086 Monitor Instruction Manual"(MON 86 - V1.4)
- - "86-DOS(TM) User's Manual Version 0.3"
- - "86-DOS(TM) Programmer's Manual Version 0.3"
- - "86-DOS(TM) Instruction Manual Version ??"
- IBM PC 5150 related:
- - "IBM Personal Computer Hardware Reference Library", "Technical Reference" (IBM Personal Computer Technical Reference manual)
- - "IBM Personal Computer XT Hardware Reference Library", "Technical Reference" (IBM Personal Computer XT Technical Reference manual)
- Intel 8086/8088 data sheets:
- - "8086 16-BIT HMOS MICROPROCESSOR"
- - "M80C86/M80C86-2 16-BIT CHMOS MICROPROCESSOR"
- - "8088 8-BIT HMOS MICROPROCESSOR"
- CP/M related:
- - The Unofficial CP/M Web Site
- -- http://www.cpm.z80.de/
- - CP/M Internals : Oscar Vermeulen Personal Web Site
- -- http://www.dcast.vbox.co.uk/cpm.html
- - Digital Research - CP/M
- -- http://www.digitalresearch.biz/CPM.HTM
- - CP/M Main Page
- -- http://www.seasip.demon.co.uk/Cpm/
- 86-DOS related:
- - Origins of DOS - Paterson Technology
- -- http://www.patersontech.com/dos/
- - 86-DOS Resource Website
- -- http://www.86dos.org/index.htm
- - DosMan Drivel
- -- http://dosmandrivel.blogspot.com/
- And all related Wikipedia pages.
- * Special Thanks To...
- Special Thanks To:
- - Tim Peterson
- - David Bradley
- for japanese article, see:
- "Assembler/なぜx86ではMBRが"0x7C00"にロードされるのか?(完全版)"
- https://www.glamenv-septzen.net/view/614
|