Sbrk увеличить сегмент данных


Sbrk увеличить сегмент данных

int brk(void * addr );

void *sbrk(intptr_t increment );

Требования макроса тестирования свойств для glibc(см. feature_test_macros (7)):

brk (), sbrk (): Начиная с glibc 2.12: До glibc 2.12: _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 ||_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

ОПИСАНИЕ

brk () устанавливает конец сегмента данных в значение, указанное варгументе addr , если это значение является приемлемым, система имеетдостаточно памяти и процесс не достиг максимально возможного размера своегосегмента данных (см. setrlimit (2)).

sbrk () увеличивает пространство данных программы на increment байт. Вызов sbrk () с increment равным 0 может быть использован длянахождения текущего местоположения маркера окончания программы.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха sbrk () возвращает предыдущий маркера окончанияпрограммы. (Если маркер окончания был увеличен, то это значение указывает наначало новой выделенной памяти). В случае ошибки возвращается (void *) -1 , а errno становится равной ENOMEM .

СООТВЕТСТВИЕ СТАНДАРТАМ


ЗАМЕЧАНИЯ

В различных системах используются различные типы для аргумента sbrk (). Обычно это int , ssize_t , ptrdiff_t , intptr_t .

Замечания, касающиеся Linux

В Linux, вызов sbrk () реализован в виде библиотечной функции, котораяиспользует системный вызов brk () и ведёт внутренний учёт для возвратастарого значения маркера окончания.


Изменить размер сегмента данных объектного файла

Здравствуйте, есть такая задача. Изменить размер сегмента данных в объектном файле. То есть в файле созданным без линковки gcc -c test.c. Сразу скажу честно, задание учебное. Я понимаю принцип расположения всех сегментов,как их посмотреть, как они буду отображены в памяти ( но тут сейчас не все так однозначно, так как используется ASLR). Знаю системные вызовы brk / sbrk , но они же исполняютс в рантайме из программы. Как изменить размер объектного файла + чтобы не повредить программу. Еще такой вопрос, почему в объектнике сегмент данных (именно .data, а не .rodata) записаны нули, если он этот сегмент вообще присутствует. Хотя инициализированные переменные присутсвуют в сорцах. Подскажите пожалуйста, куда смотреть, чтобы сделать задание и объясните на счет вопросов. Спасибо заранее.

А что мешает прилинковать файл с инициализированными нулями данными нужного размера? ld -r -o somethingnew.o test.o data.o

Еще такой вопрос, почему в объектнике сегмент данных (именно .data, а не .rodata) записаны нули, если он этот сегмент вообще присутствует. Хотя инициализированные переменные присутсвуют в сорцах.

Значит они инициализированны нулями, а инициализированные ненулями дадут ненуливое содержание в .data

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

Можно как предложено выше. Можно указать секцию:

Можно породить также файл следующего вида:

Его можно использовать вместо обычного объектника:

Sbrk увеличить сегмент данных

НАЗВАНИЕ
sbrk, brk — pacпpeдeляeт пaмять в ceгмeнтe дaнныx

ОПИСАНИЕ
Sbrk и brk иcпoльзyютcя для динaмичecкoгo измeнeния paзмepa ceгмeнтa дaнныx тeкyщeгo пpoцecca; cм. exec(3). Измeнeниe paзмepa дeлaeтcя пyтeм ycтaнoвки для тeкyщeгo пpoцecca гpaницы ceгмeнтa дaнныx, т.e. aдpeca пepвoй ячeйки пaмяти, нaxoдящeйcя зa кoнцoм ceгмeнтa дaнныx пpoцecca. Paзмep ceгмeнтa yвeличивaeтcя, ecли гpaницa вoзpacтaeт.

