Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Почитать про EMS и XMS в DOS, 36-битовый Windows




ОЗУ имеет адреса с кратностью 1 байт.

Когда даём запрос процессору на 1 байт, то фактически мы инициируем следующие действия:

· Спускается адрес от регистра процессора в контроллер памяти

· Определить блок из которого отдать 1 байт

· Система читает целый блок, выделяет оттуда байт

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


 

31.01.2013

struct {…} L, S;
L.xxx = …
S = L
memcmp(&L, &S, sizeof(struct?)) вернет false

a b c x y z

           

 

16 байт

struct {

int a;

char b;

double c;

short x;

char y;

int z;

}

A ??? b c ?? x y z

 

20 байт

Блок – 4 байта и перед char b идет мусор.

В языке С нет упоминания, как структура лежит в памяти.

В программе на языке С важно понимать, как она работает вне логики (что идёт за компилятором)

struct {

int a;

double c;

char b;

short x;

char y;

int z;
}

a c b x y z

           

 

16 байт!


 

Массив

char M[5];

5-20 байт

M[1] = 7;//записать 1 байт в память

Минимум можно записать 4 байта и прочитать 4 байта.

Прочитать 4 байта, заменить 1 байт и 4 записать занимает больше машинных тактов, чем записать 4 байта

Один и тот же компилятор в разных ОС может работать в разных режимах оптимизации.

 

0xABCDEF

Big Endian –

ABC DEF

 

Little Endian

DEF ABC

 

Пока читается старшая часть, можно над младшей частью выполнять действия.

В Java всегда Big Endian (заложена бинарная совместимость данных).

Если мы расширили тип, то увеличится и размер в структуре и везде в структуре.

Если в сети пытаемся построить взаимодействие машин на разных архитектурах, нужно посмотреть в чем они совместимы.

int нужен для супербыстрой обработки, чтобы быстро читать и писать.

Объекты класса С++ с точки зрения расположения в памяти

Объект в памяти – та же структура, с теми же выравниваниями и танцами вокруг дырок.

Есть адресное пространство процессора. Адрес прикладной программы формируется так:

· Таблицы виртуализации

· Алгоритмы

ВАП разных прикладных программ могут и пересекаться и не пересекаться.

Если процессор 32х и умеет обрабатывать лишь 32-битные адреса, то и ВАП – 32 бита. ВАП – это адреса (ул. Пушкинская, дом 8). Дома могут быть расположены в специальном порядке. Какие-то участки ВАП могут быть задействованы, какие-то нет.

Обмен между ПП и ОС:

1. Через регистры.

2. ОС работает в ВАП ПП
Здесь проблема: стек. Часть используется, часть недоиспользуется. ОС часть стека использует для своих нужд

Пример: как неправильно работать со стеком.

int func(){

int x;

x = 10;

return &x;

}

int a;

a = func();

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

Когда начали разрабатывать Windows, то 1 ГБ отдали под нужды ОС, которые программист не имел права использовать, и остальное место отдали под ВАП, где ОС не имела права держать свои данные. ОС присоединяет ВАП процессов к себе. Берет данные с заданием, ложит ответ и возвращает управление процессору

ОС ПРИСОЕДИНЯЕТ ПО МЕРЕ НАДОБНОСТИ К СЕБЕ АП ПРОЦЕССА

Цель: эффективность ОС.


 

5.02.2013

В 1 ГБ адресов под оборудование не влезет видеокарта размером 1, 2, 4 ГБ

Прямого доступа к конкретному байту мы не получаем.

2 ГБ ОЗУ, отданные прикладному программисту, мало. Программа х32 не сможет использовать адресов больше, потому что так скомпилирована. Нет выигрыша при переносе программ х32 на х64.

Прикладной программе, которой не нужно аппаратное обеспечение можно отдать страницы из HW. ОС эти адреса будет использовать. Если окажется, что ОС дали задачу прочитать задание из третьего гигабайта, то возникает двойственность. На практике с этим можно столкнуться с boot.ini
/3G – разрешает ПП использовать адресное пространство 3 ГБ. Corel, Photoshop, AutoCAD имеют возможность использовать третий гигабайт.

АП, доступные нашей прикладной программе

Виртуальные адреса будут преобразованы в реальные по таблицам виртуализации. В них заносятся диапазоны доступных адресов.

R W E S – 4 бита. Если установлен бит R и мы читаем, то чтение происходит. Если push и бит S установлен, то машинные команды выполняются. Если идет запись, а бит W не установлен, то будет исключение. Неправильный перенос IP и переменная воспринимается как машинная команда. Слишком много записи в стек и перетираются переменные.

Когда размеры ОЗУ выросли, стало сложно следить за каждым кусочком оперативной памяти. Появились сегменты.

Сегменты

1 сегмент – сегмента код (атрибут Е). Указатель IP позволяет исполнять машинные команды.

2 сегмент – данные статические (константы): имеет атрибут R

3 сегмент – имеет атрибут S (только push и pop)

4 сегмент – динамические переменные (RW)

Каждая программа имеет заголовок программы (какая часть бинарного файла содержит машинные команды? – сегмент кода. Какой участок хранит константы? сегмент данных и т.д.)

При включении программы в АП разворачиваются её сегменты.

Нужно создавать дополнительные сегменты, помимо основных 4ых (CS, SS, DS, ES). После реинкарнации до 64х внесли ещё 2 регистра FS, JS.

Зачем нужны ещё дополнительные регистры?
Не всегда программа пишется в виде одного бинарника, иногда программные модули загружаются динамически. Одни сегменты – это ядро, другие загружаются дополнительно.

При такой работе ядро и ПП разделены, но ведь есть ещё оборудование. Разработчики поступили также, как и с адресами ОС. В современных ОС поддерживается 4 режима:

· R – чтение

· W – запись

· E – выполнение

· S – стек

Если установлен бит R, то можем читать страницу. Если W – можем записать. Если выполняем push и страница поддерживает S, то машинные команды выполняются. Если идёт запись, а бит W не установлен, то будет исключение.

int (void)* x;
x = random;//значение имени в указатели, теперь х указывает на random
int answer = x();
*x += 1000;//адрес на +1000 байтов
answer = x();//кто знает куда я попаду

Глобальные переменные обычно размещаются в стеке статических данных.

int f(int b)
{
int c;
return c;
}

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

Возможна такая комбинация

int f(int b,...)
{
int c;
return c;
}
f(a)
f(a,a)
f(a,a,a)

Откуда функция f знает, сколько переменных передано?

Пример: функция printf(“%s%d”, …) – знает сколько и какого типа.

Как передавать и возвращать параметры?

cdecl – от последнего к первому

pasdecl – от первого к последнему

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

Если память закончилась, то malloc возвращает 0 (выделение памяти невозможно).

! Прикладной программист ничего не сделает, системный программист может расширить сегмент динамических данных.

realloc – увеличить блок памяти

функции, вызывающей увеличение моментально, нет.

После завершения работы компилятора, он не запускается.


 




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 470; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.