diff options
author | Sergey Nazaryev <sergey@nazaryev.ru> | 2016-01-28 01:25:00 +0300 |
---|---|---|
committer | Sergey Nazaryev <sergey@nazaryev.ru> | 2016-01-28 01:25:00 +0300 |
commit | 4fb4062b556aa0c398208539a1cae0d4e5ec4423 (patch) | |
tree | 3224b665db8f70873c030daa2f4c497a3f4c52c3 | |
download | csbook-master.zip csbook-master.tar.gz csbook-master.tar.bz2 |
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | README.md | 41 | ||||
-rw-r--r-- | programming.tex | 55 | ||||
-rw-r--r-- | size.tex | 2 | ||||
-rw-r--r-- | sum.tex | 12 | ||||
-rw-r--r-- | windows.tex | 1 |
6 files changed, 118 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e042877 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +all: csbook.pdf + +csbook.pdf: programming.tex sum.tex windows.tex size.tex + pdflatex $< --jobname=$@ + +clean: + rm -f *.aux *.log *.out *.pdf *.toc diff --git a/README.md b/README.md new file mode 100644 index 0000000..de4a416 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +Общие тезисы для понимания работы вычислительной техники +======================================================== + +Мне давно хотелось написать некое пособие, в котором вкратце рассказывалась +базовая информация об компьютерах в частности и об вычислительной техники в +целом. Таким образом я бы мог ссылаться не на огромные и иногда избыточные тома +Танненбаума или даже Введения в микроЭВМ, а на небольшую методичку, информацию +из которой можно было бы усвоить за один вечер. + +Примерный план +-------------- + +1. История вычислительной техники. Цель создания, исторические катализаторы. + +2. Многоуровневая ЭВМ, уровни абстракции: уровень машинных команд, уровень + микрокоманд, уровень ассемблера, уровень прикладных задач. Интерпретация и + компиляция. Почему стоит думать об уровнях ниже, даже если инструменты + позволяют нам это не делать? Положение дел на рынке труда, связанное с + большим количеством работы Java- и С#-программистов. Разделение + программирования на разные области. Системное программирование, олимпиадное + программирование, программирование бизнес-логики... + +3. Общая архитектура ЭВМ: АЛУ, УУ, специализированные регистры (аккумулятор, + счётчик команд, регистры команд, данных и адреса), память, виды адресации. + +4. БЭВМ без программирования микрокоманд и работы с ВУ. + +5. Виды памяти (ПЗУ, ОЗУ, HDD, флеш-память), хранение данных в памяти, наследие + телеграфа, азбуки Морзе, ASCII. + +6. Взаимодействие ЭВМ и ВУ, взаимодействие двух ЭВМ. OSI. Прерывания. + Параллельная и последовательная передачи данных. + +7. Intel-ассемблер, реальный режим, защищённый режим, x64, объектные файлы, + препроцессинг, линковка (статическая, динамическая), заголовки (PE2, ELF), + 8086, BIOS, таблица векторов прерываний, работа с внешними устройствами, + цель создания OS, DOS. + +8. Зачем нужен Си? Написание простейших программ, указательная арифметика, + UNIX-way, работа с памятью, препроцессинг, компиляция, линковка (статическая, + динамическая), UNIX. diff --git a/programming.tex b/programming.tex new file mode 100644 index 0000000..5eb7564 --- /dev/null +++ b/programming.tex @@ -0,0 +1,55 @@ +\documentclass[11pt,oneside,a4paper]{book} +\usepackage[utf8]{inputenc} +\usepackage[english,russian]{babel} +\usepackage{hyperref} +\usepackage{framed} +\usepackage{indentfirst} +\begin{document} +\pagenumbering{arabic} +\title{Методическое пособие. Общие тезисы для понимания работы вычислительной техники.} +\author{Назарьев C.} +\date{\today} +\maketitle +\tableofcontents +\frontmatter +\pagenumbering{arabic} +\chapter{Введение} +Дорогой друг, если ты читаешь это, то ты внезапно решил почитать вместо адекватных учебников и пособий по программированию краткое руководство-шпаргалку о том, как же этот ваш компьютер устроен и как же можно программировать под него. +\mainmatter +\pagenumbering{arabic} +\chapter{Вычислительная техника} +Главное, что должна делать любая вычислительная техника -- внезапно, вычислять. Значит, должно быть некое устройство, которое именно что вычисляет. Фактически, первым вычисляющим устройством был <<абак>> -- прародитель русских счётов из 5 века до н.э. Абак имеет набор операций, которые с ним можно выполнять (ввод данных, сумма, вычитание, умножение, деление). Если абстрагироваться от реализации (камней и палок), то такое описание полностью подходит и для описания нынешних процессоров: процессор умеет выполнять некоторые операции и предоставляет возможность ему <<приказывать>>. Уясним ещё раз: есть некое устройство, процессор, который умеет выполнять некий ряд операций, если его попросить. + +Для того, чтобы процессор понял, что от него хотят, ему нужно передать команду, или инструкцию. Команды в случае двоичных процессоров (то есть процессоров, работающих только с двоичными числами) -- это наборы единиц и нулей (спасибо, К.О.), или просто двоичное число, которое <<интерпретируeтся>>\footnote{воспринимаeтся} процессором как приказ выполнить определённую операцию. Фактически, мы можем подсунуть процессору любое число, чтобы он попытался интерпретировать его как команду\footnote{но в случае неизвестной команды может произойти всё, что угодно; часто в таких случаях говорят, что у выч. техники неопределённое поведение}. Из предположений, что команды и данные -- это просто числа, а процессору без разницы, что ему подсовывают, то для хранения команд и данных мы можем использовать одну и ту же память. Память в данном случае называют \textit{однородной}, а архитектуру такой вычислительной машины называют \textit{архитектурой фон Неймана} в противопоставлении с \textit{Гарвардской архитектурой}, в которой существует два вида памяти для инструкций и данных соответственно. + + Для того, чтобы хранить команду в процессоре, которые он выполняет, существует некоторое устройство -- \textit{регистр}. \textit{$N$-разрядный регистр} позволяет хранить $N$ двоичных разрядов. Процессор может считывать эти разряды из регистра и/или записывать в них новые значения. + +Теперь рассмотрим такой процессор, у которого есть два регистра -- регистр для хранения команд (регистр команд) и регистр для хранения результата какой-либо операции (аккумулятор). Из-за того, что процессор имеет централизованное место для хранения результата операций, такой процессор обычно называют <<процессором с аккумулятором>>. Наш процессор умеет лишь складывать две шестандцатиричные цифры, указанные внутри команды. Допустим, увидев команду $A12_{16}$, процессор разберёт её по частям (A -- операция сложения двух шестнадцатиричных цифр, а 1 и 2 -- операнды) и выполнит операцию сложения, положив результат в аккумулятор. +Как именно? Всё зависит от внутренностей процессора, но обычно для этого используются логические операции, а реализуются они логическими схемами. + +\begin{framed} +\hyperref[sum]{Рассказ о том, как работает операция сложения} +\end{framed} + +Каким же образом команды попадают в процессор, откуда они берутся? В данном случае мы должны иметь источник наших команд и устройство, которое подсовывает процессору в его регистр команд команду и заставляет его эту команду выполнять. Источником могут служить, например, перфокарты -- пластинки с дырками или без дырок в определённых местах, обозначающие двоичные разряды, или же набор ламп: включенная лампа -- единица, а выключенная -- ноль; или же любое другое устройство, имеющее два состояния, которые можно интерпретировать как двоичную цифру (или же bit, BInary digiT). Набор ламп, перфокарты, набор конденсаторов или любые другие устройства, в совокупности позволяющие хранить единицы и нули, называются памятью. Для удобства, память разбивают на ячейки по $N$ бит, и опять же, для удобства, размер одной ячейки обычно равен размеру аккумулятора. Процессор, умеющий работать с $N$-битными числами, внезапно, называется $N$-битным процессором. + +\begin{framed} +\hyperref[size]{А почему размер аккумулятора именно такой? Почему игровые приставки называются 8-битными или 16-битными?} +\end{framed} + +Каждая ячейка имеет свой адрес, по которому она доступна в памяти. Легко посчитать нужное количество бит, которое необходимо, чтобы хранить адрес ячейки: нужно найти ближайшее число-степень двойки, тогда степенью будет то число бит, сколько нужно для хранения адреса в памяти. + +\begin{framed} +\hyperref[windows]{Windows и проблемы с оперативной памятью 4 Гб+} +\end{framed} + +Кроме самого источника, в котором у нас будут храниться данные, нам необходимо так называемое <<устройство управления>>, которое вытаскивает данные из памяти и кладёт их в регистр команд. +В свою очередь размер аккумулятора зависит от того, с какими числами может оперировать процессор. Так как для процессора и наши исходные данные в памяти, и команды -- это всего лишь единицы и нули, то есть двоичные числа, то получается, что процессор обязан уметь работать с $N$-разрядными числами, где $N$ -- это максимум среди максимально возможного размера данных и максимально возможного размера команды. + +\appendix +\input{size} +\input{windows} +\input{sum} +\backmatter +\chapter{Послесловие} +\end{document} diff --git a/size.tex b/size.tex new file mode 100644 index 0000000..02d898a --- /dev/null +++ b/size.tex @@ -0,0 +1,2 @@ +\chapter{Чем обуславливается выбор размеров регистров?}\label{size} +В свою очередь размер аккумулятора зависит от того, с какими числами может оперировать процессор. Так как для процессора и наши исходные данные в памяти, и команды -- это всего лишь единицы и нули, то есть двоичные числа, то получается, что процессор обязан уметь работать с $N$-разрядными числами, где $N$ -- это максимум среди максимально возможного размера данных и максимально возможного размера команды. @@ -0,0 +1,12 @@ +\chapter{Складывание чисел в простейшей ЭВМ}\label{sum} +Операция суммы реализуется с помощью сумматора -- устройства, складывающего два N-разрядных двоичных числа. +Допустим, в случае нашей команды AXY X и Y -- это шестнадцатиричные цифры, которые при переводе в двоичную систему счисления будут занимать ровно 4 двоичных разряда (0000 (0) до 1111 (F)), поэтому нам для реализации сложения потребуется 4-разрядный сумматор. + +Сумматор в свою очередь состоит из N полусумматоров, где N -- всё та же разрядность сумматора. +Полусумматор -- это уже схема, складывающая две двоичные цифры и выдающая результат этой суммы. +Логично предположить, что сумма нуля и нуля даст нуль; 0 и 1 или 1 и 0 даст 1, а вот в случае 1 и 1 ответ не совсем предсказуем. Полусумматоры в частности и сумматор в целом реализует фактически складывание чисел столбиком. При складывании двух десятичных цифр столбиком если у вас получалась сумма больше 9, то вы записывали остаток от деления на 10 (или, если говорить красивше, результат <<деления по модулю 10>> (если не указано число, то обычно подразумевают 10)) и переносили <<десятку>> в следующий разряд. Как ни странно, но полусумматоры не далеко ушли от нашего способа счёта. +На вход полусумматора подаются 3 бита: первое слагаемое (на так называемый левый вход полусумматора), второе слагаемое (правый вход) и перенос, если он есть, а на выходе -- результат сложения и перенос. + +\textit{Разберём на примере двухразрядного сумматора, складывая два числа: 01 и 01.} +\\ +Полусумматоры соединены следующим образом: на левый вход первого полусумматора передаётся младший разряд первого числа (1), на правый -- младший разряд второго числа (1), на перенос ничего не подключается (равносильно нулю). Результат сложения первого полусумматора (1+1+0=0, третье слагаемое -- входной перенос) передаётся в младший (нулевой) разряд регистра, в котором у нас будет храниться результат сложения наших чисел; <<выходной>> перенос (единица от сложения 1 и 1) от первого полусумматора передаётся в <<входной>> перенос второго полусумматора, вместе с старшими разрядами наших слагаемых. На выходе получим результат (0+0+1=1) и перенос (0), которые подключены к первому и второму разряду регистра соответственно. Второй разряд этого регистра называется <<флагом переноса>>, и в случае, когда процессор, оперируя N-разрядными числами получает N+1-разрядное число, во флаге переноса оказывается единица. Этот флаг показывает, что процессор получил неверный ответ, а само явление называется переполнением. diff --git a/windows.tex b/windows.tex new file mode 100644 index 0000000..2d751a5 --- /dev/null +++ b/windows.tex @@ -0,0 +1 @@ +\chapter{Windows и проблемы с ОЗУ}\label{windows} |