Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
611 views
in Technique[技术] by (71.8m points)

operating system - How to load kernel into memory from CD-ROM using Assembly (NASM)

I'm writing a bootstrap and kernel for myself and both bootstrap and kernel will be burn on a CD-R and will function as a CD-live. It is not a linux CD-Live or something else,is totally my own bootloader and kernel. I do not want to use other booloaders (i.e. GRUB) so please don't suggest me to use them.

Here is my question: In my bootloader ASM code, I want to load my kernel and kernel entry into the RAM from CD-ROM (not from hard disk or floppy disk), and lets assume that we know where the kernel located exactly on the CD-ROM (sector number). As far as I know I have to use int 0x13, AH = 02h which will read sectors from Drive in to the RAM. In order to use this interrupt service,I have to set couple of registers that I'll list bellow: Parameters: AH 02h AL Sectors To Read Count CX Track + Sector / See remark DH Head DL Drive ES:BX Buffer Address Pointer

My problem is about DL and DH.In order to point to 1st hard drive to read from, we can set it to 80h or, for floppy disk we can set it to 00h. But I want to read from CD-ROM and I don't know what values I have to use for DH and DL.

In order to read from CD-ROM couple of sectors into to the RAM is it a right interrupt (int 0x13)? if yes, what value should I have to put for DH and DL.

Regards, Pooria.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

For the BIOS to load your boot sector from CD, you'll need to make the CD bootable by using the "El Torito" standard.

Once you use that, you have two options
a. Emulation - the BIOS emulates either a floppy or hard drive, and you can read your kernel through the INT13 calls with either device 00 or device 80.
b. The device doesn't emulate, and you can read directly from the CD using the INT13 ExtendedRead function.

To see how this is done, look at the Linux "ISOLINUX" loader - ISOLINUX.ASM

To provide a more specific starting point to your question, El Torito spec,section 5.3:

Once the system jumps to segment:0, the program can retrieve its boot
information by issuing INT 13, Function 4B, AL=01.  After the boot process
has been initiated the INT 13 Extensions (functions 41-48) will access the
CD using 800 byte sectors and the LBA address provided to INT 13 is an
absolute sector number. This gives any program running in no emulation mode
the ability to locate the boot catalog, and any other information on the
CD, without providing a device driver.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...