1 | |
Почему начальные адреса в ОП, на которые загружается программа, одинаковы на всех компьютерах?08.04.2018, 16:48. Показов 2504. Ответов 27
Метки нет (Все метки)
Т.е. есть некая программа. Есть адрес в ОП, например 0xE123F456. Скомпилированный исполняемый файл программы на конкретном компьютере начинает загружаться, начиная с этого адреса. На другом компьютере начальный адрес будет тем же самым.
Но, допустим, программ на компьютере очень много. Теоретически, их может быть больше, чем число адресов в ОП. Получается, на всех программ начальных адресов не хватит? А как тогда будут загружаться ДВЕ программы, имеющие один и тот же начальный адрес? Т.е. вторая загрузится лишь после того, как будет выгружена первая программа и будет освобожден начальный адрес загрузки?
0
|
08.04.2018, 16:48 | |
Ответы с готовыми решениями:
27
Почему макрос работает не на всех компьютерах?? Вывести начальные индексы всех непрерывных последовательностей чисел со значениями, которые не увеличиваются Программа работает не на всех компьютерах Помогите! Почему у меня не идёт программа на других компьютерах? |
Эксперт Hardware
|
|
08.04.2018, 17:34 | 2 |
Сообщение было отмечено Htext как решение
Решение
..памяти хватит хоть на 20 программ, т.к. память у винды - виртуальная.
Физическая ОЗУ делится на фреймы, в которых отображаются виртуальные страницы запущенных программ. Виртуальный и физический адреса не совпадают, поэтому загруженные по одному-и-тому-же базовом адресу программы, на самом деле находятся в разных областях (фреймах) физической памяти. Когда свободные фреймы в ОЗУ заканчиваются, то редко/используемые из них выгружаются на диск, в т.н. своп-файл (pagefile.sys). Кстати, большинство EXE-программ загружаются по фиксированному виртуальному адресу, который равен не 0xE123F456 (как ты говоришь), а по адресу 0x00400000 . Для библиотек DDL имеется свой адрес 0x10000000 . В дизассемблере W32Dasm можно узнать конкретный адрес, в поле 'ImageBase' - база образа в памяти:Код
Disassembly of File: D:\PETools.exe --------- *.exe -------+ Code Offset = 00000400, Code Size = 0003B600 | Data Offset = 00000400, Data Size = 0003B600 | Number of Objects = 0002 (dec), Imagebase = 00400000h <----+ ------------------- Disassembly of File: D:\about.dll ----------- *.dll -------+ Code Offset = 00000400, Code Size = 00000E00 | Data Offset = 00001200, Data Size = 00000200 | Number of Objects = 0004 (dec), Imagebase = 10000000h <----+
5
|
08.04.2018, 17:59 [ТС] | 3 |
А разве в Linux не делается подобная виртуализация?
Добавлено через 6 минут Правильно ли я понял, что - это начальный адрес, а и - смещения от ЭТОГО адреса? Попутный вопрос - а почему смещения кода и данных совпадают?
0
|
Эксперт Hardware
|
|
08.04.2018, 21:43 | 4 |
..виртуальную память включает сама система, она-же (точнее её менеджер памяти) и управляет ей. При переходе из реального режима(RM) в защищённый(PM), становятся доступными 32/64-битные адреса памяти (в реальном режиме адрес 20-битный). Как распрорядиться этой памятью, и как организовать её - дело разработчика оси. Ты можешь сам включить/выключить вирт/память.
ЦП имеет регистры управления(CR0-CR4) и машинные регистры(MSR), с помощью которых и настраивается модель памяти. Почитай про таблицы GDT/LDT/IDT, регистр(CR0) и регистр задачи(TR). Регистр задачи указывает на базу, куда скидывается весь контент текущей задачи, при переключении на другую задачу. ЦП работает только с одной задачей, и что-бы перейти на другую, нужно запомнить состояние текущей значения всех регистров и прочее. В регистре(CR3) хранится адрес каталога виртуальных страниц текущей задачи 'PDT - Page Directory Table'. У каждой задачи свой каталог вирт/страниц. Это мутная тема, и сходу в ней не разберёшься. Достаточно внятно этот механизм описан в манах Интела IA32/64 vol.3 'Programming Guide'. ..правильно. есть 2-вида адресов VA и RVA - первый 'виртуальный', а второй 'Relative' - относительно виртуального. Обычно, смещения кода и данных не совпадают. В данном случае я привёл неудачный пример хакерской утилиты 'PETools', в которой (видимо) секция-данных открыта на запись (совмещена с секцией кода). От сюда и глюк... Если посмотреть на другие программы, то в них всё будет нормально. Вот лог дизассемблера HDasm (Hackers Disambler), в которой секция-данных отмечена исполняемым флагом 'CODE'. Здесь-же видны и адреса загрузки секций в память (.data ляжет по вирт/адресу 0х00401400): Код
File: PETools.exe Size: 435*200 Type: PE Base Of Code: 00001000, Code Size: 00000000 Base Of Data: 00001000, Data Size: 0006A000 Image Base: 00400000 Entry Point: 0042BC3E Sections: Name | VirtAddr | VirtSize | Offset | PhysSize | Flags | Code ----------+----------+----------+----------+----------+----------+------ .data | 00401000 | 0003B5E8 | 00000400 | 0003B600 | C0000040 | Yes .rsrc | 0043D000 | 0002E8B8 | 0003BA00 | 0002EA00 | 40000040 | * Entry Point (от сюда начинается код): -------------- 0042BC3E: 55 push ebp 0042BC3F: 8BEC mov ebp, esp 0042BC41: 6AFF push FFFFFFFF 0042BC43: 68E8874000 push 004087E8 0042BC48: 686CB24200 push 0042B26C 0042BC4D: 64A100000000 mov eax, fs:[00000000] 0042BC53: 50 push eax 0042BC54: 64892500000000 mov fs:[00000000], esp 0042BC5B: 83EC58 sub esp, 00000058 0042BC5E: 53 push ebx 0042BC5F: 56 push esi 0042BC60: 57 push edi 0042BC61: 8965E8 mov [ebp-18], esp 0042BC64: FF154C124000 call KERNEL32.GetVersion ............
4
|
Эксперт Hardware
|
|
09.04.2018, 20:41 | 6 |
Htext, вот ещё тема, может найдёшь-что полезного...
0
|
10.04.2018, 16:15 [ТС] | 7 |
R71MT, спрошу здесь, чтобы ту тему не засорять. Вроде бы, 64-разрядные ОС не поддерживают сегментацию?
https://books.google.ru/books?... 8E&f=false Добавлено через 14 минут Сегментных регистров, вроде бы, 4, а не 6 (кода, данных, стека, дополнительный).
0
|
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|
10.04.2018, 17:41 | 8 |
Вы вот ссылку дали, а до конца информацию там не прочитали.
Сегментная организация памяти используется в 16-ти битном коде DOS, который, ОСи 64-ех битные уже не поддерживают. Селекторная организация памяти, использует те же сегментные регистры(ну не выбрасывать же их), что и сегментная адресация, ВОТ ТОЛЬКО информация в них хранится УЖЕ другая, Аналогично страничная организация памяти - отличается от селекторной Никто даже не спорит(см. рис), всё, что *S - сегментный регистр.
0
|
10.04.2018, 18:33 [ТС] | 9 |
Там написано, что при 64 разрядах сегментация является устаревшей, больше не поддерживается и применяется только в унаследованном режиме (конец стр. 285). И что остатки старых механизмов сегментации... не предлагают реальную сегментацию (начало стр. 286).
Вы говорите о сегментных регистрах (в которых теперь, да, хранится другая информация). А я - о сегментации ОП. Которой в 64-ОС больше нет. Добавлено через 15 минут Видимо, вместо одного дополнительного - три, т.е. для кода, стека и данных. Просто я всегда считал, что дополнительный - 1. Так было в 086, по-моему.
0
|
Эксперт Hardware
|
|
10.04.2018, 18:51 | 10 |
..у меня проц на машине 32-битный, поэтому с 64-бит экспериментов не проводил, но как утверждает INTEL в своём мане IA64/32 vol(1) - "сегментация неподдерживается частично". Сегментных регистров по-прежнему шесть:
Код
CS - code; SS - stack; DS,ES,FS,GS - data. По-русски это означает, что в х64, базы сегм/регистров [CS,DS,ES,SS] на аппаратном уровне сбрасываются в нуль, хотя FS и GS являются исключениями. В этом и смысл выражения "..неподдерживается частично". При нулевых селекторах, получаем плоскую модель памяти 'FLAT' для кода, данных и стека - логический адрес совпадает с линейным. FS и GS могут использоваться в качестве доп/базовых регистров для указания локальных данных и структур ОС. Поскольку в PMode [CS,DS,ES,SS] при любых обстоятельствах равны нулю, то 16-битный режим реальных адресов неподдерживается вообще, т.к. требует изменения этих регистров - совместимость только с х32. Кстати, поэтому и 64-битные отладчики не показывают в своём окне сегм/регистры [CS,DS,ES,SS], а только [FS,GS] будучи уверенными, что в них и так находятся нули (мол, если уж отлаживаешь, то должен об этом знать):
1
|
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|
10.04.2018, 19:54 | 11 |
где я говорил о регистрах? Начиная со всех 32-х битных ОСей, режим DOS'а в командной строке ЭМУЛИРОВАЛСЯ. Т.е. сегментация уже была и не сегментацией вовсе.
0
|
11.04.2018, 22:04 [ТС] | 12 |
Constantin Cat
- вот здесь. Добавлено через 14 минут Причем тут командная строка, эмуляция. Здесь дело не в сегментации ОП. По поводу сегментации в 32-х - с Вами Э. Таненбаум не согласен, который в начале стр. 286 (по ссылке) пишет, что в системах Х86-32 до сих пор есть сегменты (конкретно, абзацы 2, 3). Он даже конкретно отмечает, что есть сегмент кода, данных и стека. На рисунке 3.36 описывается структура дескриптора сегмента кода (а сегмент кода - это участок в ОП). Еще раз: сегментация устарела лишь в 64-х. В 32-х она присутствовала. Добавлено через 3 минуты Если уж Вы упомянули эмуляцию DOS, так это связано, повторюсь, вовсе не с отсутствием сегментации. А с тем, что в DOS присутствовали (были разрешены) опасные системные вызовы, например, непосредственно к устройствам. Которые MS решила заблокировать. И посему и ввела виртуальную машину DOS, реализовав т.н. "метод трамплина". Могу написать об этом подробнее. Добавлено через 1 минуту Если кратко - до речь идет о вынесении программ под DOS в область более высоких адресов, выше 4 МБ.
0
|
Эксперт Hardware
|
||||||
12.04.2018, 01:29 | 13 | |||||
..открою маленький секрет, что буквально все процессоры(64/32) в защищённом режиме используют одинаковую модель памяти. По большей мере связано это с тем, что новая организация/адресация памяти требует новых компиляторов (С++, ассемблер etc). Отсюда следует, что никаких изменений подсистемы памяти даже в отдалённом будущем не планируется, т.к. придётся переписывать все компиляторы.
Сегментация в любом её виде - это абстракция. Попробую объяснить, почему.. Любая ОС адресует память посредством всего 2-х селекторов - один CS; другой DS,ES,SS,GS,FS. Оба селектора имеют базу(0) и лимит(4Gb). В FS загружает селектор сегмента TEB (Thread_Environment_Block', он-же TIB). Фактически, ОС выделяет всего один сегмент и для кода, и для данных, и для стека. Благодаря этому все переходы внутри программы типа 'NEAR' (близкие.. префиксы не нужны). Хотя селектор(CS) не равен селекторам(DS,ES,SS), дополнение этими префиксами операндов приведёт к чтению одной и той-же ячейки памяти. Вот пример:
На рисунке видно, что селекторы в регистрах различные, но на адресацию памяти они не влияют (красным выделены базы, а синим - лимиты, во-всех РОН находится тестовое значение). Регионы кода, стека и данных отличаются лишь атрибутами принадлежащих им страниц: CS=R/Ex, DS=R/W, SS=R/W/Ex. Начиная с Win7, атрибут исполнения(Ex) у регистра(SS) уже отняли, и за исполняемым стеком чутко следит визор. В селекторах сегментных регистров, атрибуты контролируют только хозяина сегмента (юзер или ОС - уровень привелегий), а в дескрипторах - уже контроль на доступ к самим страницам памяти (R,W,Ex). Чтобы раз и навсегда избавиться от этой путаницы, в 64-бит системах на аппаратном уровне запихали нули во-все селекторы, ведь у 32 они всё-равно были нулевые. При этом, 'защиту от дурака' тоже предусмотрели, и в РМode, блок сегментации в MMU вообще отключили. Достоверно проверить не могу (у меня проц 32-бит), но думаю-что в реальном режиме сегментация у 64-бит всё-таки работает, чтобы обеспечить Reset и POST при включении машины. Хотя в этом году я уже ошибался 4-раза, и может это пятый...
1
|
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|
12.04.2018, 19:56 | 14 |
Он пишет на странице 286, строка 11:
Он не согласен даже сам с собой. То он говорит, что:
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
13.04.2018, 08:43 | 15 |
Шесть, четыре, да и то правильно и это.
У 8088, 8086, 80186, 80286 их было четыре: CS DS ES SS. Начиная с 80386 появились еще и FS GS и их стало шесть. Весь вопрос о чем идет разговор. Если разговор идет про 32-разрядный режим, то сегментных регистров однозначно шесть. Поскольку их стало шесть одновременно с появлением этого режима. А если про x86 вааще, да хоть и про селекторы-шмелекторы, то как бы то ли так, то ли эдак. Потому как у 80286 в их 16-разрядном защищенном уже появились эти шмелекторы, а сегментных регистров было все еще четыре. А до 80286 в сегментном регистре был ни разу не шмелектор, а номер параграфа и никогда ничего другого. Такой вот дрейф понятий, не знаю как это изложено у Танненбаума.
0
|
13.04.2018, 19:42 [ТС] | 16 |
В приведенном Вами абзаце - да (до п.3.7.3, по тексту книги). Но, наш разговор идет не о MULTICS, а о х86: 32-х / 64-х. В самом начале п.3.7.3 идет речь о том, что до появлении 64-х напоминала память MULTICS. А вот дальше как раз и идет речь о х86.
Видимо, да. Потому что в ОП нет отдельно выделенных сегментов (кода, данных или стека). Там - только страницы. При преобразовании виртуального адреса (например,такого: - в физический осуществляется сегментно-страничное распределение. Вначале, да, виртуальный адрес 0x00400000 преображается, по сути, в некое подобие виртуального же адреса сегмента. Который еще НЕ является адресом физической страницы ОП. А вот в последующем процессе, при преобразовании этого адреса (в рамках страничного преобразования) получается базовый физический адрес со смещением. Т.е. по сути, получается, что сегменты, в самом деле, имеют виртуальный характер. Так вот, насколько я понимаю, в 64-х убрано сегментное преобразование, осталось только страничное (а в 32-х было сегментно-страничное). Что же касается компиляторов - ведь они же не работают с физическими адресами ОП. Они формируют виртуальные адреса. А потом уже (вроде, Вы здесь об этом уже говорили) происходит преобразование в физические адреса. НО: какой будет конкретный алгоритм такого преобразования (страничный ли, сегментно-страничный) - это уже зависит от ядра ОС. Но, не от компилятора. Это как по аналогии с сайтами. Допустим, есть домен site.ru. И есть система DNS (аналог ядра ОС в данном случае). Набрав в браузере адрес site.ru (аналог виртуального адреса), попадаем на этот сайт. Но, это - виртуальный адрес. Тогда как физически этот сайт может находиться в любом месте, даже на другом континенте. Так вот, DNS в данном случае и осуществляет переадресацию запроса браузера именно на тот сервер сети, IP-адресу (аналог физического адреса) которого соответствует указанное доменное имя.
0
|
21.04.2018, 14:55 [ТС] | 17 |
R71MT, в той теме Память компьютера
Вы упоминаете про 4 кольца защиты. Здесь я не совсем понял. Вроде бы, в Windows/Linux существует лишь ДВА режима: пользовательский и привилегированный (ядерный). Т.е. только 2 кольца? Это вот, скажем, в OpenVMS, да, вроде как, 4 режима (кольца защиты). Или - кольцо защиты - это нечто иное? Добавлено через 10 минут И, еще, попутный вопрос: Вы каким источником руководствовались, составляя тот материал (я смотрю, картинки англоязычные, видимо, с какого-то англоязычного ресурса)?
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
21.04.2018, 18:55 | 18 |
Windows/Linux просто не используют Ring 1 и Ring 2. То есть архитектурой процессоров предусмотрено 4 кольца: 0 1 2 3, но этими операционками используются из них только два: 0 и 3.
0
|
Эксперт Hardware
|
|
21.04.2018, 19:31 | 19 |
..это одно и тоже.
Традиционно, x86 спосбны обеспечивать 4-кольца защиты (выделяются 2-бита), в порядке: ядро ОС (супервизор), драйвера, библиотеки, юм-приложения. Винда-же использует только два из них, и то не всегда. К примеру, какой-нить Legacy-драйвер вполне может характеризовать себя первым кольцом. Это просто привелегия доступа к данным. Сейчас появился ещё и гипервизор, который имеет приоритет перед супервизором, поэтому теперь сам чёрт не разберёт ихние дела. Но как-правило, это значения 0/core, и 3/user. ..материал собирал по-крупицам из разных источников, а картинки - половину рисовал сам, а половину одолжил у манов интела: Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide
1
|
21.04.2018, 21:18 [ТС] | 20 |
На самом деле, ОЧЕНЬ ценный материал. Я сколько ни смотрел - ни в одной книге так обстоятельно не изложено. В основном - как-то поверхностно. Или, напротив, излишняя детализация на чем-то без единого, цельного анализа. Спасибо Вам). Я, конечно, пока еще даже 1/5 не осилил.
0
|
21.04.2018, 21:18 | |
21.04.2018, 21:18 | |
Помогаю со студенческими работами здесь
20
Программа, которая использует связь с БД, работает не на всех компьютерах. Почему моя программа может не работать на компьютерах других пользователей? Как сделать чтобы готовая программа с базой данных работала на всех компьютерах? Узнать адреса всех запросов, которые слушает Spring Почему не загружается моя программа Адреса двух разных переменных одинаковы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |