OSDev.org

The Place to Start for Operating System Developers
It is currently Thu Mar 28, 2024 3:41 pm

All times are UTC - 6 hours




Post new topic Reply to topic  [ 8 posts ] 
Author Message
 Post subject: Creating image of OS to run with qemu.
PostPosted: Thu Oct 31, 2019 2:13 am 
Offline
Member
Member

Joined: Sat Dec 19, 2015 10:48 am
Posts: 42
I have executable code for my simple OS in a binary file (jsec2.bin) created using nasm assembler. I have been running it from a flash drive with a boot sector that loads the executable to memory and jumps to it. File jsec2.bin is not bootable by itself. I want to start running it with qemu - no flash drive involved. I do not want qemu to use a virtual flash drive either. I want to use the qemu floppy image switch, -fda. However the -fda switch will only work if there is a aa55 boot sector mark at the end of the first sector of the image.

qemu-system-i386 -fda jsec2.bin will not work. Here's some other possibilities:

1) I need an image of a bootable floppy with a bootsector that jumps to a file named jsec2.bin just like an msdos boot sector jumps to the file named IO.SYS contained in the file system on the disk. Is there a tool that I can adapt to this purpose?

2) possibly there is some way to make a grub floppy image or iso that boots the executable in jsec2.bin. If there is a way using a grub tool?

Actually, both of these ideas suck because I want to use qemu for running the code as I develop it and these ideas are slow and cumbersome. Any suggestions will be appreciated. Thanks Bill S.


Top
 Profile  
 
 Post subject: Re: Creating image of OS to run with qemu.
PostPosted: Thu Oct 31, 2019 2:34 am 
Offline
Member
Member
User avatar

Joined: Sat Mar 31, 2012 3:07 am
Posts: 4591
Location: Chichester, UK
Make your file a multiboot file and then qemu can run it directly.


Top
 Profile  
 
 Post subject: Re: Creating image of OS to run with qemu.
PostPosted: Thu Oct 31, 2019 2:43 am 
Offline
Member
Member

Joined: Mon Mar 25, 2013 7:01 pm
Posts: 5100
bilsch01 wrote:
1) I need an image of a bootable floppy with a bootsector that jumps to a file named jsec2.bin just like an msdos boot sector jumps to the file named IO.SYS contained in the file system on the disk. Is there a tool that I can adapt to this purpose?

You can use dd to create a blank image of the correct size, mkdosfs to format it, and mtools to copy your file. You'll have to come up with your own boot sector (or customize someone else's), but once you have that you can use dd to install it.

bilsch01 wrote:
2) possibly there is some way to make a grub floppy image or iso that boots the executable in jsec2.bin. If there is a way using a grub tool?

No. Your file needs to be compatible with multiboot for GRUB to load it.


Top
 Profile  
 
 Post subject: Re: Creating image of OS to run with qemu.
PostPosted: Thu Oct 31, 2019 11:54 am 
Offline
Member
Member

Joined: Fri Aug 26, 2016 1:41 pm
Posts: 671
Is it correct you already have a bootloader that loads jsec2.bin when booted from the flash drive? I'm at present uncertain exactly how your existing one works. Can you post the code for the bootloader you are using to boot from the flash drive?


Top
 Profile  
 
 Post subject: Re: Creating image of OS to run with qemu.
PostPosted: Thu Oct 31, 2019 11:23 pm 
Offline
Member
Member

Joined: Sat Dec 19, 2015 10:48 am
Posts: 42
The OS is 16 sectors starting at sector 1 of the flashdrive partition /sdb1, which is sector 2 of the flashdrive.


bits 16
org 0x7c00

mov ax,0
mov ss,ax
mov sp,0x7b00
mov ds,ax

mov si,0x7b00 ;packet location
mov word[si],0x10 ;packet size
mov word[si+2],16 ;# of secs to transfer
mov word[si+4],0x0000 ;offset where to load
mov word[si+6],0x07e0 ;segment where to load
mov word[si+8],2 ;start sector# - mbr=0, this=1
mov word[si+10],0
mov word[si+12],0
mov word [si+14],0
mov ah,0x42 ;extended read
int 0x13
jc berr

mov ax,0x0e31 ;CF=0=success, print 1
int 0x10

jmp 0:0x7e00

berr:
mov ax,0x0e45 ;CF=1=failed, print E
int 0x10
jmp $

times 510-($-$$) db 'k'
dw 0xAA55


Top
 Profile  
 
 Post subject: Re: Creating image of OS to run with qemu.
