Логически адрес

Въведение

В компютър с функция за преобразуване на адреси, адресът (операндът), даден от инструкцията за достъп, се нарича логически адрес или относителен адрес. Действителният ефективен адрес във вътрешната памет, тоест физическият адрес, се получава чрез изчисляване или трансформиране на режима на адресиране.

Режимът на адресиране (функцията за преобразуване на адрес) на различните компютри е различен. Когато пишете програма на асемблер, първо трябва да сте запознати със системата от инструкции на тази машина.

Обяснение на справочника

1. В компютъра с функция за преобразуване на адреси, адресът (операндът), даден от инструкцията за достъп, се нарича логически адрес, наричан още относителен адрес. Физическият адрес във вътрешната памет се получава чрез изчисляване или трансформиране на режима на адресиране.

2. Адресът, използван в потребителската програма, се нарича относителен адрес или логически адрес.

3. Логическият адрес се състои от два 16-битови адресни компонента, единият е базовата стойност на сегмента, а другият е отместването. И двата компонента са кодирани с неподписани числа.

Обяснение на академичната литература

1. По този начин адресът на единицата за съхранение може да бъде представен чрез основния адрес на сегмента (адрес на сегмента) и отместването в рамките на сегмента (адрес на изместването). Базовият адрес определя местоположението на сегмента, в който се намира в цялото пространство за съхранение, а отместването определя местоположението му в сегмента. Това представяне на адреса се нарича логически адрес и обикновено се изразява под формата на адрес на сегмент: адрес на изместване.

2. Така нареченият логически адрес се отнася до местоположението на диска, дадено от номера на логическия блок на данните (l блок = 512 думи, l дума = 64 бита), а физическият адрес се определя от цилиндъра и главата на диска. , Сегмент и други физически местоположения, определени от адреса.

Предистория

Разглеждайки източника, 8-битовият компютър 8080CPU на Intel има 8-битова шина за данни (DB) и 16-битова адресна шина (AB). След това тази 16-битова адресна информация също трябва да бъде предадена през 8-битовата шина за данни и също се съхранява в скречпада в канала за данни и в регистрите и паметта на процесора, но тъй като AB е точно цяло число кратно на DB, така че няма да има противоречия!

Но когато беше надстроен до 16-битова машина, дизайнът на Intel8086/8088CPU не можеше да надвишава 40 пина поради ограничението на технологията за интегриране на IC и външната опаковка и технологията на щифтовете. Но смятам, че оригиналната способност за адресиране на 8-битова машина 2^16=64KB е твърде малка, но тя директно се увеличава до цяло число, кратно на 16, дори ако AB=32-bit не е постигнато. Следователно AB може да бъде увеличен само временно с 4 до 20. Тогава капацитетът на адресиране от 2^20=1MB е увеличен 16 пъти. Но това е причинило противоречие между 20-битовия AB и 16-битовия DB. 20-битовата адресна информация не може да бъде предадена в DB, ​​нито може да бъде съхранена в 16-битовия регистър на процесора и паметта. Така се появи принципът на структурата на сегмента на процесора.

Линеен адрес

Логическият адрес се състои от две части, идентификатор на сегмента и отместването в сегмента. Идентификаторът на сегмента се състои от 16-битово поле, наречено сегментен селектор. Първите 13 цифри са индексен номер. Кавичките могат да се разбират като долен индекс на масив - и ще съответстват на масив. Какъв индекс е? Това е "дескрипторът на сегмента". Специфичният адрес на дескриптора на сегмента описва сегмент (разбирането на думата „сегмент“: можем да разберем, че виртуалната памет е разделена на сегменти. Например паметта има 1024 Тя може да бъде разделена на 4 сегмента, всеки сегмент има 256 байтове). По този начин много сегментни дескриптори са групирани в масив, наречен "сегментна дескрипторна таблица". По този начин специфичен сегментен дескриптор може да бъде намерен директно в сегментната дескрипторна таблица чрез първите 13 бита на сегментния идентификатор. Дескрипторът описва сегмент. Абстракцията на сегмента току-що не беше точна, защото като погледнете какво има в дескриптора - тоест как е описано, можете да разберете какво има в сегмента. , Всеки сегментен дескриптор е съставен от 8 байта, както е показано на фигура 1:

Тези неща са много сложни, въпреки че структура от данни може да се използва за дефинирането им, но тук ме интересува само едно нещо, което е базовото поле, което описва линейния адрес на началната позиция на сегмент.

Първоначалното намерение на дизайна на Intel е някои глобални сегментни дескриптори да бъдат поставени в „глобалната сегментна дескрипторна таблица (GDT)“, а някои локални, като например собствения на всеки процес, да бъдат поставени в така наречения „локален сегмент Таблица с дескриптори (LDT)". Така че кога трябва да използвам GDT и кога трябва да използвам LDT? Това се указва от полето T1 в селектора на сегменти, =0 означава използване на GDT, а =1 означава използване на LDT.

Адресът и размерът на GDT в паметта се съхраняват в контролния регистър gdtr на процесора, докато LDT е в регистъра ldtr.

Много понятия, като говорене. Фигура 2 изглежда по-интуитивна:

Първо, при даден пълен логически адрес [селектор на сегмент: изместен адрес в рамките на сегмента],

1, погледнете сегментния селектор T1=0 или 1, разберете дали текущото преобразуване е сегмент в GDT или LDT и след това вземете неговия адрес и размер според съответния регистър. Имаме масив.

2. Извадете първите 13 бита от селектора на сегменти. Можете да намерите съответния сегментен дескриптор в този масив, така че да е Base, тоест основният адрес.

3, Base + offset е линейният адрес, който трябва да бъде преобразуван.

Свързани разлики

Логически адрес (Логически адрес) се отнася до частта на изместения адрес, свързана със сегмента, генериран от програмата. Например, когато правите програмиране на указател на език C, можете да прочетете стойността на самата променлива на указателя (& операция). Всъщност тази стойност е логическият адрес, който е относителен към адреса на сегмента от данни на текущия ви процес и не е свързан към абсолютния физически адрес. . Само в реалния режим на Intel, логическият адрес е равен на физическия адрес (тъй като реалният режим няма механизъм за сегментиране или страниране, процесорът не извършва автоматично преобразуване на адреса); логиката е отклонението в рамките на лимита на кодовия сегмент на изпълнението на програмата в защитения на Intel адрес на изместване в режим (приемайки, че кодовият сегмент и сегментът с данни са абсолютно еднакви). Приложните програмисти трябва да работят само с логически адреси, а механизмът за сегментиране и страниране е напълно прозрачен за вас и се използва само от системни програмисти. Въпреки че приложните програмисти могат сами да манипулират директно паметта, те могат да работят само върху сегмента на паметта, разпределен за вас от операционната система. Линеен адрес (Linear Address) е междинният слой между преобразуването на логически адрес във физически адрес. Програмният код ще генерира логически адрес или изместен адрес в сегмента плюс основния адрес на съответния сегмент за генериране на линеен адрес. Ако механизмът за пейджинг е активиран, линейният адрес може да се трансформира, за да генерира физически адрес. Ако механизмът за пейджинг не е активиран, линейният адрес е директно физическият адрес. Капацитетът на линейното адресно пространство на Intel 80386 е 4G (2 на 32-ра степен е адресиране на 32 адресна шина).

Физическият адрес (Physical Address) се отнася до сигнала за адрес, който се появява на външната адресна шина на процесора за адресиране на физическа памет, и е крайният адрес на преобразуването на адреса. Ако механизмът за пейджинг е активиран, линейният адрес ще бъде преобразуван във физически адрес с помощта на записите в директорията на страниците и таблицата на страниците. Ако механизмът за пейджинг не е активиран, линейният адрес става директно физически адрес.

Виртуалната памет се отнася до количеството памет, което компютърът представя е много по-голямо от действителната памет. Така че позволява на програмистите да компилират и изпълняват програми, които имат много по-голяма памет от реалната система. Това позволява много големи проекти да бъдат реализирани на системи с ограничени ресурси на паметта. Много подходяща аналогия е: нямате нужда от дълъг коловоз, за ​​да получите влак от Шанхай до Пекин. Трябват ви само достатъчно дълги релси (да речем 3 километра), за да изпълните тази задача. Възприетият метод е незабавно да се положат релсите отзад към предната част на влака. Стига вашата работа да е достатъчно бърза и да отговаря на изискванията, влакът може да се движи като цяла релса. Това е задачата, която управлението на виртуалната памет трябва да изпълни. В ядрото на Linux 0.11 всяка програма (процес) е разделена на виртуална памет с общ капацитет 64MB. Следователно обхватът на логическия адрес на програмата е от 0x0000000 до 0x4000000.

Понякога наричаме логическите адреси и виртуални адреси. Тъй като е подобен на концепцията за пространство на виртуалната памет, логическият адрес също е независим от действителния капацитет на физическата памет.

„Разликата“ между логическия адрес и физическия адрес е 0xC0000000, което се дължи на факта, че виртуалният адрес -> линеен адрес -> картографирането на физическия адрес е точно различно от тази стойност. Тази стойност се определя от операционната система.

Related Articles
TOP