Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/49: Рейтинг темы: голосов - 49, средняя оценка - 4.67
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
09.11.2023, 17:25
Студворк — интернет-сервис помощи студентам
ну вот, можешь-же..
теперь хоть можно декодировать его.
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.11.2023, 17:25
Ответы с готовыми решениями:

Джаббер сервер для Win x64
В поисковиках смотрел, но так и не нашел ни чего подходящего. Нужен джаббер сервер на Windows server 2008 x64. Кто что посоветует?

Сервер Domino 8.5.3 X64 И Файл Подкачки (pagefile)
Ребята, проблема в следующем: Имеется сервер Domino x64 8.5.3 с последними фиксапами. Оперативы 16 Гбайт. В последнее время админы...

Как перенести веб-сервер со всеми конфигами с Windows 10 x64 на Debian (ARM)?
В составе веб-сервера: Apache2 (2.4), PHP 7.3, MySQL 5.7, а также веб-сайт WordPress с плагинами и конфигом под ip windows-ноутбука. ...

209
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
09.11.2023, 19:01
Вот несколько заметок по этому дампу:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     00 01 02 03 04 05 06 07  08 09 0A 0B 0C 0D 0E 0F
     ------------------------------------------------
00:  F4 1A 00 10 03 01 10 00  00 00 00 02 00 00 00 00
10:  01 C0 00 00 00 10 BD FE  00 00 00 00 00 00 00 00
20:  0C 00 00 FE 00 00 00 00  00 00 00 00 F4 1A 01 00
30:  00 00 B8 FE 98 00 00 00  00 00 00 00 0B 01 00 00
40:  09 00 10 01 04 00 00 00  00 00 00 00 00 10 00 00
50:  09 40 10 03 04 00 00 00  00 10 00 00 00 10 00 00
60:  09 50 10 04 04 00 00 00  00 20 00 00 00 10 00 00 
70:  09 60 14 02 04 00 00 00  00 30 00 00 00 10 00 00
80:  04 00 00 00 09 70 14 05  00 00 00 00 00 00 00 00 
90:  00 00 00 00 00 00 00 00  11 84 03 00 01 00 00 00
A0:  01 08 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
B0:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
C0:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
D0:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
E0:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
F0:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
 
• Offs(04) = 0x0103 (Command Register). Биты(1:0) разрешают доступ к портам I/O и памяти MMIO
• Offs(0B) = 0x02   (PCI ClassCode). Класс устройства: 02 = Ethernet Adapter
• Offs(2E) = 0x0001 (Sub-DeviceID). Virtio - это многофункциональный девайс, а 01 = VirtioNet
• Offs(30) = 0xFEB80000 (Expansion ROM). Адрес флэшки ПЗУ девайса (если валидный, бит(0) должен быть 1)
• Offs(3C) = 0x0B   (IRQ pin). Линия прерывания к PIC/APIC, здесь = IRQ.11
• Offs(3D) = 0x01   (Int pin). Линия прерывания слота PCI,  здесь = INT#A (далее B,C,D)
Одним из важных PCI-регистров является "Command" по смещению(4).
Когда считав регистр BAR мы захотим обратиться к его памяти, можно нарваться на шипы и получить нули. Поскольку системы ещё нет, то и ошибку чтения возвращать некому, т.е. здесь нет механизмов оповещений. Поэтому перед там-как приступать к операциям RW, нужно обязательно проверить биты[1:0] в командном регистре(4), которые разрешают доступ к физ.портам и памяти MMIO. Вот как описывает эти биты софт "PCIScope":

Когда этот бит сброшен, все обращения к пространству памяти MMIO обрабатываются как неподдерживаемые запросы. Когда бит установлен, функция включает декодирование адреса и дальнейшую обработку доступа к памяти. Значение этого бита по умолчанию = 0. Бит может быть жестко установлен в 0, если функция не поддерживает доступ к памяти MMIO.
Всего в этом регистре 11 доступных на RW включателей (см.скрин), которыми не нужно пренебрегать.



