Форум программистов, компьютерный форум, киберфорум
Наши страницы
ОС на Assembler
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Вадик_
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 138
Завершенные тесты: 1
1

Получение карты памяти

08.08.2016, 14:33. Просмотров 1338. Ответов 9
Метки нет (Все метки)

Здравствуйте! Как получить ПОЛНУЮ карту оперативной памяти. Полная - это со всеми MMIO областями. То есть видеопамять, ISA, PCI, APIC, USB. В загрузчике у меня использовалась функция E820. Но я прочитал, что она может даже не видеть APIC. http://ru.osdev.wikia.com/wiki/%D0%9...8F%D1%82%D0%B8У меня она не видит стандартную видеопамять (0xA0000 - 0xBFFFF). Приходится добавлять этот диапазон вручную. Как тогда получить ПОЛНУЮ карту?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2016, 14:33
Ответы с готовыми решениями:

Получение карты высот
Быть может, вопрос не совсем по теме раздела, но математического подфорума нету. Суть в том, что...

Получение значения идентификатора карты
В первый раз сталкиваюсь с RFID-считывателем Matrix-III RD-ALL. Как реализовать функционал в...

Получение события о готовности сетевой карты
Добрый день. Есть приложение в "Автозагрузке", которое отправляет данные по сети. Не знаю, что не...

МК и карты памяти
Кто ни буть пробовал микроконтроллером записывать, читать карты памяти? Можете примеры показать? ...

Получение карты глубины из Z буфера в реальном времени
Добрый день. Столкнулся с непростой задачей. Не могли бы подсказать реально ли вытащить карту...

9
shmkv
1318 / 473 / 67
Регистрация: 21.07.2015
Сообщений: 1,240
09.08.2016, 15:59 2
Цитата Сообщение от Вадик_ Посмотреть сообщение
Как тогда получить ПОЛНУЮ карту?
В общем случае никак, да и mmio при желании можно переносить. И надобности в этой фиче 0.

Добавлено через 3 часа 24 минуты
Ну и да, mmio никого отношение к оперативной памяти не имеет. Для оперативной памяти E820 выдает всю нужную инфу.
0
Вадик_
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 138
Завершенные тесты: 1
16.08.2016, 01:59  [ТС] 3
У меня ядро гибридное. Менеджер памяти может дать APIC память к примеру драйверу и попытаться туда драйвер пихнуть.
0
shmkv
1318 / 473 / 67
Регистрация: 21.07.2015
Сообщений: 1,240
16.08.2016, 12:20 4
Цитата Сообщение от Вадик_ Посмотреть сообщение
APIC память к примеру драйверу и попытаться туда драйвер пихнуть.
Ядерный бред.
А так адреса APIС можно найти в структурах ACPI.
0
16.08.2016, 12:20
Вадик_
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 138
Завершенные тесты: 1
17.08.2016, 02:46  [ТС] 5
Не бред. В диапазоне 0x90000 - 0x9FFFF были регистры IO APIC. А E820 эту область как свободную пометила. На компе с Celeron такое было.
0
Constantin Cat
2721 / 1473 / 419
Регистрация: 28.02.2015
Сообщений: 2,996
Завершенные тесты: 1
17.08.2016, 09:03 6
Вадик_,
Покажите как Вы эту функцию используете.
А так получается сплошное бла-бла-бла.
0
Вадик_
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 138
Завершенные тесты: 1
17.08.2016, 12:42  [ТС] 7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    x86_pmem_regions_count = 0;
    struct x86_pmem_region region;
    /* Registers, need to call E820 BIOS function */
    struct x86_rm_regs regs = {0, 0, 0, 0, X86_RM_STACK & 0xFFFF, 0, 0, 0, 0x202, (X86_RM_STACK & 0xF0000) >> 4, BOOTLOADER_SECTOR_SEGMENT_TO_LOAD, BOOTLOADER_SECTOR_SEGMENT_TO_LOAD, 0, 0};
    /* Get physical memory map */
    regs._ebx = 0;
    do {
        regs._eax = 0xE820;
        regs._ecx = 24;
        regs._edx = 0x534d4150;
        unsigned long p = (unsigned long)(&region);
        regs._es = (p & 0xFFFF0000) >> 4;
        regs._edi = p & 0x0000FFFF;
        x86_bioscall(0x15, &regs);
        /* Add region */
        if (!((regs._ecx > 20) && ((region.acpi & 0x0001) == 0))) {
            enum pmem_region_type type = pmem_region_type_reserved;
            if (region.type == x86_pmem_entry_type_available)
                type = pmem_region_type_available;
            add_region(region.address, region.size, type);
        }
    } while (regs._ebx != 0);
