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
과 같은 주소 목록이 하나 있지만 실제로 길이 필드가 채워져 있지만 예상치 못한 부분이 있습니다. 내가 이해하지 못하는 것이 있습니까?
quotation : "base_addr_low가 시작 주소의 하위 32 비트이고 base_addr_high가 상위 32 비트입니다."res = baselow + basehigh << 32이지만 res가 있어야합니다. 64 비트 포인터 – fazo
왜 길이가 0입니까? 시작 주소와 다음 예약 주소를 기준으로 목록을 정렬해야합니까? 나는 length_low와 high combined이 연결된 목록의 다음 항목과 같을 것이라고 생각했을 것입니다. – Philluminati
내가 제공 한 wiki 링크에 따르면, 그들은 조합이고, 나는 부호없는 long long x를 사용할 수 있습니다. – Philluminati