PostPosted: Fri Nov 01, 2019 4:35 am 
Offline
Member
Member

Joined: Fri Aug 26, 2016 1:41 pm
Posts: 671
Your boot sector doesn't have partition data in it. Any reason why you just don't create a disk image with that boot sector and kernel? If you were willing to boot with QEMU using -hda then your boot sector wouldn't even need to change. If you want to use -fda you'd have to convert your bootloader to use CHS and Int 0x13/AH=2. If you were willing to simply boot as a HD image then you could do something like:
Code:
# Create a 10MB disk image
dd if=/dev/zero of=disk.img bs=1M count=10

# Place boot sector boot.bin at LBA=0
dd if=boot.bin of=disk.img conv=notrunc

# Place kernel file kernel.bin at LBA=2
dd if=kernel.bin of=disk.img conv=notrunc seek=2
It's unclear if you want to read from a partition like FAT by looking for a file or whether you are willing to accept reading directly from the disk image like you are doing with the flash drive.


Top
 Profile  
 
 Post subject: Re: Creating image of OS to run with qemu.
PostPosted: Fri Nov 01, 2019 8:57 pm 
Offline
Member
Member

Joined: Sat Dec 19, 2015 10:48 am
Posts: 42
OK. Thanks. I did something very similar to what you said. It is working partly, but the int 0x13 operation performed in the boot sector is returning an error code: 0Ch unsupported track or invalid media. I have never seen this before when I was using real hardware (flash drives).

My HD image is 17 sectors as follows:
sector 1: boot sector very similar to what I posted but with error reporting capability. See listing below.
sectors 2 thru 17: my operating system, jsec2.bin

Please note: I include the format=raw in command line: qemu-system-i386 -hda js1.bin format=raw
but it won't run unless I remove format=raw. Then it runs and reports the 0Ch error. Qemu says:
WRITE OPERATIONS ON BLOCK 0 WILL BE RESTRICTED - because format=raw was not specified.
I wonder if that is what is causing the 0Ch error.

Here is the revised boot sector:
Code:
bits 16
org 0x7c00

mov ax,0
mov ss,ax
mov sp,0x7aff
mov ds,ax

mov si,0x7b00 ;packet location
mov word[si],0x10 ;packet size
mov word[si+2],16 ;# of secs to transfer
mov word[si+4],0x0000 ;offset  where to load
mov word[si+6],0x07e0 ;segment where to load
mov word[si+8],2 ;start sector# - mbr=0, this=1
mov word[si+10],0   
mov word[si+12],0
mov word [si+14],0
mov ah,0x42 ;extended read
mov dl,0x80
int 0x13
jc berr

mov ax,0x0e31 ;CF=0=success, print 1
int 0x10

   
jmp 0:0x7e00 ;long jump

berr:
push ax      ;save error code from int 13
mov ax,0x0e45 ;CF=1=failed, print E
int 0x10
pop ax

mov   cx,2         ;print the 2 digits in ah
hexout:
   rol ax,4      ;put hi hex digit on right
   push ax         ;save rol'd ax
   and al,0x0f
   add al,'0'      ;0 thru 9
   cmp al,'9'
   jbe .prnhx
   add al,0x7      ;A thru F
.prnhx:
   mov ah,0xe         
   int 0x10      ;write
   pop ax         ;rol'd version of ax
   dec cx
   jnz hexout      ;1 digit per loop

jmp $

times 510-($-$$) db 'k'
dw 0xAA55


Last edited by JAAman on Sun Nov 03, 2019 8:48 am, edited 1 time in total.
added code tags


Top
 Profile  
 
 Post subject: Re: Creating image of OS to run with qemu.
PostPosted: Fri Nov 01, 2019 11:07 pm 
Offline
Member
Member

Joined: Fri Aug 26, 2016 1:41 pm
Posts: 671
I suspect you are getting error 0x0c is because you haven't created a disk image with 18 full sectors. If you ask QEMU to read a sector beyond the edge of the disk image file then it will usually fail. That was one of the reasons that in my example I used DD to make a 10MB disk image (far more than just 18 sectors but you could have created a 9216 byte image file for 18 complete sectors). After making a 10MB image I then used DD again to insert the bootsector at the beginning of the image (LBA=0) and the kernel starting at LBA=2.

As for using raw=format you should be able to do this to boot as the first hard drive:
Code:
qemu-system-i386 -drive file=disk.img,format=raw


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC - 6 hours


Who is online

Users browsing this forum: Bing [Bot] and 61 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group