Как получить карту памяти любого процесса

Обновлено: 06.07.2024

Следует знать, что в режиме SPI поддерживаются только команды чтения/записи в режиме одного блока или нескольких блоков (в режиме MMC поддерживается режим последовательной чтения/записи). Размер блока для чтения/записи может быть размером в сектор карты памяти и размером в 1 байт. Поддержка операций частичного чтения/записи блока данных хранится в регистре CSD карты памяти.
Чуть не забыли поговорить о регистрах, которые содержит карта памяти стандарта MMC(SD). Этих регистров чуть больше, чем перечислю я, но те, которые я не укажу либо не особо нужны, либо не доступны в режиме SPI. Основными регистрами, которые представляют для нас интерес являются следующие:

— CID (Card identification data): содержит данные, по которым можно идентифицировать карту памяти (серийный номер, ID производителя, дату изготовления и т.д.)
— CSD (Card-specific data): содержит всевозможную информацию о карте памяти (от размера сектора карты памяти до потребления в режиме чтения/записи).
— OCR (Operation Conditions Register): содержит напряжения питания карты памяти, тип питания карты памяти, статус процесса инициализации карты.

Многие, наверное, заметили, что в таблице пропущены некоторые команды. Как я говорил ранее, в режиме SPI недоступны некоторые функции, которые доступны в режиме MMC. Поэтому некоторые команды так же не доступны. Так же из таблицы видно, что у всех команд в поле «Resp» присутствует аббревиатура R1(2, 3, 7 и др.). Это и есть так называемый ответ карты на посылаемую ей команду. Приведу небольшой пример обмена информацией с картой памяти для иллюстрации описанного выше.

MMC SD cmd resp

SD MMC R1

SD MMC R2

SD MMC R3

Стоит отметить, что в протоколе MMC весь обмен данными завершается полем CRC, которое является необходимым. Что касается режима SPI, то по умолчанию при переходе в этот режим, контроль CRC отключен. Исключение составляют команды CMD0 и CMD8, поскольку они отправляются в карту, которая еще находится в режиме MMC, поэтому поле CRC для этих команд должно быть верным. Поскольку CMD0 отправляется единожды и все 6 байт этой команды известны заранее и не меняются, то в поле CRC для любой команды мы будем отправлять CRC для команды CMD0 (оно равняется 0x95). Что касается CMD8, то поле CRC в ней не является константой и зависит от передаваемых параметров. Хочу заметить, что проверку поля CRC можно активировать и в режиме SPI. Делается это при помощи соответствующей команды (CMD59).
Немного разобравшись с теорией, посмотрим на процесс инициализации карты памяти. Попробую представить это в виде блок-схемы. Вот что получилось у меня вымутить из datasheet’а (излагаю только суть, за вычетом некоторых моментов, которые я распишу после блок-схемы):

SD MMC Init strap

Ну вот, скажут некоторые, нарисовал не пойми чего, а вы тут разбирайтесь;) Но все не так уж и плохо. Первое, что необходимо пояснить в этой схеме это то, что карты как бы того не хотелось, бывают разные (поэтому наверное они и называются по разному). И на этой схеме мы видим, что бывает их ни много ни мало, а целых 4: MMC, SD версии 1.х стандартной емкости, SD версии 2.х стандартной емкости и карта SD версии 2.х повышенной емкости (SD карты расширенной емкости или SDHC). Все бы ничего, но все они требуют разной инициализации и это самое обидное. В принципе, есть общий способ инициализации всех их кроме SDHC, но он не есть правильный, поскольку работать с картой SD версии 2.х стандартной емкости и картой MMC как с одинаковыми картами неправильно (отличие в структурах CID и CSD). Конечно, можно построить алгоритм для работы с каждой картой по отдельности, но мы пойдем универсальной дорогой(и самой трудной на первый взгляд).
Из приведенной структуры намечается следующий путь работы (я буду указывать основные моменты, которые необходимо выполнять, но они не указаны на данной схеме). Мы определили, что в разъем картоприемника вставили какую-то фигню. Мы в свою очередь делаем следующее: подаем питание в пределах от 2.7-3.6 В, ожидаем

1мс (точно не знаю сколько, но чтобы питание устаканилось). SPI настроен как полагается (я думаю все умеют это делать) и вывод _CS карты памяти выставлен в логическую “1”. После этого нам необходимо подать минимум 74 тактовых импульса на линию SCLK SPI. Выполнив все это мы выставляем логический “0” на вывод _CS карты памяти и отсылаем команду CMD0. Из таблицы команд видим, что ответом на CMD0 является R1, структуру которого мы знаем. Немного отступлю от мысли и обращу внимание на то, что все ответы содержат в себе первым байтом R1, 7-й бит которого всегда является 0. Таким образом, мы можем отличать ответы от идущий по линии MISO байтов 0xFF. Итак, приняв R1, проверяем бит «In idle state» на равенство «1». Если это так, то карта находится на этапе инициализации. А вот теперь пришел первый этап определения типа карты памяти. Посылаем команду CMD8, которая указывает карте поддерживаемые МК напряжения питания для ее и спрашивает у выбранной карты может ли она работать в данном диапазоне напряжений, дожидаемся ответа R7. Как видно из блок-схемы, карты памяти стандарта MMC и SD версии 1.х эту команду не поддерживают и, соответственно, в своем ответе будут содержать бит «illegal command». Если сказанное ранее верно, то установленная карта либо MMC, либо SD версии 1.х. Теперь пришло время распознать, какая именно из этих двух типов карт вставлена в картоприемник. Для этого отправим карте памяти команду ACMD41, которая инициирует процесс инициализации карты. Эта команда посылается в цикле либо для ее выполнения взводится таймер, по которому проверяется ответ на эту команду. В любом случае, карта MMC не поддерживает ACMD41 и вернет «illegal command» в своем ответе. В таком случае вставленная карта есть MMC и для ее инициализации потребуется команда CMD1 (так же посылается в цикле, пока ответ на нее не будет равен 0). Получив ответ на CMD1 равный 0х00 карта MMC готова к работе. Если ответ на ACMD41 не содержит никаких установленных битов (т.е. равен 0х00), то карта SD версии 1.х и она готова к работе. Теперь вернемся чуть выше и предположим, что в ответ на команду CMD8 не содержал бит «illegal command», т.е. у нас карта памяти формата SD версии 2.х стандартной емкости(SDSC версии 2.х) или SDHC. Следующим шагом в таком случае есть отправка команды ACMD41 с параметром, указывающим карте памяти, поддерживает ли наше устройство карты памяти SDHC. Вне зависимости от того, есть поддержка SDHC или ее нет, мы циклически отправляем эту команду карте то тех пор, пока она (карта) не закончит процесс инициализации. Когда ответ от ACMD41 будет равен 0х00, карта памяти проинициализирована и готова к работе. Но для того, чтобы узнать, какая у на карта, мы отправим ей команду CMD58. Ответом от этой команды есть R3, который в свою очередь содержит регистр OCR. Проанализировав OCR на установку бита CSS можно определить тип карты: CCS == 1 – карта SDHC или SDXC, CCS == 0 – карта SDSC. Чтобы не быть голословным, приведу мой участок кода инициализации карты памяти:


Закончив процесс идентификации(тип карты памяти) и инициализации, можно приступать к работе с картой памяти: вычисление объема, чтение и запись данных и т.д.Но это уже вопрос следующей статьи. Жду комментариев и вопросов. Критика и советы оч приветствуются!

Цель работы: Получение практических навыков по использованию Win32 API для исследования памяти Windows

Методические указания к выполнению лабораторной работы

Типы памяти: физическая память, виртуальная память, память файла подкачки.

Совместно используемая физическая память

О физической памяти говорят, что она совместно используется, если она отображается на виртуальное адресное пространство нескольких процессов, хотя виртуальные адреса в каждом процессе могут отличаться.

Одно из преимуществ файлов, отображаемых в память, заключается в том, что их легко использовать совместно. Присвоение имени объекту "отображение файла" делает возможным совместное использование файла несколькими процессами. В этом случае его содержимое отображено на совместно используемую физическую память. Возможно также совместное пользование содержимого файла подкачки с помощью механизма отображения файла.

Адресное пространство процесса

Каждый процесс Win32 получает виртуальное адресное пространство, называемое также адресным пространством, или пространством процесса. Таким образом, код процесса может ссылаться на адреса с &Н00000000 по &HFFFFFFFF (или с 0 по 232 – 1 = 4 294 967 295 в десятичной системе счисления).

Распределение виртуальной памяти

Каждая страница виртуального адресного пространства может находиться в одном из трех состояний:

  • Reserved (зарезервирована) – страница зарезервирована для использования;
  • Committed (передана) – для данной виртуальной страницы выделена физическая память в файле подкачки или в файле, отображаемом в память;
  • Free (свободна) – данная страница не зарезервирована и не передана, и поэтому в данный момент она недоступна для процесса.

Кучи памяти в 32-разрядной Windows

