OSDev.org

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

All times are UTC - 6 hours




Post new topic Reply to topic  [ 2 posts ] 
Author Message
 Post subject: global array probably overwrites idt
PostPosted: Sat Jul 23, 2022 3:01 pm 
Offline

Joined: Sat Jul 23, 2022 2:32 pm
Posts: 1
Hello! I'm a beginner os dev and I am developing a 32 bit os with a custom bios bootloader.
I set up the GDT and the IDT and i successfully implemented keyboard support so far.
I now want to enable paging, so I started by getting the memory map using "INT 0x15, EAX = 0xE820" as suggested by the wiki and I wanted to store the result in a bitmap(usable/unusable RAM), so i can continue creating the page frame allocator. I have a 32768 uin32_t bitmap that is represented as a global array in kernel code. Unfortunately, when i want to go through it (using a for from 0 to 32768 for example), I noticed that it overwrites memory I didn't want to and I think it overwrites even the IDT, as shown below by BOCHS.
The kernel is loaded at 0x1000.

Code:
(0) [0x000000001f70] 0008:0000000000001f70 (unk. ctxt): mov dword ptr ds:[eax*4+15776], 0x08080808 ; c70485a03d000008080808


The bitmap is stored at 15776(I found out by trying to debug my code).
Code:
<bochs:8> info idt
Interrupt Descriptor Table (base=0x0000000000003480, limit=2047):
IDT[0x00]=32-Bit Interrupt Gate target=0x0008:0x000015ba, DPL=0
IDT[0x01]=32-Bit Interrupt Gate target=0x0008:0x000015c1, DPL=0
IDT[0x02]=32-Bit Interrupt Gate target=0x0008:0x000015c8, DPL=0
IDT[0x03]=32-Bit Interrupt Gate target=0x0008:0x000015cf, DPL=0
IDT[0x04]=32-Bit Interrupt Gate target=0x0008:0x000015d6, DPL=0
IDT[0x05]=32-Bit Interrupt Gate target=0x0008:0x000015dd, DPL=0
IDT[0x06]=32-Bit Interrupt Gate target=0x0008:0x000015e4, DPL=0
IDT[0x07]=32-Bit Interrupt Gate target=0x0008:0x000015eb, DPL=0
IDT[0x08]=32-Bit Interrupt Gate target=0x0008:0x000015f5, DPL=0
IDT[0x09]=32-Bit Interrupt Gate target=0x0008:0x000015fd, DPL=0
IDT[0x0a]=32-Bit Interrupt Gate target=0x0008:0x00001607, DPL=0
IDT[0x0b]=32-Bit Interrupt Gate target=0x0008:0x0000160f, DPL=0
IDT[0x0c]=32-Bit Interrupt Gate target=0x0008:0x00001617, DPL=0
IDT[0x0d]=32-Bit Interrupt Gate target=0x0008:0x0000161f, DPL=0
IDT[0x0e]=32-Bit Interrupt Gate target=0x0008:0x00001627, DPL=0
IDT[0x0f]=32-Bit Interrupt Gate target=0x0008:0x0000162f, DPL=0
IDT[0x10]=32-Bit Interrupt Gate target=0x0008:0x00001639, DPL=0
IDT[0x11]=32-Bit Interrupt Gate target=0x0008:0x00001643, DPL=0
IDT[0x12]=32-Bit Interrupt Gate target=0x0008:0x0000164d, DPL=0
IDT[0x13]=32-Bit Interrupt Gate target=0x0008:0x00001657, DPL=0
IDT[0x14]=32-Bit Interrupt Gate target=0x0008:0x00001661, DPL=0
IDT[0x15]=32-Bit Interrupt Gate target=0x0008:0x0000166b, DPL=0
IDT[0x16]=32-Bit Interrupt Gate target=0x0008:0x00001675, DPL=0
IDT[0x17]=32-Bit Interrupt Gate target=0x0008:0x0000167f, DPL=0
IDT[0x18]=32-Bit Interrupt Gate target=0x0008:0x00001689, DPL=0
IDT[0x19]=32-Bit Interrupt Gate target=0x0008:0x00001693, DPL=0
IDT[0x1a]=32-Bit Interrupt Gate target=0x0008:0x0000169d, DPL=0
IDT[0x1b]=32-Bit Interrupt Gate target=0x0008:0x000016a7, DPL=0
IDT[0x1c]=32-Bit Interrupt Gate target=0x0008:0x000016b1, DPL=0
IDT[0x1d]=32-Bit Interrupt Gate target=0x0008:0x000016bb, DPL=0
IDT[0x1e]=32-Bit Interrupt Gate target=0x0008:0x000016c5, DPL=0
IDT[0x1f]=32-Bit Interrupt Gate target=0x0008:0x000016cf, DPL=0
IDT[0x20]=32-Bit Interrupt Gate target=0x0008:0x000016d9, DPL=0
IDT[0x21]=32-Bit Interrupt Gate target=0x0008:0x000016e3, DPL=0
IDT[0x22]=32-Bit Interrupt Gate target=0x0008:0x000016ed, DPL=0
IDT[0x23]=32-Bit Interrupt Gate target=0x0008:0x000016f7, DPL=0
IDT[0x24]=32-Bit Interrupt Gate target=0x0008:0x00001701, DPL=0
IDT[0x25]=32-Bit Interrupt Gate target=0x0008:0x0000170b, DPL=0
IDT[0x26]=32-Bit Interrupt Gate target=0x0008:0x00001715, DPL=0
IDT[0x27]=32-Bit Interrupt Gate target=0x0008:0x0000171f, DPL=0
IDT[0x28]=32-Bit Interrupt Gate target=0x0008:0x00001729, DPL=0
IDT[0x29]=32-Bit Interrupt Gate target=0x0008:0x00001733, DPL=0
IDT[0x2a]=32-Bit Interrupt Gate target=0x0008:0x0000173d, DPL=0
IDT[0x2b]=32-Bit Interrupt Gate target=0x0008:0x00001747, DPL=0
IDT[0x2c]=32-Bit Interrupt Gate target=0x0008:0x00001751, DPL=0
IDT[0x2d]=32-Bit Interrupt Gate target=0x0008:0x0000175b, DPL=0
IDT[0x2e]=32-Bit Interrupt Gate target=0x0008:0x00001765, DPL=0
IDT[0x2f]=32-Bit Interrupt Gate target=0x0008:0x0000176f, DPL=0