Добавлено через 6 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
enum x86_pmem_entry_type {
    x86_pmem_entry_type_available = 0x01,
    x86_pmem_entry_type_reserved = 0x02,
    x86_pmem_entry_type_acpi_reclaimable = 0x03,
    x86_pmem_entry_type_acpi_nvs = 0x04,
    x86_pmem_entry_type_bad = 0x05
};
struct x86_pmem_region {
    uint64_t address;
    uint64_t size;
    uint32_t type;
    uint32_t acpi;
} PACKED;
Код находится по адресу 0x40000, стек - ниже.
0
shmkv
1318 / 473 / 67
Регистрация: 21.07.2015
Сообщений: 1,240
17.08.2016, 21:46 8
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от Вадик_ Посмотреть сообщение
В диапазоне 0x90000 - 0x9FFFF были регистры IO APIC
Не верю. Я даже не видел ни разу, чтобы bios размещал ioapic по адрес отличному от 0xFEC...0, более того, эти адреса жестко прописаны в спецификации. пруф, стр. 8. В тоже время, по спецификации ACPI (таблица MADT), может быть несколько IOAPIC с разными адресами, зачем туда внесли это - не знаю, видимо для общности. На практике там всегда один ioapic. Касаемо 0x90000 - не может там быть apic, да и вообще любого mmio, это бы нарушило сразу кучу всего. Но в тоже время по адресу 0x90000 могут быть какие-то важные данные, вроде таблиц APCI, но никак не mmio. BIOS старается даже не разрывать память за 1м мегабайтом, т. к. есть много ПО, которое перестанет от этого работать. Тут у тебя ошибка где-то, возможно, что страничным преобразованием, наверняка ты там tlb даже не очищаешь.
Касаемо usb и всего стального - пиши тут, отвечу (по возможности) тут. Может это поможет другим людям.

Добавлено через 10 минут
В сети много чего есть по работе с usb на низком уровне / в DOS, начни изучение оттуда. Есть люди (причем отвечающие), которые знают эту тему и лучше меня. Не ограничивайся русскоязычными конференциями (сам наверное знаешь, где большинство увлекающихся осдевов тусуется). Конкретных ссылок давать не буду из-за нездоровых правил этого форума. Ну и вообще тут практически все "низкоуровневое программирование" сводится к помощи судням в лабах уровня "сложить два регистра и вывести на экран".
0
Вадик_
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 138
Завершенные тесты: 1
19.08.2016, 12:03  [ТС] 9
В загрузчике страничное преобразование не используется. Оно включается перед входом в ядро. В MATD адрес был 0x9C???. ? - не помню цифру. Сейчас комп включать - проверять времени нет.
0
shmkv
1318 / 473 / 67
Регистрация: 21.07.2015
Сообщений: 1,240
19.08.2016, 12:28 10
Цитата Сообщение от Вадик_ Посмотреть сообщение
В MATD адрес был 0x9C???
Ты поди неправильно с ACPI работаешь.
Цитата Сообщение от Вадик_ Посмотреть сообщение
Сейчас комп включать - проверять времени нет.
Ну тогда и не надо трепа.
0
19.08.2016, 12:28
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 12:28

Восстановление карты памяти
Доброй ночи, уважаемые форумчане! Проблема такая.. купили цифровой фотик, рассчитанный макисмум на...

форматирование карты памяти
тел. нокиа н 73 карта памяти мини сд 2 гб Зделал ручной ресет забыл карту в телефоне теперь...

Восстановление карты памяти
Не скажите как можно вытащить информацию с карты памяти (microSDHC - 2 гиг) она пишет карта памяти...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.