Если-же говорить о конкретно этом дампе, то здесь регистр Command=0103h, т.е. хост уже разрешил доступ, и остаётся только читать блоки памяти из списка ниже. Все они размером по 4КБ, хотя реально использовано в них может быть и меньше, например всего-лишь пару байт. Просто каждый блок выравнивается в памяти ОЗУ на 4К границу, как требует спека PCI. Поскольку все блоки расположились в чердаке 4ГБ линейного пространства, нужно переходить в нереальный режим, и подбираться к конфигам из него:
Code
1
2
3
4
5
6
7
VIRTIO_PCI_CAP_COMMON_CFG  = 0xFE000000  (общие настройки, в т.ч. кольцевого буфера)
VIRTIO_PCI_CAP_ISR_CFG     = 0xFE001000  (настройки и адреса обработчиков прерываний)
VIRTIO_PCI_CAP_DEVICE_CFG  = 0xFE002000  (конфиги самого устройства Net)
VIRTIO_PCI_CAP_NOTIFY_CFG  = 0xFE003000  (схема уведомлений хост <--> гость)
 
VIRTIO_PCI_CAP_MSIX_CFG    = 0xFEBD1800  (память для приёма/отправки прерываний)
VIRTIO_PCI_CAP_PCI_CFG     = 0xC000  <---(порт i/o, вроде настраивает хост, и гостю не нужно)
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
09.11.2023, 19:23
Цитата Сообщение от Teamur Посмотреть сообщение
pmemsave 0x??? 256 dump.txt
только вот какое смещение взять?
Попробуй прописать указанные выше адреса, например 0xFE000000.
и размер задай мин.512 + сохраняй не в формате txt, а dump.bin
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
09.11.2023, 20:47  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
Поскольку все блоки расположились в чердаке 4ГБ линейного пространства
вот это удивило, тк у меня нетбук с ОЗУ 3 ГБ, хмм

На нетбуке qemu, для ОС я выделил 11 МБ ОЗУ

Для ОС я сделал
Windows Batch file
1
qemu-system-x86_64 -m 11M -net nic,model=virtio -net user,hostfwd=tcp::5555-:80 -drive format=raw,file=boot.img,index=0,if=floppy
Снятый дамп относится к NIC эмулятора или к аппаратному ( железо нетбука ) ?
Если я правильно понимаю, когда указывается virtio, то должны быть характеристики NIC нетбука.
У меня даже Ethernet-разъема на нём нет, а в сеть он выходит по вифи

Хост - это то, что эмулирует qemu или это мой нетбук (мне стыдно за этот вопрос) ?

У меня вообще есть сомнения насчет правильности проброса
Windows Batch file
1
-net user,hostfwd=tcp::5555-:80
но надеюсь, что все получится.
Если я перейду в нереальный режим, ничего в памяти не затрётся ?
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
09.11.2023, 21:07
Цитата Сообщение от Teamur Посмотреть сообщение
вот это удивило, тк у меня нетбук с ОЗУ 3 ГБ, хмм
в дампе фигурирует линейный адрес, а он не обязательно должен совпадать с физическим.
транслятор адреса в cpu сам скорректирует его на нужный.
Цитата Сообщение от Teamur Посмотреть сообщение
Снятый дамп относится к NIC эмулятора или к аппаратному ( железо нетбука ) ?
к эмулятора.. это-же virt.
Цитата Сообщение от Teamur Посмотреть сообщение
Если я перейду в нереальный режим, ничего в памяти не затрётся ?
ничего не затерётся - испробовано 1000 раз,
и даже на реальном железе.. читал регистры APIC процессора, таймера HPET и прочих.
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
10.11.2023, 10:03
Цитата Сообщение от Teamur Посмотреть сообщение
Хост - это то, что эмулирует qemu или это мой нетбук (мне стыдно за этот вопрос) ?
это зависит от того, как у тебя организована топология.
1. Если вирт.машина qemu установлена где-то на облачном сервере, то он хост, а ты для него гость.
2. Если qemu установлена на твоём/локальном узле (планшете, буке, стационаре), то уже ты выступаешь в роли хоста, и создаёшь гостей.
3. Если-же qemu установлена и на сервере и на твоём узле, то права одинаковы, и вы сами должны решить, кто из вас кто.

Существуют две основные технологии виртуализации ввода-вывода: VIRTIO и SR-IOV.

• VIRTIO - это виртуализация программного обеспечения хоста (паравиртуализация). В этой схеме, физ.девайс находится на хосте, на него как обычно устанавливаются драйвера, однако qemu дополняет эти драйвера своими, которые логически делятся на гостевую и хостовую часть - это два самостоятельных программных модуля одного драйвера VirtIO.

