Невозможно ввести из 16 бит в режим 32 бит [дубликат]

Это очень легко сделать с типом географии в SQL Server 2008.

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm

4326 является SRID для модели эллипсоидальной Земли WGS84

1
задан Michael Petch 23 December 2016 в 19:05
поделиться

1 ответ

Поскольку я могу только предположить, что вы правильно прочитали сектора в памяти на 0x1000: 0x0000, я могу указать только на потенциальные проблемы в kernel.asm и gdt.inc.


Проблемы с кодом

Если вы достигли стадии ядра с jmp 0x1000:0x0000 (я подозреваю, что это так), то в kernel.asm вы неправильно установили DS и ES сегментных регистров до неправильного значения. В этом случае вам необходимо установить эти два регистра в 0x1000, а не 0x0000. Этот код:

    xor ax,ax
    mov ds,ax
    mov es,ax

необходимо изменить на:

    mov ax,0x1000
    mov ds,ax
    mov es,ax

. Следующая важная проблема заключается в том, что запись GDT (внутри toc) принимает линейный адрес. Линейный адрес в реальном режиме - это то же самое, что и физический адрес. В руководстве по набору инструкций говорится:

Исходный операнд указывает 6-байтовую ячейку памяти, содержащую базовый адрес (линейный адрес) и лимит (размер таблицы в байтах) глобальная таблица дескрипторов (GDT)

Вы использовали ORG 0x0000 (поскольку вы не указали один) для kernel.asm, поэтому NASM предполагает, что все смещения сгенерированы из базы 0x0000, включая метку gdt_data. Поэтому, когда вы это сделаете:

toc:
dw end_of_gdt - gdt_data -1
dd gdt_data

gdt_data будет небольшим смещением чуть выше 0x0000. В физической памяти ваша запись GDT на самом деле равна 0x1000: 0x0000 + (небольшое смещение). 0x1000: 0x0000 в физической (линейной) памяти (0x1000 & lt; 4) + 0x0000 = 0x10000, поэтому вам нужно добавить это к gdt_data. Ваш toc должен выглядеть следующим образом:

toc:
dw end_of_gdt - gdt_data -1
dd gdt_data+0x10000

Следующая проблема заключается в том, что вы фактически не включили флаг защищенного режима. У вас есть это:

    mov eax,cr0
    or eax,1

Это должно быть:

    mov eax,cr0
    or eax,1
    mov cr0, eax

Вам необходимо обновить бит защищенного режима в регистре CR0 после того, как вы установили бит в 1.


В связи с проблемой GDT вы создали записи GDT для сегмента кода из смещения 0x00000000, который охватывают все 4gb адресного пространства. Это верно. Опять же, поскольку NASM создал смещение от 0x0000, и ваш код действительно загружен с 0x1000: 0x0000 (физический адрес 0x10000), вам нужно добавить 0x10000 в значение метки stage3 в JMP JMP , который, наконец, устанавливает защищенный режим. Кроме того, поскольку мы кодируем значение, превышающее 0xFFFF, нам нужно заставить NASM использовать 32-разрядный операнд, поэтому мы используем квалификатор dword на JMP. У вас есть это:

jmp 08h:Stage3

Это должно быть так:

jmp dword 08h:Stage3+0x10000
2
ответ дан Michael Petch 18 August 2018 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: