2010-11-21 1 views
0

Grub은 멀티 부팅 호환 부트 로더입니다. 운영 체제를 부팅 할 때 사용 가능한 메모리를 정의하는 구조를 만들고 해당 구조에 대한 포인터를 메모리에 남겨 둡니다.grub에서 오는이 C 데이터 구조를 사용하는 방법을 누군가가 추방 할 수 있습니까? 안녕 mem 및 lo mem을 이해하지 못합니다.

typedef struct memory_map 
{ 
    unsigned long size; 
    unsigned long base_addr_low; 
    unsigned long base_addr_high; 
    unsigned long length_low; 
    unsigned long length_high; 
    unsigned long type; 
} memory_map_t; 

그래서 내가 메모리 맵 구조의 컬렉션을 가지고 :

http://wiki.osdev.org/Detecting_Memory_(x86)#Memory_Map_Via_GRUB

이에 내가 관심이 생각하는 구조입니다 : 내가 여기에 그 정보를 가지고

. 위의 페이지에서 언급했듯이 GRUB 프롬프트에서 "displaymem"을 입력하여 메모리 맵을 볼 수 있습니다. 이것은 내 output

하지만 완전히 구조를 이해하지 못하는 ....

이유는 길이가 0 (0x0으로)으로 설정되어

? 낮은 메모리와 높은 메모리를 결합해야합니까?

__int64 full_address = (low_mem_addr + high_mem_addr);

또는 내가 독점적으로 낮고 높은 주소를 모두 포함하는 한 목록을 얻고있다 :

그것은 값이 함께 같은 그래서 함께 "저 MEM과 높은 MEM"를 밀어 않은 64 비트에 말한다 그들?

32 비트 컴퓨터를 사용하고 있기 때문에 기본적으로 두 값으로 각 고유 주소를 참조합니까?

displaymem과 같은 주소 목록이 하나 있지만 실제로 길이 필드가 채워져 있지만 예상치 못한 부분이 있습니다. 내가 이해하지 못하는 것이 있습니까?

+1

quotation : "base_addr_low가 시작 주소의 하위 32 비트이고 base_addr_high가 상위 32 비트입니다."res = baselow + basehigh << 32이지만 res가 있어야합니다. 64 비트 포인터 – fazo

+0

왜 길이가 0입니까? 시작 주소와 다음 예약 주소를 기준으로 목록을 정렬해야합니까? 나는 length_low와 high combined이 연결된 목록의 다음 항목과 같을 것이라고 생각했을 것입니다. – Philluminati

+0

내가 제공 한 wiki 링크에 따르면, 그들은 조합이고, 나는 부호없는 long long x를 사용할 수 있습니다. – Philluminati

답변

0

기본적으로 이것은 두 개의 변수입니다. 64 비트 숫자이므로 위의 내용과 아래의 내용이 동일합니다.

typedef struct memory_map 
{ 
    unsigned long size; 
    //unsigned long base_addr_low; 
    //unsigned long base_addr_high; 
    unsigned long long base_addr; 
    // unsigned long length_low; 
    // unsigned long length_high; 
    unsigned long long length; //holds both halves. 
    unsigned long type; 
} memory_map_t; 

이 같은 두 개의 반쪽을 얻을 수 있습니다 :

unsigned long base_addr_low = base_addr 
unsigned long base_addr_high = base_addr >> 32 

이 질문은 그냥 간단했다. : -s

관련 문제