Когда qemu создаёт гостей, она держит у себя хостовую часть драйвера, а гости должны обращаться к ней через свои/гостевые части. Два этих модуля одного драйвера не могут функционировать друг без друга. Чтобы "пробудить" хостовую часть, модуль гостя должен прерыванием MSI-X послать ей сообщение DRIVER_OK=4. Если верить группе разработчиков VirtIO RedHat, программный код гостевого модуля занимает ~20% от общего кода драйвера, что говорит о простом его интерфейсе.

• SR-IOV (Single Root IO Virt, единый корень) - это виртуализация уже непосредственно аппаратных устройств, требующая поддержки как со стороны хоста, так и со стороны самих физ.устройств ввода-вывода (т.е. аппаратная технология). С помощью интерфейса SR-IOV, ресурс одного адаптера PCIe можно разделить на 2048 полностью изолированных вирт.функции VF, что позволит совместно использовать эти ресурсы в вирт.среде. Хотя производительность SR-IOV на порядок превосходит VIRTIO, среди поставщиков сетевых и прочих адаптеров напрочь отсутствует стандартизация управления ими. Схема её выглядит так:



Вчера на досуге поставил себе QEMU на лок.машину, и получил точно такой-же дамп PciCfg,
после чего чз pmemsave 0xFE000000 0x40 dump.bin (и адресов с остальных BAR) получил логи ниже. Дампы "ISR_CFG" (Offs=1000h) + NOTIFY_CFG (Offs=3000h) оказались девственны и забиты нулями, т.к. ожидают заполнения своих полей драйвером. Если теперь наложить на них структуры из спеки VirtIO, можно получить текущую картину, и сделать соответствующие выводы:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
 
• VIRTIO_PCI_CAP_COMMON_CFG
FE000000  00 00 00 00 24 80 BF 30 00 00 00 00 00 00 00 00  ....$Ђї0........
FE000010  FF FF 00 00 00 00 00 00 00 01 00 00 00 00 00 00  яя..............
FE000020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
FE000030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 
• VIRTIO_PCI_CAP_DEVICE_CFG
FE002000  52 54 00 12 34 56 01 00 FF FF FF FF FF FF FF FF  RT..4V..яяяяяяяя
FE002010  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF  яяяяяяяяяяяяяяяя
FE002020  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF  яяяяяяяяяяяяяяяя
FE002030  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF  яяяяяяяяяяяяяяяя
 
• VIRTIO_PCI_CAP_MSIX_CFG
FEBD1000  00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00  ................
FEBD1010  00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00  ................
FEBD1020  00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00  ................
FEBD1030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
3
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
10.11.2023, 14:12
А вот собственно и дампы регионов MMIO.
Как видно, нереальная мода воркает исправно, и ни один тушканчик не пострадал:

2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
10.11.2023, 20:22  [ТС]
R71MT, ну вы даёте !

иногда кажется, что не я, а вы разрабатываете, а я - догоняющий

Одинаковый дамп на разных машинах - фантастика

Только у вас в третьем столбце 11840200, а у меня 11840300
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
10.11.2023, 20:42
Цитата Сообщение от Teamur Посмотреть сообщение
иногда кажется, что не я, а вы разрабатываете
просто тема для меня новая, и интересно в ней разобраться хотя-бы поверхностно
скоро это пройдёт..
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
10.11.2023, 20:44  [ТС]
А я могу перейти в нереальный режим из кода второго сектора?

В прошлый раз я вывел дамп и затем сразу будет код перехода в PM
или переходить надо обязательно до строк ? :

Assembler
1
2
times 510-($-$$) db 0
dw 0xAA55
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
10.11.2023, 20:53
переходить в URM можно в любое время, лишь-бы до обращения к 4GB памяти.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
10.11.2023, 21:55  [ТС]
R71MT, смотрю в osdev и вот эта штука мне не нравится:

Assembler
1
2
3
4
5
6
7
8
9
10
11
gdtinfo:
   dw gdt_end - gdt - 1   ;последний байт в таблице
   dd gdt                 ; начало таблицы
 