При создании процесса Windows назначает ему кучу по умолчанию, то есть изначально резервирует область виртуальной памяти объемом 1 Мб. Тем не менее, при необходимости система будет регулировать размер кучи, которая используется самой Windows для различных целей.

Задание для выполнения лабораторной работы

  1. выдает информацию, получаемую при использовании API GlobalMemoryStatus (при выводе информации использовать диаграммы);
  2. составляет карту виртуальной памяти для любого процесса.

Видео выполнения работы




Ход выполнения лабораторной работы

Программа выведет полную информацию о занятой и свободной физической и виртуальной памяти, составит карту процессов, создаст виртуальную память для каждого процесса.

Разработанное программное обеспечение для приложения, которое:

выдает информацию, получаемую при использовании API GlobalMemoryStatus. При выводе информации использовать диаграммы.

Составляет карту виртуальной памяти для любого процесса.

Пример работы программы



Исходный код программы

public partial class Form1 : Form

private void GetMemoryInformation_Click(object sender, EventArgs e)

MemoryStatus status = MemoryStatus.CreateInstance();

uint MemoryLoad = status.MemoryLoad;

ulong TotalPhys = status.TotalPhys;

ulong AvailPhys = status.AvailPhys;

ulong TotalPageFile = status.TotalPageFile;

ulong AvailPageFile = status.AvailPageFile;

ulong TotalVirtual = status.TotalVirtual;

ulong AvailVirtual = status.AvailVirtual;

ulong AvailExtendedVirtual = status.AvailExtendedVirtual;

lbx_inform.Items.Add("Всего физической памяти= " + TotalPhys / 1024 / 1024 + " MB");

lbx_inform.Items.Add("Объем физической памяти, доступный в данный момент " + AvailPhys / 1024 / 1024 + " MB");

lbx_inform.Items.Add("Всего файл подкачки= " + TotalPageFile / 1024 / 1024 + " MB");

lbx_inform.Items.Add("Объем файла подкачки, доступный в данный момент " + AvailPageFile / 1024 / 1024 + " MB");

lbx_inform.Items.Add("Всего виртуальной памяти= " + TotalVirtual / 1024 / 1024 + " MB");

lbx_inform.Items.Add("Объем виртуальной памяти, доступный в данный момент " + AvailVirtual / 1024 / 1024 + " MB");

lbx_inform.Items.Add("Используется памяти данным процессом: " + MemoryLoad + "байт");

private void btn_createprocessmap_Click(object sender, EventArgs e)

System.Diagnostics.Process MyProc = new System.Diagnostics.Process();

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

public class MemoryStatus

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]

internal static extern bool GlobalMemoryStatusEx([In, Out] MemoryStatus lpBuffer);


Если вы думаете, что при покупке карт памяти для своих гаджетов нужно смотреть только на поддерживаемый формат и объём, придётся вас расстроить. Учитывать следует как минимум пять важных моментов.


Для большинства людей microSD — это лишь форм-фактор, но на самом деле это не так. Вы без проблем сможете вставить любую microSD-карту в стандартный слот, но далеко не каждая из них будет работать, поскольку карты различаются по множеству признаков.


Всего существует три различных формата SD, доступных в двух форм-факторах (SD и microSD):

SD (microSD) — накопители объёмом до 2 ГБ, работают с любым оборудованием;
SDHC (microSDHC) — накопители от 2 до 32 ГБ, работают на устройствах с поддержкой SDHC и SDXC;
SDXC (microSDXC) — накопители от 32 ГБ до 2 ТБ (на данный момент максимум 512 ГБ), работают только на устройствах с поддержкой SDXC.
Как видите, обратной совместимости у них нет. Карты памяти нового формата на старом оборудовании работать не будут.

Заявленная производителем поддержка microSDXC не означает поддержку карт этого формата с любым объёмом и зависит от конкретного устройства. Например, HTC One M9 работает с microSDXC, но официально поддерживает только карты до 128 ГБ включительно.

С объёмом накопителей связан ещё один важный момент. Все карты microSDXC используют по умолчанию файловую систему exFAT. Windows поддерживает её уже более 10 лет, в OS X она появилась начиная с версии 10.6.5 (Snow Leopard), в Linux-дистрибутивах поддержка exFAT реализована, но «из коробки» работает далеко не везде.

Высокоскоростной интерфейс UHS


Карты форматов SDHC и SDXC могут поддерживать интерфейс Ultra High Speed, который при наличии аппаратной поддержки на устройстве обеспечивает более высокие скорости (UHS-I до 104 МБ/с и UHS-II до 312 МБ/с). UHS обратно совместим с более ранними интерфейсами и может работать с не поддерживающими его устройствами, но на стандартной скорости (до 25 МБ/с).


Классификация скорости записи и чтения microSD-карт так же сложна, как их форматы и совместимость. Спецификации позволяют описывать скорость карт четырьмя способами, и, поскольку производители используют их все, возникает большая путаница.


Макрикровка класса скорости для обычных карт представляет собой цифру, вписанную в латинскую букву C

К классу скорости (Speed Class) привязана минимальная скорость записи на карту памяти в мегабайтах в секунду. Всего их четыре:

Class 2 — от 2 МБ/с;
Class 4 — от 4 МБ/с;
Class 6 — от 6 МБ/с;
Class 10 — от 10 МБ/с.


По аналогии с маркировкой обычных карт, класс скорости UHS-карт вписывается в латинскую букву U

У карт, работающих на высокоскоростной шине UHS, пока всего два класса скорости:

Class 1 (U1) — от 10 МБ/с;
Class 3 (U3) — от 30 МБ/с.
Поскольку в обозначении класса скорости используется минимальное значение записи, то теоретически карта второго класса вполне может быть быстрее карты четвёртого. Хотя, если это будет так, производитель, скорее всего, предпочтёт более явно указать этот факт.

Класса скорости вполне достаточно для сравнения карт при выборе, но некоторые производители помимо него используют в описании максимальную скорость в МБ/с, причём чаще даже не скорость записи (которая всегда ниже), а скорость чтения.

Обычно это результаты синтетических тестов в идеальных условиях, которые недостижимы при обычном использовании. На практике скорость зависит от многих факторов, поэтому не стоит ориентироваться на эту характеристику.

Ещё один вариант классификации — это множитель скорости, подобный тому, который использовался для указания скорости чтения и записи оптических дисков. Всего их более десяти, от 6х до 633х.

Множитель 1х равен 150 КБ/с, то есть у простейших 6х-карт скорость равна 900 КБ/с. У самых быстрых карт множитель может быть 633х, что составляет 95 МБ/с.


Правильно выбирать карту с учётом конкретных задач. Самая больша́я и самая быстрая не всегда лучшая. При определённых сценариях использования объём и скорость могут оказаться избыточными.

При покупке карты для смартфона объём играет большую роль, чем скорость. Плюсы большого накопителя очевидны, а вот преимущества высокой скорости передачи на смартфоне практически не ощущаются, поскольку там редко записываются и считываются файлы большого объёма (если только у вас не смартфон с поддержкой 4K-видео).

Камеры, снимающие HD- и 4K-видео, — это совсем другое дело: здесь одинаково важны и скорость, и объём. Для 4K-видео производители камер рекомендуют использовать карты UHS U3, для HD — обычные Class 10 или хотя бы Class 6.

Для фото многие профессионалы предпочитают пользоваться несколькими картами меньшего объёма, чтобы минимизировать риск потери всех снимков в форс-мажорных обстоятельствах. Что до скорости, то всё зависит от формата фото. Если вы снимаете в RAW, есть смысл потратиться на microSDHC или microSDXC класса UHS U1 и U3 — в этом случае они раскроют себя в полной мере.


Как бы банально это ни звучало, но купить подделку под видом оригинальных карт сейчас проще простого. Несколько лет назад SanDisk заявляла, что треть карт памяти SanDisk на рынке является контрафактной. Вряд ли ситуация сильно изменилась с того времени.

Чтобы избежать разочарования при покупке, достаточно руководствоваться здравым смыслом. Воздерживайтесь от покупки у продавцов, не заслуживающих доверия, и остерегайтесь предложений «оригинальных» карт, цена которых значительно ниже официальной.

Злоумышленники научились подделывать упаковку настолько хорошо, что порой её бывает очень сложно отличить от оригинальной. С полной уверенностью судить о подлинности той или иной карты можно лишь после проверки с помощью специальных утилит:

H2testw — для Windows;
F3 — для Mac и Linux.


Если вы уже сталкивались с потерей важных данных из-за поломки карты памяти по той или иной причине, то, когда дело дойдёт до выбора, вы, скорее всего, предпочтёте более дорогую карту известного бренда, чем доступный «ноунейм».

Помимо большей надёжности и сохранности ваших данных, с брендовой картой вы получите высокую скорость работы и гарантию (в некоторых случаях даже пожизненную).

Теперь вы знаете об SD-картах всё, что необходимо. Как видите, есть много вопросов, на которые вам придётся ответить перед покупкой карты. Пожалуй, наилучшей идеей будет иметь различные карты для различных нужд. Так вы сможете использовать все преимущества оборудования и не подвергать свой бюджет лишним расходам.

Читайте также: