2014-10-31 1 views
5

저는 주로 학습 목적으로 80386 프로세서를위한 작은 커널을 만들고 사용 가능한 RAM의 전체 메모리 맵을 얻고 싶습니다.GRUB을 사용하여 BIOS를 쿼리하는 방법은 무엇입니까?

BIOS를 직접 쿼리하는 것보다 GRUB을 사용하는 것이 가능하고 더 좋은 방법이라고 읽었습니다.

아무도 말해 줄 수 있습니까?

특히 실제 모드에서 BIOS 기능을 사용하기 위해 BIOS 인터럽트를 사용하고 일부 레지스터에서 원하는 값을 얻습니다. GRUB에서 제공하는 기능을 사용하고자 할 때 실제 동등한 방법은 무엇입니까?

+2

참조 http://wiki.osdev.org/Detecting_Memory_%28x86%29#Memory_Map_Via_GRUB 및 http://www.gnu.org/software/grub/manual/multiboot/multiboot.html –

답변

2

여기 내 커널에서 사용하는 프로세스입니다 (32 비트 임). 내 부트 스트랩 어셈블리 파일, 나는 메모리지도 나를 제공하기 위해 GRUB 알려주기 :

다음
.set MEMINFO, 1 << 1     # Get memory map from GRUB 

는 GRUB (이 구조는 메모리 맵의 주소를 포함) 당신을 위해 ebx로 멀티 부팅 정보 구조의 주소를로드 . 그런 다음 C 코드를 호출하여 메모리 맵의 실제 반복 및 처리를 처리합니다. 나는이 같은 맵을 반복 수행 multiboot_info_tmultiboot_memory_map_t이는 GNU multiboot.h 파일로 정의됩니다

/* Macro to get next entry in memory map */ 

#define MMAP_NEXT(m) \ 
      (multiboot_memory_map_t*)((uint32_t)m + m->size + sizeof(uint32_t)) 

void read_mmap(multiboot_info_t* mbt){ 

    multiboot_memory_map_t* mmap = (multiboot_memory_map_t*) mbt->mmap_addr; 


    /* Iterate over memory map */ 

    while((uint32_t)mmap < mbt->mmap_addr + mbt->mmap_length) { 

     // process the current memory map entry 

     mmap = MMAP_NEXT(mmap); 
    } 
} 

. Andrew Medico가 의견에 게시 한대로 here은이 기능을 시작하기에 좋은 링크입니다.

관련 문제