여기 내 커널에서 사용하는 프로세스입니다 (32 비트 임). 내 부트 스트랩 어셈블리 파일, 나는 메모리지도 나를 제공하기 위해 GRUB 알려주기 :
다음
.set MEMINFO, 1 << 1 # Get memory map from GRUB
는 GRUB (이 구조는 메모리 맵의 주소를 포함) 당신을 위해 ebx
로 멀티 부팅 정보 구조의 주소를로드 . 그런 다음 C 코드를 호출하여 메모리 맵의 실제 반복 및 처리를 처리합니다. 나는이 같은 맵을 반복 수행 multiboot_info_t
및 multiboot_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은이 기능을 시작하기에 좋은 링크입니다.
참조 http://wiki.osdev.org/Detecting_Memory_%28x86%29#Memory_Map_Via_GRUB 및 http://www.gnu.org/software/grub/manual/multiboot/multiboot.html –