aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Nazaryev <sergey@nazaryev.ru>2016-01-28 01:25:00 +0300
committerSergey Nazaryev <sergey@nazaryev.ru>2016-01-28 01:25:00 +0300
commit4fb4062b556aa0c398208539a1cae0d4e5ec4423 (patch)
tree3224b665db8f70873c030daa2f4c497a3f4c52c3
downloadcsbook-master.zip
csbook-master.tar.gz
csbook-master.tar.bz2
Initial commit.HEADmaster
-rw-r--r--Makefile7
-rw-r--r--README.md41
-rw-r--r--programming.tex55
-rw-r--r--size.tex2
-rw-r--r--sum.tex12
-rw-r--r--windows.tex1
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$ -- это максимум среди максимально возможного размера данных и максимально возможного размера команды.
diff --git a/sum.tex b/sum.tex
new file mode 100644
index 0000000..dd15c5e
--- /dev/null
+++ b/sum.tex
@@ -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}