Sbrk дoбaвляeт incr бaйтoв к знaчeнию гpaницы ceгмeнтa и cooтвeтcтвyющим oбpaзoм измeняeт выдeлeннoe ceгмeнтy мecтo. Incr мoжeт быть oтpицaтeлeн, чтo yмeньшaeт знaчeниe гpaницы и paзмep ceгмeнтa.

B cлyчae бoльшoй мoдeли пaмяти для 286 пpoцeccopa, ecли incr бoльшe чиcлa бaйтoв, ocтaвшиxcя дo кoнцa ceгмeнтa, sbrk aвтoмaтичecки paзмeщaeт тpeбyeмыe бaйты в нoвoм ceгмeнтe дaнныx. Teм caмым гapaнтиpyeтcя пpинaдлeжнocть зaпpoшeнныx бaйтoв oднoмy ceгмeнтy. Ecли incr oтpицaтeлeн и eгo aбcoлютнoe знaчeниe paвнo длинe тeкyщeгo ceгмeнтa дaнныx, ceгмeнт aвтoмaтичecки ocвoбoждaeтcя. Ecли incr oтpицaтeлeн и eгo aбcoлютнoe знaчeниe бoльшe длины тeкyщeгo ceгмeнтa, ceгмeнт ocвoбoждaeтcя и дoпoлнитeльныe бaйты yдaляютcя из пpeдыдyщeгo ceгмeнтa дaнныx. Пpeдыдyщим являeтcя ceгмeнт, coдepжaщий дaнныe, выдeлeнныe пocлeдним вызoвoм sbrk, нe oтнocящимcя к дaннoмy ceгмeнтy.

Sbrk aвapийнo зaвepшaeтcя и paзмep ceгмeнтa нe измeняeтcя, ecли выпoлняeтcя xoтя бы oднo из cлeдyющиx ycлoвий: [ENOMEM] Зaпpoшeнo бoльшe пaмяти, чeм дoпycкaeт cиcтeмa (cм. ulimit(3)).


Пoпыткa ocвoбoдить пaмяти бoльшe, чeм ee былo y пpoцecca.

Пoпыткa ycтaнoвить гpaницy ceгмeнтa мeньшe пepвoнaчaльнoй. Пepвoнaчaльнaя гpaницa этo гpaницa в мoмeнт cтapтa пpoцecca плюc длинa paздeляeмыx дaнныx, кoтopыe были выдeлeны пocлe этoгo. Brk ycтaнaвливaeт гpaницy ceгмeнтa paвнoй знaчeнию addr и cooтвeтcтвyющим oбpaзoм измeняeт выдeлeннoe ceгмeнтy мecтo. Brk зaвepшaeтcя c oшибкoй, ecли yкaзaнный aдpec зaдaeт нecyщecтвyющий ceгмeнт или пpeвышaeт дoпycтимый cиcтeмoй пpeдeл.

BOЗВPAЩAEМOE ЗНAЧEНИE
B cлyчae ycпeшнoгo зaвepшeния sbrk вoзвpaщaeт yкaзaтeль нa нaчaлo выдeлeннoгo мecтa, a brk вoзвpaщaeт 0. Инaчe вoзвpaщaeтcя знaчeниe -1 и в errno зaнocитcя кoд oшибки. B cлyчae бoльшoй мoдeли пaмяти sbrk coздaeт нoвый ceгмeнт дaнныx и вoзвpaщaeт eгo cтapтoвый aдpec.

ЗAМEЧAНИЯ
B cлyчae бoльшoй мoдeли пaмяти для 286 пpoцeccopa вызoв «sbrk(0)» нe oбязaтeльнo вoзвpaщaeт cтapтoвый aдpec cлeдyющeгo вызoвa sbrk. B чacтнocти, тaк бyдeт, ecли cлeдyющий вызoв coздaeт нoвый ceгмeнт дaнныx. Boзвpaщaeмoe вызoвoм «sbrk(0)» знaчeниe cлeдyeт иcпoльзoвaть для oпpeдeлния иcxoднoй гpaницы ceгмeнтa дaнныx.