This is the IDT + entries.

Code:
<bochs:9> info gdt
Global Descriptor Table (base=0x0000000000007f15, limit=23):
GDT[0x0000]=??? descriptor hi=0x00000000, lo=0x00000000
GDT[0x0008]=Code segment, base=0x00000000, limit=0xffffffff, Execute/Read, Non-Conforming, Accessed, 32-bit
GDT[0x0010]=Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed


This is the gdt + entries.

Code:
00015823627e[CPU0  ] interrupt(): not accessible or not code segment cs=0x0008
00015823627e[CPU0  ] interrupt(): not accessible or not code segment cs=0x0008
00015823627e[CPU0  ] interrupt(): not accessible or not code segment cs=0x0008
(0).[15823627] [0x000000001005] 0008:0000000000001005 (unk. ctxt): jmp .-2  (0x00001005)     ; ebfe
00015823627e[CPU0  ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting

And the error generated by the possible overwrite.
Code:
uint32_t bitmap[PAGE_NUMBER];

void init_bitmap()
{
   mem_map* mmap = (mem_map*)MEM_MAP_LOCATION;

    //initialize bitmap with PAGE_ALLOCATED
   for (size_t i = 0; i < PAGE_NUMBER; ++i)
   {
        bitmap[i] = 0x08080808;
   }

}



And this is the code for initializing the bitmap if it helps.(the value used for initialization is just a debug value)

I really don't know how to solve this issue. Can you please help me?


Top
 Profile  
 
 Post subject: Re: global array probably overwrites idt
PostPosted: Mon Jul 25, 2022 10:10 am 
Offline
Member
Member

Joined: Mon Mar 25, 2013 7:01 pm
Posts: 5100
lowLevelGod wrote:
The bitmap is stored at 15776(I found out by trying to debug my code).

Code:
<bochs:9> info gdt
Global Descriptor Table (base=0x0000000000007f15, limit=23):

Your bitmap is stored at address 0x3DA0 and its length is 0x20000 bytes.

Your GDT is stored at address 0x7F15.

It's just a coincidence that the first access to your GDT after you've overwritten it is an interrupt.


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

All times are UTC - 6 hours


Who is online

Users browsing this forum: Majestic-12 [Bot] and 62 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