gdt:        dd 0,0        ; запись 0 всегда не используется
codedesc:   db 0xff, 0xff, 0, 0, 0, 10011010b, 00000000b, 0
flatdesc:   db 0xff, 0xff, 0, 0, 0, 10010010b, 11001111b, 0
gdt_end:
 
   times 510-($-$$) db 0  ; заполнить нулями
   dw 0xAA55
Как-то мудрёно
lgdt [gdtinfo] <- это как-то можно превратить во что-то вроде lgdt 0, прописать нужное непосредственно?
и всё

И вот
Assembler
1
2
3
PM:
mov bx, 0x10          ; выбираем дескриптор 2, зачем ?
mov ds, bx            ; 10h = 10000b
Какие-то потусторонние манипуляции, что это за дескриптор 2, хмм

Добавлено через 49 минут
Assembler
1
2
3
4
5
unreal:
   pop ds                 ; get back old segment
   sti
 
   mov bx, 0x0f01         ; attrib/char of smiley
char of smiley - символ улыбки? - похоже на издевательство
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
11.11.2023, 06:55
Цитата Сообщение от Teamur Посмотреть сообщение
Как-то мудрёно
lgdt [gdtinfo] <- это как-то можно превратить во что-то вроде lgdt 0, прописать нужное непосредственно?
и всё
x86 - не самая изящная архитектура.
Цитата Сообщение от Teamur Посмотреть сообщение
что это за дескриптор 2, хмм
Может быть, этот?
Assembler
7
flatdesc:   db 0xff, 0xff, 0, 0, 0, 10010010b, 11001111b, 0
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
11.11.2023, 07:52
Teamur, вы видимо плохо понимаете, что такое GDT и зачем она нужна.
GDT - это "Global Descriptor Table", или глобальная таблица дескрипторов памяти. Размер одного дескриптора 8-байт, и в нём указывается база, лимит и атрибуты сегмента памяти. Именно прописанный в дескрипторе лимит ограничивает доступ к 4GB памяти - в реальном режиме его значение 0xFFFF, и мы не сможем преодолеть этот 64КБ барьер, пока не изменим в дескрипторе лимит на 32-битный максимум 0xFFFFFFFF. Вот как они представлены в библии интела том(3):



Сегментные регистры CS,DS,ES,SS,FS,GS имеют скрытую 8-байтную часть, куда копируется определённый дескриптор из таблицы GDT (дескриптор-кода в CS, а дескриптор-данных во-все остальные). Это т.н. "кэш дескрипторов", чтобы при каждом чихе CPU не обращался к памяти GDT. Дескрипторы в таблице выстроены последовательно, и соответственно каждый из них имеет свой порядковый номер, который называют "селектор". Эти селекторы хранятся уже в видимой программисту 2-байтной части сегментных регистров типа CS,DS. Процессор не знает, какой из дескрипторов нужно скопировать из GDT в кэш сегм.регистра, поэтому мы должны указать ему это явно, отправив селектор дескриптора в CS,DS. Именно этим и занимается данный участок кода:
Assembler
1
2
PM:  mov   bx,0x10    ; выбираем дескриптор 2, зачем ?
     mov   ds,bx      ; указать селектор(10h), чтобы CPU скопировал дескриптор в кэш DS.
Чтобы прояснить ситуацию, можно потискать отладчик WinDbg..
В манах Intel'a чёрным по-белому сказано, что дескриптор с селектором(0) в GDT (т.е. самый первый) должен быть пустым, а в режиме х64 и следующий тоже пустрой. Походу это просто для выравнивания на 16-байтный параграф. Вот как это выглядит в реале:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
0: kd> r @gdtl
   gdtl = 007f  <------------------ Размер таблицы GDT
 
0: kd> r @gdtr
   gdtr = fffff80000b91000  <------ Её адрес в памяти
 
0: kd> dq fffff80000b91000  <------ Запрашиваем дамп
 