Sbrk увеличить сегмент данных

Retention is specified in units of seconds, for example 500 seconds. It is persistent and can survive system crashes. That is, undo generated before an instance crash, is retained until its retention time has expired even across restarting the instance. When the instance is recovered, undo information will be retained based on the current setting of the UNDO_RETENTION initialization parameter.

The UNDO_RETENTION parameter can be set initially in the initialization parameter file that is used by the STARTUP process:

The UNDO_RETENTION parameter value can be changed dynamically at any time using the ALTER SYSTEM command:

ALTER SYSTEM SET UNDO_RETENTION = 5;

The effect of the UNDO_RETENTION parameter is immediate, but it can only be honored if the current undo tablespace has enough space for the active transactions. If an active transaction requires undo space and the undo tablespace does not have available space, the system starts reusing unexpired undo space. Such action can potentially cause some queries to fail with the «snapshot too old» error.

Илон Маск рекомендует:  Infinity - Константа

If the UNDO_RETENTION initialization parameter is not specified, the default value is 900 seconds.
Choosing the Retention Period for Flashback Queries

The retention period for undo information is an important factor in the execution of flashback queries. Oracle’s flashback query feature enables you to see a consistent version of the database as of a specified time in the past. You can execute queries, or even applications, as of a previous time in the database. The Oracle supplied DBMS_FLASHBACK package implements this functionality at the session level. At the object level, flashback queries use the AS OF clause of the SELECT statement to specify the previous point in time for which you wish to view data.

The retention period determines how far back in time a database version can be established for flashback queries. Specifically, you must choose an undo retention interval that is long enough that it enables you to construct a snapshot of the database for the oldest version of the database that you are interested in. For example, if an application requires that a version of the database be available reflecting its content 12 hours previously, then UNDO_RETENTION must be set to 43200.

When using automatic undo management, the RETENTION value for LOB columns is set to the value of UNDO_RETENTION.
See Also:
Oracle9i Application Developer’s Guide — Fundamentals for information about using the flashback query feature
Oracle9i Supplied PL/SQL Packages and Types Reference for a description of the DBMS_FLASHBACK package
Oracle9i SQL Reference for a description of the AS OF clause of the SELECT statement
Calculating the Space Requirements For Undo Retention

Given a specific UNDO_RETENTION parameter setting and some system statistics, the amount of undo space required to satisfy the undo retention requirement can be estimated using the following formula:


UndoSpace = UR * UPS + overhead

where:
UndoSpace is the number of undo blocks
UR is UNDO_RETENTION in seconds
UPS is undo blocks for each second
overhead is the small overhead for metadata (transaction tables, bitmaps, and so forth)

As an example, if UNDO_RETENTION is set to 2 hours, and the transaction rate (UPS) is 200 undo blocks for each second, with a 4K block size, the required undo space is computed as follows:

Как sbrk /brk реализован в Linux?

Я думал о том, как ядро ​​Linux реализует системные вызовы, и мне было интересно, кто-нибудь может дать мне общее представление о том, как работает sbrk /brk?

Я просмотрел код ядра, но его так много, и я его не понимаю. Я надеялся на резюме от кого-то?

4 ответа

В представлении очень высокого уровня ядро ​​Linux отслеживает память, видимую для процесса, как несколько «областей памяти» ( struct vm_area_struct ) , Существует также структура, которая представляет (опять же в очень высоком уровне) все адресное пространство процесса ( struct mm_struct ). Каждый процесс (кроме некоторых потоков ядра) имеет ровно один struct mm_struct , который, в свою очередь, указывает на все struct vm_area_struct для памяти, к которой он имеет доступ.

Системный вызов sys_brk (находится в mm/mmap.c ) просто настраивает некоторые из этих областей памяти. ( sbrk — это оболочка glibc для brk ). Это делается путем сравнения старого значения адреса brk (находится внутри struct mm_struct ) и запрашиваемое значение.

Было бы проще сначала посмотреть на семейство функций mmap , поскольку brk это особый случай.

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

реальная оперативная память делится на страницы, традиционно по 4 КБ каждая. каждый процесс имеет свое собственное отображение MMU, которое представляет этому процессу линейное пространство памяти (4 ГБ в 32-разрядной версии Linux). конечно, не все они на самом деле выделены. сначала он почти пустой, то есть реальная страница не связана с большинством адресов.

когда процесс находит нераспределенный адрес (пытается прочитать, записать или выполнить его), MMU генерирует ошибку (аналогично прерыванию) и вызывается система VM. Если он решает, что какая-то ОЗУ должна быть там, он выбирает неиспользуемую страницу ОЗУ и связывается с этим диапазоном адресов.

Таким образом, ядру все равно, как процесс использует память, а процессу на самом деле все равно, сколько там ОЗУ, оно всегда будет иметь одинаковые линейные 4 ГБ адресного пространства.

Теперь brk/sbrk работают на несколько более высоком уровне: в принципе, любой адрес памяти «за пределами» этой метки недопустим и выигран. Если получить доступ к странице ОЗУ, процесс будет уничтожен. библиотека userspace управляет выделением памяти в пределах этого предела и только при необходимости просит ядро ​​увеличить его.


Но даже если процесс запустится с установкой brk на максимально допустимый уровень, он не получит реальные страницы ОЗУ, пока не запустится доступ ко всем этим адресам памяти.

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

Ключевой концепцией того, как ядро ​​Linux передает память пользовательскому процессу, является то, что доступная куча процессов (сегмент данных) растет снизу. ядро не отслеживает отдельные фрагменты памяти, только непрерывный блок памяти. Системные вызовы brk /sbrk увеличивают объем памяти, который есть у процесса, но процесс должен управлять им в виде полезных частей.

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

Илон Маск рекомендует:  Что такое код putc

Сегментация памяти в современных операционных системах

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

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

Я видел, что таНос может быть реализован в Linux с помощью вызова «sbrk», что увеличивает размер сегмента данных. Опять же, это «сегмент данных» только область памяти, которая используется для передачи данных по конвенции, а не в «реальном» сегментом? (Дополнительный вопрос: «sbrk», кажется, не быть в состоянии уменьшить размер «сегмент» Означает ли это, что процесс никогда не может освободить память для ОС, кроме отказа от курения.?)

Кроме того, я интересно узнать, почему современные операционные системы, кажется, не будет использоваться (перемещаемый) сегментации. Не было бы предотвратить некоторые виды атак, чтобы иметь код, проживающих в его собственном защищенном сегменте, тем самым повышая безопасность? С другой стороны, это сделало бы, например, JIT компиляции невозможно / трудно?

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

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

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

Ваш вопрос об освобождении памяти , полученной через sbrk ответа здесь: Как я свободная память получается sbrk ()?

Сегментация на самом деле является вопрос о структуре операционной системы не на архитектуре. В плоской модели есть только один адрес сегмента, то есть значения CS, DS, . фиксированы операционная система и программы адрес максимальные смещения 4 ГБ (для 32-разрядного процессора). Я не знаю, если есть такие современные операционные системы, но можно не только адресное пространство 4 Гб, но 64TB (2 ^ 46) адресное пространство 16 бит для сегментных регистров + 32 бита смещения.


Сегментация памяти в современных операционных системах

При изучении операционных систем (в основном с Linux в качестве справочника) есть несколько моментов, которые я не нашел в объяснении материала, который я изучил.

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

Я видел, что malloc можно реализовать в Linux, используя вызов sbrk, который увеличивает размер сегмента данных. Опять же, этот «сегмент данных» — это область памяти, которая используется для данных по соглашению, а не «реальный» сегмент? (Дополнительный вопрос: «sbrk», похоже, не может уменьшить размер «сегмента». Означает ли это, что процесс никогда не может освободить память для ОС, кроме отказа?)

Также меня интересует зная, почему современные операционные системы, по-видимому, не используют сегментную сегментацию. Разве это не помешало бы некоторым видам атак иметь код, находящийся в собственном защищенном сегменте, тем самым повышая безопасность? С другой стороны, будет ли это делать, например, JIT сбор невозможно/трудно?

Кроме ответов «да»/«нет» на вышеуказанные вопросы, меня интересует любая проницательная разработка по этому вопросу.

Благодарим вас заблаговременно.

Создан 26 фев. 12 2012-02-26 23:45:08 Halle Knast

Существует также ‘brk’, который * может * установить разрыв программы до более низкого значения. А сегменты * * разбиваются на страницы, и каждая страница * может * быть действительно доступна только для чтения или не выполнять, и сегмент текстового сегмента и ро-данных обычно устанавливается таким образом. – Kerrek SB 26 фев. 12 2012-02-26 23:53:08

1 ответ

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

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

Ваш вопрос об освобождении памяти, полученной через sbrk ответа здесь: How do I free memory obtained by sbrk()?

Создан 27 фев. 12 2012-02-27 09:44:03 Gnurou

Благодарим вас за ответ. Разве мы не можем извлечь выгоду из сегментации _paged_? Мне кажется, что сегменты в реальных сегментах с собственным адресным пространством упростили бы управление памятью и исключили бы возможность того, что сегмент стека и данных достигнет друг друга. Обработка сегмента может обрабатываться компилятором/компоновщиком. Во всяком случае, я думаю, что использование слова «сегмент» в сегменте данных и т. Д. Просто требует путаницы. Наверное, я должен добавить некоторые примечания о различиях к некоторым страницам в Википедии :)Halle Knast 28 фев. 12 2012-02-28 16:09:41


@Gnurou Я думаю, что у вас это перепутано. сегменты x86 определены в _linear_ (то есть виртуальном) адресном пространстве, что означает, что пейджинг появляется после сегментации.Это четко указано в разделе 3.1 [Руководство разработчика Intel® 64 и IA-32: Vol. 3A] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html). – reima 25 июл. 12 2012-07-25 20:15:33

Илон Маск рекомендует:  Чередующиеся квадраты

reima: вы правы — спасибо, что указали это. Удаление этих комментариев. – Gnurou 26 июл. 12 2012-07-26 01:29:23

Может памяти, выделенные через ттар перекрывать сегмент данных

malloc Функция использует как sbrk и mmap функцию. Теперь sbrk функция увеличивает или уменьшает сегмент данных. Таким образом , он растет линейно. Теперь мой вопрос, является этой линейность всегда поддерживается, или к примеру, mmap вызов может выделить память перекрывающего сегмента данных?

Я говорю о многопоточных программах , работающих на многоядерных системах. Этот блог рассказывает о некоторых серьезных недостатков sbrk для многопоточных программ, и это указывает на то , что возможно , что память выделяется sbrk могут быть перемешаны с памятью alloacted с mmap ( куча может стать прерывистым , так как область или общий объект препятствует росту кучи ). sbrk mmaped

Это сообщение в блоге не видит за деревьями леса; только malloc реализация разрешено называть sbrk с ненулевым аргументом. Точнее, большинство malloc реализаций Unix перестанут правильно функционировать (и я имею в виду «программа зависнет») , если код приложения вызывает sbrk с ненулевым аргументом. Если вы хотите , чтобы сделать большое выделение непосредственно из операционной системы вы должны использовать , mmap чтобы сделать это.

(Это правда , что в многопоточной программе, malloc должно внутренне обернуть семафор вокруг своих звонков sbrk , но это деталь реализации. POSIX говорит malloc потокобезопасно, что это важно для программиста.)

mmap не будет выделять память перекрытия на brk площади , если не используется MAP_FIXED . Если вы используете MAP_FIXED и ваша программа взрывает вы получите сохранить все части.

Ядро пытается не делать этого, но mmap в нормальном режиме , вероятно , может выделить память , близкую к верхней части brk области. Если это происходит, то последующий sbrk вызов , который будет сталкиваться с mmap регионом не в состоянии . Это будет не выделять несмежную память. Хорошие реализации malloc должны обнаружить это условие и начать использовать mmap для всего. На самом деле я не пробовал, но тестовая программа будет довольно легко писать.

void *sbrk(int amount)

Эта функция не определена стандартом ANSI С.

Функция sbrk() наращивает на величину amount байт (или уменьшает, если задано отрицатель­ное значение) память, выделенную для сегмента данных. В случае успеха возвращается указатель на старый адрес останова (break address). В противном случае возвращается значение —1, а пере­менная errno устанавливается равной ENOMEM (недостаточно памяти).

Поскольку использование функции sbrk() крайне специфично, примеры не приводятся.

Сегментация памяти в современных операционных системах

При изучении операционных систем (в основном с Linux в качестве справочника) есть несколько моментов, которые я не нашел в объяснении материала, который я изучил.


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

Я видел, что malloc можно реализовать в Linux, используя вызов sbrk, который увеличивает размер сегмента данных. Опять же, этот «сегмент данных» — это область памяти, которая используется для данных по соглашению, а не «реальный» сегмент? (Дополнительный вопрос: «sbrk», похоже, не может уменьшить размер «сегмента». Означает ли это, что процесс никогда не может освободить память для ОС, кроме отказа?)

Также меня интересует зная, почему современные операционные системы, по-видимому, не используют сегментную сегментацию. Разве это не помешало бы некоторым видам атак иметь код, находящийся в собственном защищенном сегменте, тем самым повышая безопасность? С другой стороны, будет ли это делать, например, JIT сбор невозможно/трудно?

Кроме ответов «да»/«нет» на вышеуказанные вопросы, меня интересует любая проницательная разработка по этому вопросу.

Благодарим вас заблаговременно.

Создан 26 фев. 12 2012-02-26 23:45:08 Halle Knast

Существует также ‘brk’, который * может * установить разрыв программы до более низкого значения. А сегменты * * разбиваются на страницы, и каждая страница * может * быть действительно доступна только для чтения или не выполнять, и сегмент текстового сегмента и ро-данных обычно устанавливается таким образом. – Kerrek SB 26 фев. 12 2012-02-26 23:53:08

1 ответ

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

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

Ваш вопрос об освобождении памяти, полученной через sbrk ответа здесь: How do I free memory obtained by sbrk()?

Создан 27 фев. 12 2012-02-27 09:44:03 Gnurou

Благодарим вас за ответ. Разве мы не можем извлечь выгоду из сегментации _paged_? Мне кажется, что сегменты в реальных сегментах с собственным адресным пространством упростили бы управление памятью и исключили бы возможность того, что сегмент стека и данных достигнет друг друга. Обработка сегмента может обрабатываться компилятором/компоновщиком. Во всяком случае, я думаю, что использование слова «сегмент» в сегменте данных и т. Д. Просто требует путаницы. Наверное, я должен добавить некоторые примечания о различиях к некоторым страницам в Википедии :)Halle Knast 28 фев. 12 2012-02-28 16:09:41

@Gnurou Я думаю, что у вас это перепутано. сегменты x86 определены в _linear_ (то есть виртуальном) адресном пространстве, что означает, что пейджинг появляется после сегментации.Это четко указано в разделе 3.1 [Руководство разработчика Intel® 64 и IA-32: Vol. 3A] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html). – reima 25 июл. 12 2012-07-25 20:15:33

reima: вы правы — спасибо, что указали это. Удаление этих комментариев. – Gnurou 26 июл. 12 2012-07-26 01:29:23

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL