Память flat: Лекция 3. Память. — Системное программирование

Лекция 3. Память. — Системное программирование

С
точки зрения программиста память состоит из отдельных ячеек размером в байт (8
бит). Точнее память состоит из битов, но программист может оперировать только отдельными
байтами. Если программе нужно изменить значение только одного бита, то она все
равно должна считать целый байт, содержащий этот бит.

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

Вся
память делится на оперативную (ОЗУ) (по-английски RAM (Random Access Memory) —
устройство с произвольным доступом) и постоянную память (ПЗУ) (ROM (Read Only
Memory) — память только для чтения). Если в ОЗУ можно как записывать, так и
считывать информацию, то из ПЗУ ее можно только считывать. В ПЗУ расположена BIOS
и программа начальной загрузки компьютера (POST). Постоянная и оперативная
память находятся в едином пространстве адресов.

Важно
помнить, что перед выполнением любая программа должна быть загружена в ОЗУ,
только после этого процессор начинает последовательно считывать из нее и
выполнять команды. Жесткие диски, дискеты, CD/DVD и прочие носители информации
хранят файлы, которые будут выполнены только после того как будут загружены в
память, причем образ на носителе информации не всегда соответствует тому
образу, который будет перенесен в память. Переносом программы с носителя в
память (и обратно, если необходимо) занимается операционная система.

Загруженная
в память программа всегда отводит под свои нужды отдельный участок памяти,
который называется стеком. Стек работает особым образом — данные в него
помещаются и извлекаются по принципу LIFO (Last In First Out — «последним
вошел– первым вышел»). Стек можно представить в виде стопки листов бумаги
(это, кстати, одно из значений английского слова stack) — листы, которые мы
положили в стопку последними, сможем забрать первыми, иначе говоря, можем класть
и забирать листы только с вершины стопки. Как вы помните, существуют
специальные регистры, отведенные для работы со стеком это: SS, ESP, EBP. В
системе Intel дно стека всегда расположено в больших адресах памяти, т. е. стек
заполняется от максимально возможного адреса к меньшим. Программа и данные
заполняют память, начиная с малых адресов памяти к большим. Между стеком и
программой с данными существует промежуток из неиспользуемых адресов памяти.

В
реальном режиме процессор делит пространство памяти на сегменты по 64 Кбайт
(сегментированная модель памяти), в защищенном режиме процессор предоставляет
несколько различных моделей памяти, но чаще всего используется самая простая
плоская модель памяти (память представляется одним сплошным массивом байтов).
Как выглядит образ памяти программы в реальном режиме показано на рис. 3.1 и на
рис. 3.2, а плоская модель памяти показана на рис. 3.3.

Рис. 3.1. Образ памяти программы типа COM.

Рис. 3.2. Образ памяти программы типа EXE.

Рис. 3.3. Плоская модель памяти.

Фирме
Intel понадобилось  в  реальном 
режиме делить память на 64 Кбайт сегменты, т.к. процессоры  первого поколения были 16-разрядными, а, следовательно,
максимальный размер, который они могли адресовать, составлял всего 216=64
Кбайт. Понятно, что это очень мало, поэтому Intel стала искать способы  расширения доступного адресного пространства.
Конечно, самый простой способ — это увеличить разрядность процессора (что и
было сделано в последующих поколениях), но в первых поколениях  процессоров это не позволяла сделать
технология, ограничивающая количество элементов 
на  чипе. Поэтому  фирма Intel решила использовать специальный
встроенный диспетчер памяти, для управления которым были введены известные нам
уже сегментные регистры: CS указывал на область ОЗУ в котором располагался код
программы, регистр DS отвечал за данные, SS определял расположение  стека. А адрес ячейки внутри  сегмента стал представлять собой совокупность
двух слов, записываемых в программах в виде 
SSSSh:OOOOh, где SSSSh — адрес сегмента, а OOOOh — относительный адрес (называемый
также эффективным), или смещение, который используется для доступа к ячейке
внутри сегмента. Адрес, состоящий из сегмента и смещения, называют обычно
логическим или виртуальным адресом.

Однако
в процессорах первого поколения использовалась 20-разрядная шина адреса, по
которой передать значение адреса состоящего из двух слов (32 бита) было
невозможно. Поэтому для преобразования 32-х разрядного адреса в 20-разрядный
адрес для передачи по шине адреса Intel ввела следующий аппаратный алгоритм:
значение сегментного регистра умножается на 16 (10h) или (что то же самое)
сдвигается на 4 разряда влево и складывается со значением смещения, в
результате получается 20-битный адрес. Например, если 32-разрядный адрес DS:BX,
где DS=1234h, BX=5678h, то значение сегментного регистра, умноженное на 16
будет равно 12340h, а физический адрес 12340h+5678h=179B8h.

Таким
образом, под физическим адресом понимается адрес памяти, выдаваемый на шину
адреса микропроцессора. Другие названия этого адреса — абсолютный адрес,
линейный адрес (однако в защищенном режиме физический и линейный адреса — это
не одно и то же). Так как физический адрес имеет размерность 20 бит, то
максимальное пространство памяти, которое может использовать программа в реальном
режиме равно 220=1 Мбайт. Преобразование в физический адрес
выполняется на аппаратном уровне, поэтому вручную программисту это делать не
требуется, но знать, как в реальном режиме вычисляется физический адрес
полезно.

Конечно,
в наше время размер 1 Мбайт памяти, который предоставлен программе в реальном
режиме, выглядит смешно. Но когда-то это казалось очень много. Ограничение
памяти в 1 Мбайт в реальном режиме, также как и в режиме V86 сохранилось до сих
пор — об этом следует помнить.

В
последующих поколениях процессорах разрядность шины адреса увеличивалась,
например в Pentium 4 она составляет 64 бита, но все равно в реальном режиме не
зависимо от поколения процессора задействуются только 20 линий, а остальные
линии шины адреса в этом режиме просто недоступны. Начиная с процессора 80386,
в качестве смещения стало возможно использовать 32-х разрядный адрес.

Таким
образом, имея 16-разрядные регистры, удалось увеличить адресное пространство до
1 Мбайт, а данную технологию назвали сегментацией памяти. Конечно, тогда это
решение казалось удачным, но с появлением защищенного режима в 32-разрядных
процессорах фирма Intel перешла к плоской модели памяти, а сегментную модель
памяти пришлось сохранить для обеспечения совместимости с программным
обеспечением, созданным под реальный режим работы процессора.

В
защищенном режиме появилось еще 4 модели памяти (эти модели памяти недоступны в
реальном режиме):

·                   
плоская, или линейная модель
памяти (flat memory model)

— вся память представляет собой непрерывную линейную последовательность байт
(рис. 3.3). Диапазон адресов в этой модели находится в пределах от 0 до 232-1
(4 Гбайт). Программный код, данные и стек располагаются в этом пространстве
адресов.

·                   
сегментированная модель памяти
(segmented memory model)

— подобно тому, как это делается в реальном режиме, в защищенном режиме память
может делиться на отдельные пространства адресов, которые называют сегментами.
При этом программный код, данные и стек размещаются в отдельных сегментах
памяти. Программы в 32-разрядном режиме могут использовать до 16383 сегментов
разного размера, каждый из которых может иметь размер 232 байт (4
Гбайт). Однако в отличие от реального режима, преобразование логических адресов
в физические в сегментированной модели памяти защищенного режима выполняется
значительно сложнее. По-прежнему логический адрес формируется при помощи
сегментных регистров и регистров, в которых хранятся смещения. Однако
сегментные регистры теперь хранят не сегментный адрес, а так называемый
селектор (рис. 3.4).

Рис. 3.4. Формат селектора.

Он
также содержит16 бит, но теперь имеет более сложную структуру:

·         Index — индекс в таблице дескрипторов(его
длина13 бит, следовательно в таблице содержится не более 213=8192
дескрипторов).

·         TI — если бит установлен, то это селектор в
LDT, сброшен в GDT.

·         RPL — уровень привилегий запроса.

Индекс
селектора (13 бит) указывает на дескриптор в таблице, называемой дескрипторной.

В
сегментированной модели памяти защищенного режима используется две
дескрипторные таблицы: глобальная (GDT) и локальная(LDT). Тип используемой
таблицы определяется битом TI селектора. Таблицы— это просто массивы из
дескрипторов. Адреса этих массивов хранятся в системных регистрах: GDTR и LDTR,
соответственно.

Селекторы
текущих сегментов кода, данных и стека хранятся в регистрах CS, DS и SS
соответственно. Таким образом, логический адрес формируется из селектора
сегмента и смещения внутри сегмента. Исходя из всего вышеперечисленного схема
адресации сегментированной модели памяти защищенного режима будет выглядеть так
как показано на рис. 3.5.

Рис. 3.5. Схема преобразования логического
адреса в линейный в
защищенном режиме адресации.

·                   
страничная модель памяти (paging) — является надстройкой над
сегментированной или плоской моделью памяти. В этом режиме память
рассматривается как совокупность блоков фиксированного размера (страниц)
размером 4 Кбайт. Начиная с 5-го поколения процессоров, появилась возможность
увеличения размера страницы до 4 Мбайт. Страничная модель памяти предназначена
для организации виртуальной памяти. Благодаря виртуальной памяти программы
могут использовать для работы объем памяти больший, чем объем физической
памяти. Суть виртуальной памяти заключается в том, что страницы могут
выгружаться из физической оперативной памяти на диск (в файл обмена, файл подкачки
или swap-файл) и по мере необходимости подкачиваться с него обратно. Через
страничное преобразование i386 может адресовать до 4 Гбайт физической памяти и
до 64 Тбайт виртуальной памяти. Виртуальная память включается в настройках
операционной системы. Разбиение на страницы выполняется на аппаратном уровне и
программисту знать подробностей, как правило, не требуется. На программном
уровне страничный механизм включается установкой специального бита (PG) в
регистре CR0 при помощи привилегированной команды.

·                   
модель памяти в режиме V86. С точки зрения программиста эта
модель памяти работает точно также как в обычном реальном режиме. Т.е. память
делится на сегменты по 64 Кбайт, ячейки внутри которых адресуются с помощью
двух слов, записываемых в виде СЕГМЕНТ:СМЕЩЕНИЕ, максимальная адресуемая память
1 Мбайт и пр. Однако в режиме V86 выполняются все проверки защиты защищенного
режима, из-за чего в некоторых случаях не будут работать некоторые инструкции.
Особенно это касается инструкций ввода-вывода IN, OUT, (REP) INS, (REP) OUTS и
инструкций обработки прерываний: INT n, PUSFF, POPF, STI, CLI и IRET.

 

Модель памяти flat.

Схема
преобразования адресов процессора 386
позволяет работать с сегментами очень
большого размера – порция 4 Гбайт. Это
намного больше, чем нужно для
программирования в среде OS/2.

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

Соответствующая
модель памяти называется моделью FLAT
или сплошной (несегментированной)
моделью памяти.

Таким
образом, составляя 32-разрядные программы
для OS\2
можно забыть про селекторы, сегментные
регистры, модификаторы near
и far.
Содержимым сегментных регистров
управляет ОС. Программисту это делать
запрещено. В состав программного
интерфейса OS\2
входят многочисленные функции, с помощью
которых приложение может получать блоки
памяти нужного размера и с нужными
характеристиками.

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

ОС
OS\2
способна работать как с файловой системой
DOS,
так и со своей собственной системой
HPFS.
Кроме того в OS\2
есть средства монтирования других
файловых систем.

OS\2
можно установить в существующий раздел
диска, созданный в стандарте DOS,
либо в созданный заново раздел HPFS.
При этом OS\2
будет иметь доступ к обоим разделам.

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

Для
повышения производительности IBM
OS\2
была создана файловая система (High
Performance
File
System)
HPSF
– высокопроизводительная файловая
система. Эта файловая система оптимизирована
для мультизадачной среды и ускоряет
одновременную работу программ с файлами,
расположенными на дисках большого
объема. Специальный алгоритм размещения
файлов значительно уменьшает фрагментацию
файлов, что повышает производительность
системы. При размещении файла для него
подбирается подходящий непрерывный
свободный участок диска и оставляется
некоторый запас свободного пространства.
Когда файл расширяется, для него
выделяются в первую очередь секторы из
зарезервированного для этого файла
участка диска. Если же размер файла
увеличился значительно, для него может
быть выделен еще один или несколько
свободных участков.

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

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

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

Библиотеки
динамической компоновки.

При
компоновке программы DOS
в загрузочный ЕХЕ – файл добавляется
программный код функций, взятых из
стандартных библиотек транслятора или
из дополнительных библиотек. Этот метод
компоновки называется статическим. При
его использовании файл программы DOS
содержит в себе все необходимое для
работы, за исключением кода функций DOS
и BIOS,
вызываемого с помощью приложений.

В
мультизадачной среде такой подход
приведет к неэкономному использованию
оперативной памяти, так как в нее будет
загружено несколько копий одних и тех
же модулей.

В
OS/2,
как и в других мультизадачных операционных
системах применяется динамическая
компоновка, исключающая дублирование
кода функций. Для этого группы используемых
вместе функций объединяются в файлы с
расширением имени .dll,
которые называются библиотеками
динамической компоновки, динамическими
библиотеками или просто DLL
— библиотеками.

В
процессе компоновки код внешних функций,
расположенных в DLL
– библиотеках, не включается в загрузочный
ЕХЕ – файл программы. Вместо этого там
располагается ссылка на внешние функции.
Когда запускается первая программа,
использующая функцию из DLL
– библиотеки, вся библиотека загружается
в оперативную память. Если потом
пользователь запустит вторую копию
этой программы, то будет использован
код функции, уже загруженный в память
в процессе работы первой программы.

Этим
достигается значительная экономия
памяти, поэтому динамические библиотеки
очень широко используются в практике
программирования. Ядро OS/2
в основном состоит из DLL
– библиотек, поэтому многие функции
ядра доступны программам через механизм
динамической компоновки.

Драйверы.

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

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

На
этом пути есть несколько неприятных
моментов:

во-первых,
трудно найти подробное описание портов
видеоконтроллеров и другой аппаратуры,
так как оно поставляется фирмами-изготовителями
не всем желающим.

во-вторых,
разнообразие аппаратуры велико. Сейчас
выпускаются сотни несовместимых друг
с другом видеоконтроллеров, принтеров,
контроллеров дисков и т. д.

в-третьих,
аппаратура постоянно совершенствуется.
Новые периферийные устройства не всегда
совместимы со старыми. Поэтому старые
программы либо не работают на новых ПК,
либо работают не так как нужно.

В
составе OS/2
поставляется набор драйверов для всех
стандартных устройств ПК, что исключает
необходимость работы с аппаратурой на
уровне портов. В крайнем случае, можно
использовать драйверы производителя
аппаратуры. Нужно только убедиться, что
он предназначен для той версии ОС,
которая используется на ПК.

Так
же как в MS
DOS
в OS/2
драйверы подключаются в файле конфигурации
config. sys
Однако в отличие от DOS
файл конфигурации содержит две команды
подключения драйверов – BASEDEV
и DEVICE.
Первая подключает базовые драйверы,
без которых работа OS/2
невозможна, вторая – все остальные.

Операционные системы

— Понимание «плоской модели памяти» и «сегментированной модели памяти»

«Модель памяти» — это как низкоуровневая, так и (относительно) высокоуровневая концепция.

В былые времена между процессорами с сегментированной моделью памяти и процессорами с «выгружаемой» или «отображаемой» моделью памяти шла своего рода «война». Машины серии Burroughs B5000 и Plessey 250 использовали модель сегментированной памяти с «возможностями» (или «дескрипторами»). То есть физическое хранилище управлялось не как концептуальные страницы фиксированного размера, а скорее как сегменты переменной длины, где каждый сегмент соответствовал некоторому логическому объекту (например, процедуре или объекту). Для адресации между сегментами использовались «реестры возможностей», которые можно было загрузить только защищенным образом и которые содержали физический адрес сегмента, длину сегмента и права доступа (например, чтение/запись/выполнение), которые исполняющий программа была дана для ссылки на сегмент.

Эти системы успешно работали, когда «выгружаемые» системы все еще пытались оторваться от земли.

Оригинальный ПК был основан на процессоре 8086, который был разработан для поддержки сегментированной архитектуры для бедняков. Было, IIRC, четыре сегментных регистра, которые можно было выбрать для добавления к 16-битному общему значению регистра для получения 20-битного адреса. Теория заключалась в том, что эти регистры будут управляться программно, подобно тому, как системы Берроуза и Плесси управляли ими, но с немного большей аппаратной поддержкой. Но до того, как можно было создать хорошее программное обеспечение для использования этой функции, DOS была привязана к 8086, и поэтому эта функция никогда не использовалась эффективно.

А что лучше, ну это уже не важно, так как сегментированной модели не существует ни в какой «реальной» (не экспериментальной) среде. Но когда-то сегментированная модель работала лучше и позволяла ОС быть более надежной. Основным негативным фактором было то, что он накладывал ограничения на компиляторов и, в некоторой степени, на программистов, которые не соответствовали установкам многих программистов «Дикого Запада» тогда и сейчас.

«Страничная» модель

«Страничная» модель предполагает, что адресное пространство разделено на «страницы» определенного размера (хотя в некоторых случаях поддерживается несколько разных размеров страниц). Обычно размер страницы составляет от 256 байт до 64 КБ (всегда степень двойки). Также предполагается, что аппаратное обеспечение содержит некоторую поддержку преобразования адресов, так что «логические» адреса (адреса в «адресном пространстве» программы) могут быть сопоставлены с «физическими» адресами (адресами в ОЗУ).

Страничная модель может быть реализована по двум основным причинам:

  1. Чтобы позволить нескольким различным потокам/процессам иметь отдельные адресные пространства, каждый из которых начинается с «нуля» (или какого-либо другого стандартного адреса), и не требует от ОС предварительной — выделить все возможное адресное пространство для потока/процесса как один непрерывный фрагмент.
  2. Включить «виртуальную память», разрешив «выгрузку» отдельных страниц в логическом адресном пространстве на диск с последующей перезагрузкой, если/когда программа попытается сослаться на них.

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

«Плоская» модель

Игнорируя Гарвардскую модель, которая, возможно, была самой первой моделью компьютерной памяти, плоская модель хранения фон Неймана была первой моделью, получившей широкое распространение. В основном это — «плоское» адресное пространство неразличимых слов (не байтов до самого конца игры), которое начиналось с нулевого адреса и продолжалось вверх до «верха» доступной памяти. Некоторая часть памяти «внизу» или «вверху» памяти будет зарезервирована для какого-то «загрузчика», а остальная часть будет доступна для одной исполняемой программы. Запускалась одна программа за раз, причем программа могла использовать всю зарезервированную область ОЗУ, кроме этой небольшой.

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

Но стремление к «мультипрограммированию» оказывало давление. Некоторые системы добавили грубое оборудование для отображения адресов, чтобы позволить нескольким программам иметь собственное адресное пространство. Другие системы требовали, чтобы программы были «самоперемещающимися», чтобы они могли работать в любом месте памяти, а не были «связаны» с определенным адресом.

Ранние версии Unix (среди прочих) выполняли задачу многозадачности, «переставляя» программы между собой: программа (загруженная по нулевому адресу) выполнялась до тех пор, пока не «заблокировалась» для выполнения ввода-вывода, затем она «заменялась местами» ( целиком, включая весь код и данные) на диск, а другая программа «заменяется» на нее.

6.1: Плоская модель памяти — Engineering LibreTexts

  1. Последнее обновление
  2. Сохранить как PDF
  • Идентификатор страницы
    27127
    • Чарльз В. Канн III
    • Геттисбергский колледж

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

    Все эти детали реализации памяти скрыты операционной системой (ОС) и не видны программисту. Программисту MIPS память кажется плоской; в нем нет структуры. Память состоит из одного байта (8 бит), хранящегося после другого, и все байты равны. Программист MIPS видит память, в которой байты хранятся как один большой массив, а индекс массива представляет собой адрес байта. Память адресуется каждому байту, поэтому называется байт с адресацией 9. 0073 . Это показано на рис. 2.3, который здесь повторяется для удобства.

    Рисунок 6-1: Конфигурация памяти MIPS

    Байты в MIPS организованы в группы: 1) одиночный байт; 2) группа из 2 байтов, называемая полусловом; 3) группа из 4 байтов, называемая словом 17 ; и 4) группа из 8 байтов, называемая двойным словом. Эти группировки не случайны в памяти. Все группировки начинаются с адреса 0x00000000 и затем появляются через равные промежутки времени. Таким образом, полуслова памяти будут начинаться с адресов 0x00000002, 0x00000004, 0x00000008, 0x0000000a, 0x0000000c и продолжаться таким же образом. Слова памяти будут начинаться с адресов 0x00000000, 0x00000004, 0x00000008, 0x0000000c, 0x00000010, 0x00000014 и так далее. Двойные слова памяти будут начинаться с адресов 0x00000000, 0x00000008, 0x00000010, 0x00000018 и так далее. Место, где начинаются группы памяти, называется 9.0072 граница . Вы не можете обратиться к группе данных, кроме как на границе для этого типа. Поэтому, если вы хотите загрузить слово памяти, вы не можете указать адрес 0x15fc8232, так как он не находится на границе слова (однако это граница байта и граница полуслова). При обсуждении данных слово памяти имеет размер 4 байта (32 бита), но оно также расположено на границе слова. Если 32 бита не выровнены по границе слова, неправильно обращаться к нему как к слову 18 .


    17 Все машины определяют собственный размер слова. Старый компьютер использовал 16-битное слово, а некоторые современные компьютеры используют 64-битное слово. Не позволяйте этому сбить вас с толку. В MIPS все слова имеют длину 32 бита.
    18 Для экономии места некоторые языки, такие как C Ada и PLI, позволяют программистам использовать невыровненные структуры данных, где некоторые данные могут не попадать в правильные границы. Невыровненные структуры использовались, когда свободное место в компьютерах было ценным, но эти структуры медленно обрабатываются. Большинство современных языков не позволяют использовать невыровненные данные, но при работе с устаревшими системами программистам, возможно, придется с этим столкнуться.


    Эта страница под названием 6.1: Модель плоской памяти распространяется под лицензией CC BY 4.0 и была создана, изменена и/или курирована Чарльзом В. Канном III.

    1. Наверх
      • Была ли эта статья полезной?
      1. Тип изделия
        Раздел или страница
        Автор
        Чарльз В. Канн III
        Лицензия
        СС BY
        Версия лицензии
        4,0
        Показать оглавление
        нет
      2. Теги
          На этой странице нет тегов.

      Leave a Comment