fffff800`00b91000   0000000000000000 0000000000000000  <--- Два первых дескриптора = нуль в х64 
fffff800`00b91010   00209b0000000000 00cf93000000ffff
fffff800`00b91020   00cffb000000ffff 00cff3000000ffff
fffff800`00b91030   0020fb0000000000 0000000000000000
fffff800`00b91040   00008bb920800067 00000000fffff800
fffff800`00b91050   ff40f3fa20003c00 0000000000000000
fffff800`00b91060   00cf9a000000ffff 0000000000000000
fffff800`00b91070   0000000000000000 0000000000000000
Но этот дамп не информативный, поэтому запросим уже декодированные значения дескрипторов.
Здесь команде отладчика dg (от dump gdt) передаём параметры в виде диапазона селекторов.
Как видим, дескрипторы с селекторами(0,8) лежат в резерве, а в столбце "Long" зарыт флаг сегмента х64. Если он взведён, транслятор адреса в MMU игнорирует базу + лимит в дескрипторах, и никому не демонстрируя, в своих штанах выставляет их значения в нуль и 0xFFFFFFFF`FFFFFFFF соответственно (на рис.выше бит(L) это 21):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0: kd> dg 0 80
                                                        P Si Gr Pr Lo
Sel         Base               Limit           Type     l ze an es ng   Flags
----  -----------------  -----------------  ----------  - -- -- -- --  --------
0000  00000000`00000000  00000000`00000000  <Reserved>  0 Nb By Np Nl  00000000
0008  00000000`00000000  00000000`00000000  <Reserved>  0 Nb By Np Nl  00000000
0010  00000000`00000000  00000000`00000000  Code RE Ac  0 Nb By P  Lo  0000029b
0018  00000000`00000000  00000000`ffffffff  Data RW Ac  0 Bg Pg P  Nl  00000c93
0020  00000000`00000000  00000000`ffffffff  Code RE Ac  3 Bg Pg P  Nl  00000cfb
0028  00000000`00000000  00000000`ffffffff  Data RW Ac  3 Bg Pg P  Nl  00000cf3
0030  00000000`00000000  00000000`00000000  Code RE Ac  3 Nb By P  Lo  000002fb
0038  00000000`00000000  00000000`00000000  <Reserved>  0 Nb By Np Nl  00000000
0040  00000000`00b92080  00000000`00000067  TSS32 Busy  0 Nb By P  Nl  0000008b
0048  00000000`0000ffff  00000000`0000f800  <Reserved>  0 Nb By Np Nl  00000000
0050  ffffffff`fffa2000  00000000`00003c00  Data RW Ac  3 Bg By P  Nl  000004f3
0058  00000000`00000000  00000000`00000000  <Reserved>  0 Nb By Np Nl  00000000
0060  00000000`00000000  00000000`ffffffff  Code RE     0 Bg Pg P  Nl  00000c9a
0068  00000000`00000000  00000000`00000000  <Reserved>  0 Nb By Np Nl  00000000
0070  00000000`00000000  00000000`00000000  <Reserved>  0 Nb By Np Nl  00000000
0078  00000000`00000000  00000000`00000000  <Reserved>  0 Nb By Np Nl  00000000
0080  Unable to get descriptor
Цитата Сообщение от Teamur Посмотреть сообщение
lgdt [gdtinfo] <- это как-то можно превратить во что-то вроде lgdt 0, прописать нужное непосредственно?
можно, если ты знаешь размер и адрес таблицы GDT.
процессор ищет их в своём регистре GDTR.
в режиме х32 это 6-байтный регистр в формате: 4-байтный адрес + 2-байтный размер.
в режиме х64 это уже 10-байтный регистр, т.к. для адреса выделяется 8-байт.
Запись в этот регистр инструкцией lgdt (load), а чтение sgdt (store).
Пример ниже для режима х32. Кстати для URM достаточно лишь одного дескриптора-данных:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;.....  здесь переходишь в РM
        jmp   @next
 
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
align   16    ;<---- (!)обязательное выравнивание в памяти
gdt:    dq    0                   ; Null-descriptor
        dq    0x00cf92000000ffff  ; 4Gb Data-desc (Sel = 08h)
;//-----------------------------
newGdt  dw    ($ - gdt) -1        ; 16-битный размер GDT
        dd    gdt                 ; 32-битный линейный её адрес
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
@next:  lgdt  fword[newGdt]  ; записать 6-байт в GDTR
        mov   ax,08h         ; выбрать дескриптор(1) = селектор(8)
        mov   fs,ax          ; FS = 08h, и в его кэше окажется дескриптор(1)
;.....  здесь возвращаешься опять в RM
        
        mov   ebx,0xFE000000
        mov   ecx,16
@read:  mov   eax,dword[fs:ebx]   ; читаем в цикле 4GB память!
        add   ebx,4 
        loop  @read
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
11.11.2023, 08:48  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
lgdt  fword[newGdt]  ; записать 6-байт в GDTR
Здесь берутся последние 6 байт (fword - это far word) по адресу newGdt ?
Только вот проблема, в NASM, на котором я пишу нет 6 байтного ключевого слова, подобного fword
0
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
11.11.2023, 17:33  [ТС]
R71MT,
Поскольку все блоки расположились в чердаке 4ГБ линейного пространства, нужно переходить в нереальный режим, и подбираться к конфигам из него
Получается мне виртио диктует в каком режиме моя ОС должна быть?

Получается невозможно создать ОС с виртио NIC чисто в реальном режиме?
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
11.11.2023, 17:51
Цитата Сообщение от Teamur Посмотреть сообщение
нет 6 байтного ключевого слова, подобного fword
тогда убери fword, и загружай без него lgdt [newGdt]
Цитата Сообщение от Teamur Посмотреть сообщение
Получается невозможно создать ОС с виртио NIC чисто в реальном режиме?
так ты и будешь в чисто реальном режиме,
только для доступа к 4Gb будешь использовать пропатченный регистр fs.
т.е. заходишь из RM и РМ, меняешь дескриптор, и возвращаешься опять в RM.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
12.11.2023, 18:07  [ТС]
R71MT, у меня есть сомнения в правильности сделанного :

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
; ----------------------------------- Switch To UM
cli                   ; выкл прерывания
push ds               ; сохраняю, тк переход в PM его портит
 
jmp load_gdt
 
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
align   16    ;<---- (!)обязательное выравнивание в памяти
gdt:    dq    0                   ; Null-descriptor
        dq    0x00cf92000000ffff  ; 4Gb Data-desc (Sel = 08h)
;//-----------------------------
PM_GDT: dw ($ - gdt) -1        ; 16-битный размер GDT
        dd gdt                 ; 32-битный линейный её адрес
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
load_gdt:
lgdt [PM_GDT]  ; записать 6-байт в GDTR
 
mov eax, cr0   ; Управляющий 32 бит. регистр
or  al, 1      ; вкл бит PE
mov cr0, eax   ; -> PM
 
mov bx, 0x01   ; дескриптор данных, 1-й после нулевого (00)
mov ds, bx     
 
and al, 0xFE   ; выкл бит PE
mov cr0, eax   ; -> RM
 
pop ds         ; восстанавливаю
sti            ; вкл прерывания
 
; ----------------------------------- UM
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
12.11.2023, 21:17
Assembler
1
2
3
4
5
6
7
8
9
mov   eax, cr0   ; control(0) reg
inc   al         ; вкл бит PE
mov   cr0, eax   ; -> PM
 
mov   bx, 0x08   ; селектор(8)
mov   fs, bx     ; ds уже использует биос в своих прерываниях, поэтому fs
 
dec   al         ; выкл бит PE
mov   cr0, eax   ; -> RM
тогда и push/pop ds не нужен.
теперь пробуй считать с 4Gb (как в примере выше), и вывести на консоль в hex
если получится, значит всё ок.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
12.11.2023, 22:39  [ТС]
R71MT, постоянно мерцает экран, как будто что-то в цикле, вечно перезагружается, непонятно

Может надо на какой-то адрес перейти, хмм

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
; ========================================== CORE
jmp MAIN
; com[__]: ii - перебор, oo - просмотр
; ------------------------------------------ re
re: ; 
    ; переход на новую строку
  mov ah, 14 ; 0Eh
  mov al, 0Ah ; LF
  int 10h
  mov al, 0Dh ; CR
  int 10h
  xor al, al
  ret
 
; ------------------------------------------ hex
hex:  ; ebx
      ; Вывод содержимого ebx в 16-рич виде
        mov ah, 14  ; режим вывода текста
        mov cx, 8   ; количество итераций
 hexii: rol ebx, 4  ; YYYY -> BL[XXXX_....]
        mov al, 15  ;   0000_1111
        and al, bl  ; & XXXX_YYYY -> 0000_YYYY
        add al, 48  ; 0..9
        cmp al, 58  
         jl hexoo   ; AL+48 < 58
        add al, 7   ; A..F
 hexoo: int 10h
        loop hexii
  mov al, 0x20 ; SPACE
  int 10h
  ret
 
; ------------------------------------------ MAIN
MAIN:
; initial EBX-> 0000 7E00
 
; virtioNIC
mov cx, 1000h   ; DeviceID
mov dx, 1AF4h   ; VendorID
mov ax, 0xB102  ; функция поиска устройства
int 1Ah         ; -> BX[ BH=BusNum:8; BL=DevNum:5,FunNum:3 ]
 
;               32       31  24       16       11       8        2   0
; PCI_CONF_ADDR [EnaBit:1|_:7|BusNum:8|DevNum:5|FunNum:3|RegNum:6|_:2]
;                 |<-------BX------->|=0x0018
mov eax, 1_0000000_00000000_00011_000_000000_00b ; HardCoded PCI_CONF_ADDR
;             BDF=|Bus-----|Dev--|Fn-| : BusNum=00000000, DevNum=00011, FunNum=000
 
cli
mov dx, 0x0CF8  ; PCI_INDX
out dx, eax     ; в порт
mov dx, 0x0CFC  ; PCI_DATA
 in eax, dx     ; из порта -> 10001AF4
sti
 
call  re        ; пустая строка
 
; ----------------------------------------------
 
mov DX, 0x1004  ; 16 строк по 4 dword
xor di, di      ; regNum 0
 
Read_PCI_Conf_Dword_Row:
mov ax, 0xB10A  ; fn Read_PCI_Conf_Dword
mov bx, 0x0018  ; BDF
int 1Ah         ; ECX = Dword
bswap ecx       ; зеркалим по PCI спец
mov ebx, ecx
call hex
add di, 4       
dec DL          ; след dword
jnz Read_PCI_Conf_Dword_Row
call re
mov DL, 4       
dec DH          ; след строка
jnz Read_PCI_Conf_Dword_Row
 
; ----------------------------------- Switch To UM
cli                   ; выкл прерывания
 
jmp load_gdt
 
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
align   16 ;<---- (!)обязательное выравнивание в памяти
gdt:    dq 0                   ; Null-descriptor
        dq 0x00cf92000000ffff  ; 4Gb Data-desc (Sel = 08h)
;//-----------------------------
PM_GDT: dw ($ - gdt) -1        ; 16-битный размер GDT
        dd gdt                 ; 32-битный линейный её адрес
;//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
load_gdt:
lgdt [PM_GDT]  ; записать 6-байт в GDTR
 
mov eax, cr0   ; control(0) reg
inc al         ; вкл бит PE
mov cr0, eax   ; -> PM
 
mov bx, 0x08   ; селектор(8)
mov fs, bx     ; ds уже использует биос в своих прерываниях, поэтому fs
 
dec al         ; выкл бит PE
mov cr0, eax   ; -> RM
 
sti            ; вкл прерывания
 
; ----------------------------------- UM
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2023, 22:39

Сервер HP Primergy Econel 200 S2, Win2008R2 x64, RAID10 4x2000Gb падает скорость чтения/записи по сети
Здравствуйте. Подскажите, пожалуйста, в чем может быть проблема: Сервер бэкапов HP Primergy Econel 200 S2 Встроенный SATA RAID...

Linux Mint 20 x64, Firefox 79 x64. Отключить замыливание текста
Поставил Linux Mint 20, отключил сглаживание шрифтов, поставил шрифты от Windows XP, все хорошо, все нравится. Только в Firefox остался...

HP Pavilion g7 - 2160er переустановил Windows HP x64 на Ultimate x64 - проблема с подсветкой монитора
HP Pavilion g7 - 2160er переустановил windows home premium x64 на Ultimate x64/ Стала выеживаться подсветка монитора - хочет работает,...

Нестандартная ситуация, установка еще одной w7 x64 на уже установленный комп с w7 x64
Всем доброго времени суток ! Не совсем стандартная ситуация, которая посадила меня на гвоздь в позе &quot;шпагат&quot; ))) Есть машинка...

Ищу обновления KB938397-x64 и KB968730-x64 для Windows Server 2003x64
Господа плиз ХЕЛП! Ищем обновы KB938397x64 и KB968730x64 для Windows Server 2003x64 RUS, а то сволочной сервер 1С не видит интеренет. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru