Architecture - andyceo/documentation GitHub Wiki
- История компьютеров
- Устройство ЭВМ
- Процессор x86 (будем работать с отладчиком)
- Защищенный режим (для понимания того что написано dmesg)
Машина Бэббиджа - но она была построена после первого компьютера
Компьютером называем Машину Тьюринга (мат. аппарат, теория вычислимости)
Исходная статья Тьюринга на русский никогда не переводилась.
Z2 (релейный) - немцы, вторая мировая. это не первый комп, но первый работающий (был Z1 - механический, неточные шестерни).
ткацкий станок - не компьютер, не тьюринг-полный. он просто ткет ткань по программе.
Абак (счеты) - одно из первых приспособлений для счета.
Астролябия - один вращающийся диск внутри другого, позволяет сказать, какие звезды мы увидим, исходя из нашего положения, или наоборот, позволяет определить местоположение по звездам.
Антикиферский механизм (греки, антикифера) - предсказывает лунные и солнечные затмения.
(общая память), устройство управления, арифметико-логическое устройство, ввод/вывод. Это не единственная возможная архитектура. Есть еще Гарвардская архитектура. Отличительная особенность архитектуры Фон-Неймана - память для данных и для команд одна и та же (неочевидная идея, первые компы задавали команды переключением проводников, логично было разделять команды и данные, также, такая архитектура создает проблемы безопасности).
PDF - cтр. 14.
RISC - строят такие процессоры, которые даже не могут умножать. Тактовая частота наращивается, хорошо позволяет распараллеливать.
CISC (внутри RISC) - позволяет менять микропрограмму процессора. Проблема F00F - инструкция, начинающаяся с этих двух байт, останавливала процессор полностью (обычная пользовательская программа)
В линуксе есть служба, при старте системы, она каждый раз загружает в процессор обновленную микропрограмму.
Процессоры Transmeta - linux внутри. регулировать тепловыделение плавно. Как раз когда Трансмета выпустила свои процессоры, интел подсуетился и для своих процессоров запустил SpeedStep.
x86-64 - это придумала AMD. Intel в то время пошла по пути VLIW - процессоры Itanium. Itanium называли Titanium (аллюзия на титаник). Несовместимые с ним программы должны были выполняться в виртуальной машине (в процессоре есть средства виртуализации), и он дорогой.
PDF-страница 15.
Сначала набор инструкций 32-разрядный (макс. 4 мегабайта памяти), перешли на 64-разрядные. Но до сих пор используется 32-разрядные команды, т.к. указатели меньше в два раза.
ARM - применяются там, где есть сниженное тепловыделение и энергопотребление.
MIPS - в маршрутизаторах
Процессор - шина - устройства. Шина - сразу узкое место.
Нужны шины разных пропускных способностей, поэтому произошло разделение на северный и южный мост. И северный мост - все равно засунули в процессор, т.к. он работал с памятью и с видео. С видео - оказалось достаточно быстрого PCI-Express на южном мосту. А до этого они вставлялись в слот AGP.
Южный мост - контроллеры для подключения различных устройств.
Двигатели головок жесткого диска - раньше шаговый, теперь - звуковая катушка. головки постоянно колеблятся. Диск - всегда биение, никогда не крутится идеально.
BIOS. после включения компьютер тестирует себя. BIOS - микросхема памяти, она существенно отличается от оперативной - постояннная (перепрограммируемая). У интеловских процессоров есть соглашение, по какому адресу происходит переход после включения, и это не нулевой адрес.
Далее демонстрация (время 40:30) QEMU + ОС Xv6 + отладчик gdb.
wget http://pdos.csail.mit.edu/6.828/xv6/xv6-rev5.tar.gz
@todo: Адрес неактуальный, поправить.
tar xf xv6-rev5.tar.gz
Распаковаться должен в подкаталог xv6
. Если бы распаковался прямо в текущий каталог, это была бы tar-бомба - содержимое каталогов смешалось бы и было бы трудно определить, где что. Считается хорошим тоном в архив включать один каталог, внутри которого лежит все остальное.
less multiboot.s
ls Makefile//
ls README
Запустим make
без параметров:
make
Она пробегает по исходным кодам в соответствии с инструкциями, записанными в Makefile
, cобирает из каждого файла с исходниками объектный файл и затем запускает линкер ld
, чтобы финально собрать ядро. также делаются дополнительные трюки, *.sym
-файлы, видимо, для отладчика (символьные таблицы), чтобы отладчик понимал где у него какая подпрограмма внутри ассемблерного файла. Смотрим какой-нибудь *.sym
-файл (не показано, видео 48:00)
Отсылка - как ходить отладчиком по ассемблерному "Hello world!" из первой лекции - собирать не с помощью лоадера, а с помощью gcc
. Побочный эффект - он прилинковывает библиотеку языка C.
Если в README не указаны параметры сборки, их всегда можно посмотреть в Makefile
. Ищем qemu-gdb
. Эта цель состоит из образа файловой системы fs.img
, образ ядра xv6.img
, и инструкций запустить отладчик и QEMU:
make qemu-gdb
После этого в отдельном окне запускается QEMU. Поскольку он запущен с отладчиком, то он сразу останавливается. "Now run gdb".
Отступление про сочетания клавиш терминала.
stty -a
Настроить телетайп - у первых компьютеров не было экрана, а был принтер, который печатал команды и их вывод. Ctrl-Z
- susp, что значит suspend - остановить исполнение, процесс остановлен. Ctrl-C
- это было intr.
В прошлый раз, говорили о том, что у процесса есть состояния:
man ps
поиск STATE
- перечисляются, какие состояния бывают у процесса. T
- состояние stopped
, как раз то самое, которое бывает после нажатия Ctrl-Z
. Бывает еще одно нехорошее состояние - D
- непрерываемый сон - процесс из этого состояния нельзя остановить, пока он сам из этого состояния не выйдет (в man
написано что обычно это IO).
Но руками сигнал stop посылают редко, вместо этого можно исполнить команды fg
- foreground или bg
- background. bg
- процесс продолжит исполнение, но будет исполняться в фоновом режиме - терминал не будет захвачен процессом, но если он захочет что-то прочитать, его сразу остановят в состояние T
, а fg
- процесс снова завладеет терминалом и вы не сможете печатать команды.
ps u
bg
имеет аргумент - это номер задачи. Команда jobs
показывает, какие задачи из этой оболочки были запущены.
bg %1
эта команда переводит задачу 1 в фоновый режим. Если bg
не передавать аргументов, то она примениться к задаче, помеченной +
, а этим плюсиком помечена последняя задача, с которой работал пользователь. Теперь, освободив терминал, можно запустить gdb
:
gdb
Дадим команду cont
- продолжить исполнение. Однако окно с xv6 так и осталось неактивным. Видимо, этот процесс пытается что-то прочитать, и его ОС опять останавливает. Значит надо gdb запускать в отдельном терминале. (процесс почему-то оказался в состоянии sleep)
kill -9 7064
Убьем упорный QEMU с xv6. -9
- это посылка сигналу процессу. Начнем заново:
make qemu-gdb
Открываем новый терминал и в нем:
gdb kernel
Итак, мы видим, что адрес не нулевой (BIOS-а). Он такой (на экране): 0xffff0 - это адрес, по которому сейчас находится указатель инструкций процессора. Это адрес на вершине первого мегабайта памяти. При включении процессора, он находится в 16-разрядном режиме (т.н. реальном режиме), и в этом режиме, он не может адресовать больше 1 Мб памяти. BIOS после включения компьютера и во время тестирования устройств тоже находится в реальном режиме. До конца первого мегабайта, от адреса 0xffff0 остается 16 байт. В эти 16 байт почти нельзя поместить никакой инструкции, Поэтому сюда положили инструкцию longjump, с указанием адреса, куда надо сделать переход, чтобы продолжить POST (Power On Self Test - начальное тестирование после включения компьютера). Это адрес, который указывает на размещение BIOS в памяти - 0xf000. там два числа (видео 59:40), потому что это не jump, а longjump - а команде longjump в реальном режиме надо получить не 16, а 20 разрядов - изначально процессоры Интел 8086 были с 20-разрядной шиной, поэтому они могут адресовать 1 мб памяти и даже чуть больше. 16 бит позволяют адресовать 65 кб памяти. (Видео 1:00:07) Берется один адрес:
0xf000
и берется второй адрес
0x005b
и складываем со смещением 4 бита (16 бит + 4 бита смещения = 20 бит адреса):
f005b
далее в отладчике:
info registers - показывает состояние регистров процессора
ax, bx - basis, , cx - counter, dx - data, sp - stack pointer, bp - базовый адрес стека
si, di - source (destination) index
в 386 процессоре специальное назначение регистров убрали
ip - instruction pointer - на какую ячейку памяти сейчас указывает процессор
eflags - результаты последних операций (переполнение) и т.п.
cs, ss, ds - сегменты: кода (cs), (ss) - стека, (ds) - данные, (es) - extended, расширенные данные, fs,gs - дополнительные регистры для сегментов данных.
Сегмент использовался как верхняя строка, а какой-либо регистр - как вторая строка (см. выше пример про сложение). Сегмент-смещение.
Это в реальном режиме. А в защищенном - это селектор, указывает на строчку в специальной таблице, которая внутри процессора.
Отладчик:
help print
print $eip
help info registers
info registers all
регистров гораздо больше.
теперь можно дизассемблировать команду, находящуюся по адресу в регистре $eip
help x
x/i $eip
распечатает инструкцию.
регистры имеют предопределенное значение при включении
x/8i $eip - дизассемблирует 8 инструкций после $eip
si - выполнить в отладчике следующую инструкцию.
В видео она будет mov %cr0,%eax
в регистр служебного назначения %cr0, отвечаюший за режим процессора, записывается значение регистра $eax.
cont - продолжит исполняться
Starting SeaBIOS
это биос, написанный в рамках проекта QUEMU.
затем - "начинаю грузится с жесткого диска"
Биос принимает это решение, прочитав настройки из CMOS (64 байта там хранится)
EEPROM не было, был CMOS.
отдельная микросхема, энергозависима, батарейка.
Эта микросхема сидит на шине, а не проецирует свою память на память.
шин несколько - есть шина памяти, с помощью которой и проецируется память устройств.
И другая шина - ввода-вывода ISA, не расходует адресного пространства.
Есть команды процессора:
in port (inp) out port (outp)
80, 81 - порты CMOS
команды в консоль:
sudo lshw | less
stty -a
Ctrl-S - STOP. Команда для терминала, останавливает вывод.
мы найдем isa-мост встроенный в процессор.
POST
- что в памяти? Память - это конденсатор, его периодически надо прочитывать и перезаписать, что прочитали, т.к. конденсатор теряет заряд. Если память положить в жидкий азот, она будет долго хранить свое содержимое.
Firewire - шина - может до загрузки ОС прочитать содержимое памяти. Thunderbolt - тоже так может
Современные BIOS
UEFI
Они хранят данные в nvram (флешка). там хранятся переменные. В роутерах она повсеместно. И одна из переменных может указывать на загрузчик - как продолжать загрузку.
В МакОС команда, которая прописывает загрузчик в nvram, называется bless (благословить).
Последний слайд - показывает адресное пространство 32-битного процессора.
Биос лежит на потолке, и занимает верхние 64 килобайта памяти первого мегабайта.
Загрузчик, которому передается управление bios'ом, хранится в нулевом секторе диска. и занимает не более чем 446 байтов в этом секторе, и лежит он в начале сектора. В конце сектора - лежит таблица разделов (главная загрузочная запись, MBR) - бьет диск на логические части. на строчку - 16 байтов. диск может быть не более 2 тб. обойти можно используя gpt. mbr легко стереть. gpt - копия разделов в конце диска.
страничная адресация, стек - позже.