Архитектура ЭВМ и язык ассемблера
Представление об архитектуре ЭВМ
?ЭВМ вообще?
- Калькулятор ? хранение команд ? хранение данных ? атрибуция данных ? подготовка и вывод результатов ? выполнение команд в зависимости от данных ? ЭВМ
- Адресация и переходы как частные случаи
Хранение данных и команд в памяти. ММ3
ММ3: условия и циклы
ММ2, ММ1, рассказ о ММ0
УМ-Р
Регистровая машина с модификацией адреса. Проход массива циклом.
Ассемблер. Язык ассемблера
Проблемы программирования в кодах: синтаксическое однообразие и отсутствие мнемоники
Ассемблер: текст?машинный язык; мнемоника команд; представление данных; метки. Проблема ?второго прохода?.
MIPS, базовые сведения об архитектуре и работе; простейшая программа
- Базовые сведения об архитектуре и работе.
- MARS
Получение с сайта.Download Mars
- Установка и запуск.
- Настройка для первой программы.
- В меню settings следует к настройкам по умолчанию добавить:
- Assemble and execute programs using delayed branching = ON
- Permit programs to use extended (pseudo) instructions and formats = OFF
- В меню settings следует к настройкам по умолчанию добавить:
- Редактирование, ассемблирование, трассировка первой программы.
- Простейшая программа:
MIPS ? архитектура и система команд
MIPS (англ. Microprocessor without Interlocked Pipeline Stages) ? микропроцессор, разработанный компанией MIPS Computer Systems в соответствии с концепцией проектирования процессоров RISC.
- Схема
- Цикл работы процессора
- Загрузка инструкции (IF = Instruction Fetch)
- Декодирование инструкции, выделение команды и операндов, чтение регистров (ID = Instruction Decode)
- Фактическое выполнение инструкции (Ex = Execute)
- Сохранение регистра в память, Загрузка регистра из памяти (MEM = Memory access)
- Запись результата регистр (WB = Writeback)
- Инструкция уровня языка ассемблера может быть разбита на отдельные микрокоманды. Программа интерпретирующая машинные инструкции называется микропрограммой. Микропрограмма позволяет на одном и том же наборе аппаратуры реализовать разные архитектуры.
- MIPS
- 4GB оперативной памяти.
- Инструкции одинаковой длины 32 бита.
- 32 регистра общего назначения размером 32 бита.
- Регистр $0 всегда возвращает 0.
- Регистры PC, Hi, Lo.
- Типы и форматы инструкций.
- Инструкции делятся на три типа: R, I и J. Каждая инструкция начинается с 6-битного кода. В дополнение к коду, инструкции R-типа определяют три регистра, область размера сдвига регистра, и область функции; инструкции I-типа определяют два регистра инепосредственное значение; инструкции J-типа состоят из кода операции и 26-битного адреса перехода.
Тип
?31? формат (в битах) ?0?
R
код (6)
rs (5)
rt (5)
rd (5)
сдвиг (5)
функция (6)
I
код (6)
rs (5)
rt (5)
непосредственное значение (16)
J
код (6)
адрес (26)
Инструкции типов I и R.
- Схема исполнения:
- Арифметические:
- add, addu, sub, subu, mult, multu, div, divu
- addi, addiu
- Логические:
- and, or, xor, nor, slt
- andi, ori, xori, slti
- Сдвига:
- sll, srl, sra
- Передачи данных:
- mfhi, mflo
- Пример программы:
1 ## Program to assemble the instruction ori $8,$9,0x004A
2 ##
3
4 or $25,$0,$0 # clear $25
5 ori $11,$0,0xD # opcode
6 ori $12,$0,0x9 # operand $s
7 ori $13,$0,0x8 # dest. $d
8 ori $14,$0,0x004A # immediate operand
9
10 sll $11,$11,26 # shift opcode into position
11 or $25,$25,$11 # or it into the instruction
12
13 sll $12,$12,21 # shift operand $s into position
14 or $25,$25,$12 # or it into the instruction
15
16 sll $13,$13,16 # shift dest $d into position
17 or $25,$25,$13 # or it into the instruction
18
19 or $25,$25,$14 # or const into the instruction
20
21 ori $8,$9,0x004A # The actual assembler
22 # should create the same machine
23 # instruction as we now have in $25
24
25 ## end of file
1 ## handMadeNeg.asm
2 ##
3 ## Program to demonstrate two's complement negative
4 ##
5 ## The program adds +146 to -82, leaving the result in $10
6
7 ori $7, $0, 146 # put +146 into $7
8 ori $8, $0, 82 # put 82 into $8
9 nor $8, $8, $0 # reflect
10 ori $9, $0, 1 #
11 addu $8, $8, $9 # add 1: $8 = -82
12 addu $10, $7, $8 # (+146) + (-82)
13
14 ## End of file
1 ## Mult.asm
2 ##
3 ## Program to calculate 5 * x - 74
4 ##
5 ## Register Use:
6 ## $8 x
7 ## $9 result
8 ##
9 ## $10 5
10 ## $9,$10 result
11
12 ori $8, $0, 12 # put x into $8
13 sll $9, $8, 2 # $9 = 4x
14 addu $9, $9, $8 # $9 = 5x
15 addiu $9, $9,-74 # $9 = 5x - 74
16
17 ori $10, $0, 5 # $10 = 5
18 multu $8, $10
19 mfhi $9
20 mflo $10
21 addiu $10, $10, -74
22 nop
23 ## End of file
Адресация
индексация, SPIM: работа с байтами. Секции .text и .data
- Адресация.
- Адресация ? обращение к элементу данных по его адресу. Существует несколько способ интерпретации битов инструкции для указания местоположения данных:
- Неявная адресация
- Непосредственная
- Прямая
- Регистровая
- Косвенная
- Базовая
- Относительная
- Индексная
- ...
- Секции(сегменты)
- В программе принято отделять данные от кода. Секция есть непрерывный диапазон адресов, все данные в которых считаются с некоторой точки зрения однородными.
- Некоторые процессоры аппаратно поддерживают подобное разделение.
- Для определения секций в языке ассемблера MARS служат директивы: ".text" и ".data".
- Ассемблер MARS не позволяет определять данные в секции .text.
- директивы определения данных: ".word", ".half", ".byte", ".asciiz", ".ascii"
- метки
- точка входа, директива ".globl"
- Команды загрузки и сохранения:
- lw, lh, lhu, lb, lbu
- sw, sh, sb
- lbu
1 ## poly.asm -- complete program 2 ## 3 ## evaluate 5x^2 -12x + 97 4 ## 5 ## Register Use: 6 ## 7 ## $10 base register, address of x 8 ## $11 x 9 ## $12 value of the polynomial 10 ## $13 temporary 11 12 .text 13 .globl main 14 15 main: 16 lui $10,0x1001 # Init base register 17 lw $11,0($10) # Load x 18 19 ori $12,$0,97 # Initialize the accumulator 20 # during the "load delay slot" 21 22 ori $13,$0,12 # evaluate second term 23 mult $11,$13 # 12x 24 mflo $13 # assume 32 bit result 25 subu $12,$12,$13 # accumulator = -12x +97 26 27 # evaluate third term 28 mult $11,$11 # x^2 29 mflo $11 # assume 32 bit result 30 ori $13,$0,5 # 5 31 mult $11,$13 # 5x^2 32 mflo $13 # 33 addu $12,$12,$13 # accumulator = 5x^2-12x+97 34 35 sw $12,4($10) # Store result in poly 36 37 .data 38 x: .word 17 # Edit this line to change the value of x 39 poly: .word 0 # Result is placed here. 40 41 ## End of file
- Команды перехода:
- j, jr
- beq, bne, bltz, bgez
1 ## $8 --- A, two's comp. integer 2 ## $9 --- sign bit of A 3 ## $10 --- base register for .data section 4 5 .text 6 .globl main 7 8 main: 9 # Get A 10 lui $10,0x1001 # Init base register 11 lw $8,0($10) # Load A 12 sll $0,$0,0 13 14 # Is A Negative? 15 srl $9,$8,31 # Shift sign bit to position 0 16 beq $0,$9,done # sign bit == zero, done 17 sll $0,$0,0 18 19 # Store -A 20 subu $8,$0,$8 # negate A 21 sw $8,0($10) # save it 22 23 done: sll $0,$0,0 # target of the branch 24 25 .data 26 A: .word -14 27 28 ## End of File
- Работа с байтами.
1 ## endian.asm 2 ## 3 ## copy $9 to memory in big-endian order 4 ## 5 ## Register Use: 6 ## $8 --- first byte of the tape buffer 7 ## $9 --- 4-byte integer 8 9 .text 10 .globl main 11 12 main: 13 lui $9,0x1234 # put data in $9 14 ori $9, $9, 0x5678 # 15 lui $8,0x1001 # $8 is base register 16 sb $9,3($8) # least significant byte 17 srl $9,$9,8 # move next byte to low order 18 sb $9,2($8) # bits 8-15 19 srl $9,$9,8 # move next byte to low order 20 sb $9,1($8) # bits 16-23 21 srl $9,$9,8 # move next byte to low order 22 sb $9,0($8) # most significant byte 23 24 .data 25 tape: # base register points here 26 .space 1024 # tape buffer (1K bytes) 27
- Массивы.
1 ## addIntArray.asm 2 ## 3 ## Sum all integers, the positive integers, 4 ## and the negative integers in an array. 5 6 ## Registers: 7 ## $8 -- count 8 ## $9 -- pointer to the array entry 9 ## $10 -- current array entry 10 ## $11 -- sum of all integers 11 ## $12 -- sum of negative integers 12 ## $13 -- sum of positive integers 13 ## $14 -- pos. or neg. flag 14 ## $15 -- length of the array 15 16 .text 17 .globl main 18 # Initialize 19 main: ori $8,$0,0 # count = 0 20 ori $11,$0,0 # sum = 0 21 ori $12,$0,0 # neg = 0 22 ori $13,$0,0 # pos = 0 23 lui $9,0x1001 # point at SIZE 24 25 lw $15,0($9) # get SIZE 26 addiu $9,$9,4 # point to first entry 27 28 # while count < SIZE do 29 loop: beq $8,$15,done 30 sll $0,$0,0 # branch delay 31 32 # get entry, add to sum 33 lw $10,0($9) # get entry 34 sll $0,$0,0 # load delay 35 addu $11,$11,$10 # add to sum 36 37 # test neg. or pos. 38 slti $14,$10,0x0 # set $14 if entry is neg 39 bne $14,$0,neg # branch if negative 40 sll $0,$0,0 # branch delay 41 addu $13,$13,$10 # positive: add to PLUS 42 j ifend 43 sll $0,$0,0 # branch delay 44 45 neg: addu $12,$12,$10 # negative: add to NEG 46 47 ifend: addiu $8,$8,1 # count++ 48 addiu $9,$9,4 # point at next entry 49 j loop 50 sll $0,$0,0 # branch delay 51 52 # finish 53 done: sll $0,$0,0 # target for branch 54 55 .data 56 size: .word 4 57 array: .word 1, 2, -2, -1
- Аресация MIPS:
Взаимодействие процессор-память
В современном компьютере можно выделить несколько функционально различных блоков: процессор, основная память, внешние запоминающие устройства, ...(более того, эти блоки обладают внутренней сложной структурой).
- Шина ? подсистема, служащая для передачи данных между функциональными блоками компьютера.
- Протокол шины.
- Шины адреса и данных. Гарвард/Принстон.
- Организация микросхем основной памяти. Цикл чтения/записи. Длительность цикла чтения/записи в циклах шины/процессора.
- Идея кэширования.
- Виды памяти:
- SRAM ? быстрая и дорогая:
- Регистры
- Кэш
- DRAM ? медленная и не дорогая:
- Основная память
- Прочее SSD, HDD,... ? энергонезависимая:
- Внешние запоминающие устройства.
- SRAM ? быстрая и дорогая:
- Пирамида задержек.
- Методы повышения производительности подсистемы памяти
- Буферизация.
- перекрытие циклов(конвейер).
- расщеплении(параллелизм)
- Постоянные программируемые запоминающие устройства с произвольным доступом(ROM). Использование ROM для первоначальной инициализации компьютера.
Конвенции, псевдоинструкции и макросы
Структура памяти, псевдоинструкции, макросы, понятие о конвенциях ().
- Конвенции.
- Расширенный ассемблер.
- Ассемблер MIPS предоставляет псевдокоманды, которые на самом деле не являются частью набора команд, но часто используются программистами и компиляторами. При преобразовании в машинный код псевдокоманды транслируются в одну или несколько команд MIPS. Некоторым псевдокомандам требуется временный регистр для промежуточных вычислений. Ассемблер использует для этих целей временный регистр $at.
- именование и использование регистров
Название |
Номер |
Назначение |
$zero |
0 |
Константный нуль |
$at |
1 |
Временный регистр для нужд ассемблера |
$v0?$v1 |
2-3 |
Возвращаемые функциями значения |
$a0?$a3 |
4-7 |
Аргументы функций |
$t0?$t7 |
8-15 |
Временные переменные |
$s0?$s7 |
16-23 |
Сохраняемые переменные |
$t8?$t9 |
24-25 |
Временные переменные |
$k0?$k1 |
26-27 |
Временные переменные операционной системы (ОС) |
$gp |
28 |
Глобальный указатель (англ.: global pointer) |
$sp |
29 |
Указатель стека (англ.: stack pointer) |
$fp |
30 |
Указатель кадра стека (англ.: frame pointer) |
$ra |
31 |
Регистр адреса возврата из функции |
- псевдоинструкции:
- move, li, la, lw, sw, nop
- not, abs, addu, subu, negu, mul, div, divu, remu, rol, ror
- seq, sge, sgeu, sgt, sgtu, sle, sleu, slt, slti, sltu, sltiu, sne
- b, beq, beqz, bge, bgeu, bgez, bgt,bgtu, bgtz, ble, bleu, blez, blt, bltu, bltz, bnez, bne
- syscall
- примеры:
1 ## pseudoPoly.asm
2 ## evaluate the polynomial ax2 + bx + c
3 ##
4 .text
5 .globl main
6
7 main:
8 lw $t3,x # get x
9 lw $t0,a # get a
10 lw $t1,bb # get bb
11 lw $t2,c # get c
12
13 mult $t3,$t3 # x2
14 mflo $t4 # $t4 = x2
15 nop
16 nop
17 mult $t4,$t0 # low = ax2
18 mflo $t4 # $t4 = ax2
19 nop
20 nop
21
22 mult $t1,$t3 # low = bx
23 mflo $t5 # $t5 = bx
24 addu $t5,$t4,$t5 # $t5 = ax2 + bx
25
26 addu $t5,$t5,$t2 # $t5 = ax2 + bx + c
27 sw $t5,value # value = polynomial
28
29 .data
30 x: .word 4
31 value: .word 1
32 a: .word 20
33 bb: .word -2 # the SPIM assembler does not allow the label "b"
34 c: .word 5
35
- Макроподстановки
Стек и подпрограммы
- Стек:
- Стек
- Стек MIPS
- 0x7FFF FFFF
- растет вниз
- Регистр указателя стека
1 # Evaluate the expression ab - 12a + 18b - 7 2 # 3 # Settings: Load delays OFF; Branch delays OFF, 4 # Trap file ON; Pseudoinstructions ON 5 6 .globl main 7 8 main: 9 lw $t0,a # get a 10 lw $t1,bb # get b 11 mul $t0,$t0,$t1 # a*b 12 subu $sp,$sp,4 # push a*b onto stack 13 sw $t0,($sp) 14 15 lw $t0,a # get a 16 li $t1,-12 # 17 mul $t0,$t0,$t1 # -12a 18 subu $sp,$sp,4 # push -12a onto stack 19 sw $t0,($sp) 20 21 lw $t0,bb # get b 22 li $t1,18 # 23 mul $t0,$t0,$t1 # 18b 24 subu $sp,$sp,4 # push 18b onto stack 25 sw $t0,($sp) 26 27 li $t1,-7 # init sum to -7 28 lw $t0,($sp) # pop 18b 29 addu $sp,$sp,4 30 addu $t1,$t1,$t0 # 18b -7 31 32 lw $t0,($sp) # pop -12a 33 addu $sp,$sp,4 34 addu $t1,$t1,$t0 # -12a + 18b -7 35 36 lw $t0,($sp) # pop ab 37 addu $sp,$sp,4 38 addu $t1,$t1,$t0 # ab - 12a + 18b -7 39 40 done: li $v0,1 # print sum 41 move $a0,$t1 42 syscall 43 li $v0,10 # exit 44 syscall 45 46 .data 47 a: .word 0 48 bb: .word 10
- Аппаратный стек
- Подпрограммы:
- повторное использование
- модульность
- проблема возврата
- аппаратная поддержка:
- инструкции - "jal" и "jr"("jalr")
- особая роль регистра $31($ra)
- Конвенции о вызове:
- вызывающий и и вызываемый
- правила сохранения и использования регистров
- Простая конечная подпрограмма:
- Простая конвенция о вызове:
- Подпрограмма вызывается с помощью инструкции "jal"(которая сохранит обратный адрес в регистре $ra).
- Подпрограмма не будет вызывать другую подпрограмму(конечная).
- Подпрограмма возвращает управление вызывающей программе с помощью инструкции "jr $rа".
- Регистры используются следующим образом:
- $t0 - $t9 - подпрограмма может изменить эти регистры.
- $s0 - $s7 - подпрограмма не должны изменять эти регистры.
- $а0 - $a3 - эти регистры содержат аргументы для подпрограммы. Подпрограмма может изменить их.
- $v0 - $v1 - эти регистры содержат значения, возвращаемые из подпрограммы.
- Основная программа возвращает управление с помощью системного вызова(syscall) 10.
1 # addthree.asm --- read in three integers and print their sum 2 # 3 # This program uses simple linkage. 4 # 5 # Settings: Load delays ON; Branch delays ON 6 # Trap file ON; Pseudoinstructions ON 7 # 8 9 .text 10 .globl main 11 main: 12 jal pread # read first integer 13 nop # 14 move $s0,$v0 # save it in $s0 15 16 jal pread # read second integer 17 nop # 18 move $s1,$v0 # save it in $s1 19 20 jal pread # read third integer 21 nop # 22 move $s2,$v0 # save it in $s2 23 24 addu $s0,$s0,$s1 # compute the sum 25 addu $a0,$s0,$s2 26 27 li $v0,1 # print the sum 28 syscall 29 30 li $v0,10 # exit 31 syscall 32 33 34 # pread -- prompt for and read an integer 35 # 36 # on entry: 37 # $ra -- return address 38 # 39 # on exit: 40 # $v0 -- the integer 41 42 .text 43 .globl pread 44 pread: 45 la $a0,prompt # print string 46 li $v0,4 # service 4 47 syscall 48 49 li $v0,5 # read int into $v0 50 syscall # service 5 51 52 jr $ra # return 53 nop # 54 55 .data 56 prompt: 57 .asciiz "Enter an integer: "
- Простая конвенция о вызове:
Фреймы, локальные переменные, рекурсия
Ранее рассмотренная конвенция не обеспечивает некоторые возможности языков высокого уровня. Добавим некоторые из этих функций в новой конвенции о вызове процедур на основе стека.
- Сохранение регистров в стеке
- Сохранение адреса возврата в стеке($ra)
- Сохранение и восстановление регистров $s0?$s7 в/из стеке/стека
- Конвенция о вызове процедур на основе стека.
- Это не официальное соглашение. Однако, оно может быть использовано для небольшого проекта на языке ассемблера. Конвенция не очень сложна и делает почти все, что может быть нужно. Если вы хотите использовать процедуры из программы на языке "C", использовать процедуры из библиотек, написанных на других ЯП или вызывать вашу процедуру из программы на ЯВУ, то необходимо использовать официальные правила в полном объеме. (Что в эмуляторе MARS невозможно.)
- Правила:
- Вызов подпрограммы (делает вызывающая процедура):
- Сохранить в стеке регистры "$t0 - $t9", которые должны быть сохранены(будут использованы вызывающей процедурой после вызова подпрограммы). Подпрограмма может изменить эти регистры.
- Загрузить значения аргументов в регистры "$a0 - $a3".
- Вызов подпрограммы с помощью "jal".
- Пролог подпрограммы:
- Сохранить регистр "$ra" в стек.
- Сохранить в стек регистры "$s0 - $s7"(подпрограмма может изменять их).
- Тело подпрограммы:
- Подпрограмма может изменять регистры "$t0 - $t9", или те из регистров "$s0 - $s7", которые были сохранены в прологе.
- Из подпрограммы можно вызывать другую подпрограмму, следуя этим правилам.
- Эпилог подпрограммы (непосредственно перед возвращением):
- Загрузить возвращаемые значения в регистры "$v0 - $v1".
- Извлечь из стека (в обратном порядке) сохраненые в прологе регистры "$s0 - $s7".
- Извлечь из стека в регистр '$ra" адрес возврата.
- Вернуться в вызывающую процедуру, используя "jr $ra".
- Восстановление состояния при выходе из подпрограммы:
- Извлечь из стека (в обратном порядке) сохраненые регистры "$t0 - $t9".
- Вызов подпрограммы (делает вызывающая процедура):
- Пролог и эпилог вызываемой подпрограммы:
- Вызов и возврат.
- Вложенные вызовы подпрограмм и цепь активации.
- О реальных конвенциях(ABI).
- Пример программы:
1 ## Driver -- main program for the application 2 3 .text 4 .globl main 5 6 main: 7 sub $sp,$sp,4 # push the return address 8 sw $ra,($sp) 9 sub $sp,$sp,4 # push $s0 10 sw $s0,($sp) 11 12 la $a0,xprompt # prompt the user 13 li $v0,4 # service 4 14 syscall 15 li $v0,5 # service 5 -- read int 16 syscall # $v0 = integer 17 move $s0,$v0 # save x 18 19 la $a0,yprompt # prompt the user 20 li $v0,4 # service 4 21 syscall 22 li $v0,5 # service 5 -- read int 23 syscall # $v0 = integer 24 25 # prepare arguments 26 move $a0,$s0 # x 27 move $a1,$v0 # y 28 jal maxExp # maximum expression 29 nop # returned in $v0 30 move $s0,$v0 # keep it safe 31 32 la $a0,rprompt # output title 33 li $v0,4 # service 4 34 syscall 35 36 move $a0,$s0 # get maximum 37 li $v0,1 # print it out 38 syscall 39 40 lw $ra,($sp) # pop $s0 41 add $s0,$sp,4 42 lw $ra,($sp) # pop return address 43 add $sp,$sp,4 44 45 li $s0,0 # return to OS 46 li $v0,10 47 syscall 48 49 50 .data 51 xprompt: .asciiz "Enter a value for x --> " 52 yprompt: .asciiz "Enter a value for y --> " 53 rprompt: .asciiz "The maximum expression is: " 54 55 ## maxInt -- compute the maximum of two integer arguments 56 ## 57 ## Input: 58 ## $a0 -- a signed integer 59 ## $a1 -- a signed integer 60 ## 61 ## Returns: 62 ## $v0 -- maximum 63 64 .text 65 .globl maxInt 66 67 maxInt: 68 # body 69 move $v0,$a0 # max = $a0 70 bgt $a0,$a1,endif # if $a1 > $a0 71 nop 72 move $v0,$a1 # max = $a1 73 endif: # endif 74 # epilog 75 jr $ra # return to caller 76 nop 77 78 ## maxExp -- compute the maximum of three expressions 79 ## 80 ## Input: 81 ## $a0 -- a signed integer, x 82 ## $a1 -- a signed integer, y 83 ## 84 ## Returns: 85 ## $v0 -- the maximum of x*x, x*y, or 5*y 86 ## 87 ## Registers: 88 ## $s0 -- x*x 89 ## $s1 -- x*y 90 ## $s2 -- 5*y 91 92 .text 93 .globl maxExp 94 95 maxExp: 96 # prolog 97 sub $sp,$sp,4 # push the return address 98 sw $ra,($sp) 99 sub $sp,$sp,4 # push $s0 100 sw $s0,($sp) 101 sub $sp,$sp,4 # push $s1 102 sw $s1,($sp) 103 sub $sp,$sp,4 # push $s2 104 sw $s2,($sp) 105 106 # body 107 mul $s0,$a0,$a0 # x*x 108 mul $s1,$a0,$a1 # x*y 109 li $t0,5 110 mul $s2,$t0,$a1 # 5*y 111 112 move $a0,$s0 # compute max of x*x 113 move $a1,$s1 # and x*y 114 jal maxInt # current max in $v0 115 nop 116 117 move $a0,$v0 # compute max of 118 move $a1,$s2 # current max, and 5*y 119 jal maxInt # total max will be in $v0 120 nop 121 122 # epilog 123 lw $s2,($sp) # pop $s2 124 add $sp,$sp,4 125 lw $s1,($sp) # pop $s1 126 add $sp,$sp,4 127 lw $s0,($sp) # pop $s0 128 add $sp,$sp,4 129 lw $ra,($sp) # pop return address 130 add $sp,$sp,4 131 jr $ra # return to caller 132 nop
- Локальные переменные.
- Кадр стека.
- Конвенция о вызове процедур с использованием указателя кадра стека.
- Это не официальное соглашение. В большинстве реальных MIPS-ABI использование указателя кадра стека факультативно. В широко распространенной архитектуре "intel32/64" указателя кадра стека активно используется.
- Вызов подпрограммы (делает вызывающая процедура):
- Сохранить в стеке регистры "$t0 - $t9", которые должны быть сохранены(будут использованы вызывающей процедурой после вызова подпрограммы). Подпрограмма может изменить эти регистры.
- Загрузить значения аргументов в регистры "$a0 - $a3".
- Вызов подпрограммы с помощью "jal".
- Пролог подпрограммы:
- Сохранить регистр "$ra" в стек.
- Сохранить регистр "$fp" в стек.
- Сохранить в стек регистры "$s0 - $s7"(подпрограмма может изменять их).
- Инициализировать указатель кадра: $fp = ($sp - размер пространства для локальных переменных).
NB Помните, что вычитание из $sp увеличивает стек, что стек растет вниз, что размер переменной всегда четыре байта.
- Инициализировать указателя стека: $sp = $fp.
- Тело подпрограммы:
- Подпрограмма может изменять регистры "$t0 - $t9", или те из регистров "$s0 - $s7", которые были сохранены в прологе.
- Из подпрограммы можно вызывать другую подпрограмму, следуя этим правилам.
- Подпрограмма обращается к локальным переменным, как disp($fp).
- Подпрограмма может работать со стеком, используя регистр "$sp".
- Эпилог подпрограммы (непосредственно перед возвращением):
- Загрузить возвращаемые значения в регистры "$v0 - $v1".
- $sp = ($fp + размер пространства для локальных переменных).
- Извлечь из стека (в обратном порядке) сохраненные в прологе регистры "$s0 - $s7".
- Извлечь из стека в регистр "$fp" адрес кадра стека.
- Извлечь из стека в регистр '$ra" адрес возврата.
- Вернуться в вызывающую процедуру, используя "jr $ra".
- Восстановление состояния при выходе из подпрограммы (делает вызывающая процедура):
- Извлечь из стека (в обратном порядке) сохраненые регистры "$t0 - $t9".
- Пример программы:
1 ## file variablesStack.asm 2 3 # int mysub( int arg ) 4 # { 5 # int b,c; // b: 0($fp) 6 # // c: 4($fp) 7 # b = arg*2; 8 # c = b + 7; 9 # 10 # return c; 11 # } 12 .text 13 .globl mysub 14 mysub: 15 # prolog 16 sub $sp,$sp,4 # 1. Push return address 17 sw $ra,($sp) 18 sub $sp,$sp,4 # 2. Push caller's frame pointer 19 sw $fp,($sp) 20 sub $sp,$sp,4 # 3. Push register $s1 21 sw $s1,($sp) 22 sub $fp,$sp,8 # 4. $fp = $sp - space_for_variables 23 move $sp,$fp # 5. $sp = $fp 24 25 # body of subroutine 26 mul $s1,$a0,2 # arg*2 27 sw $s1,0($fp) # b = " " 28 29 lw $t0,0($fp) # get b 30 add $t0,$t0,7 # b+7 31 sw $t0,4($fp) # c = " " 32 33 # epilog 34 lw $v0,4($fp) # 1. Put return value in $v0 35 add $sp,$fp,8 # 2. $sp = $fp + space_for_variables 36 lw $s1,($sp) # 3. Pop register $s1 37 add $sp,$sp,4 # 38 lw $fp,($sp) # 4. Pop $fp 39 add $sp,$sp,4 # 40 lw $ra,($sp) # 5. Pop $ra 41 add $sp,$sp,4 # 42 jr $ra # 6. return to caller 43 44 # main() 45 # { 46 # int a; // a: 0($fp) 47 # a = mysub( 6 ); 48 # print( a ); 49 # } 50 .text 51 .globl main 52 main: 53 # prolog 54 sub $sp,$sp,4 # 1. Push return address 55 sw $ra,($sp) 56 sub $sp,$sp,4 # 2. Push caller's frame pointer 57 sw $fp,($sp) 58 # 3. No S registers to push 59 sub $fp,$sp,4 # 4. $fp = $sp - space_for_variables 60 move $sp,$fp # 5. $sp = $fp 61 62 # subroutine call 63 # 1. No T registers to push 64 li $a0,6 # 2. Put argument into $a0 65 jal mysub # 3. Jump and link to subroutine 66 67 # return from subroutine 68 # 1. No T registers to restore 69 70 sw $v0,0($fp) # a = mysub( 6 ) 71 72 # print a 73 lw $a0,0($fp) # load a into $a0 74 li $v0,1 # print integer service 75 syscall 76 # epilog 77 # 1. No return value 78 add $sp,$fp,4 # 2. $sp = $fp + space_for_variables 79 # 3. No S registers to pop 80 lw $fp,($sp) # 4. Pop $fp 81 add $sp,$sp,4 # 82 lw $ra,($sp) # 5. Pop $ra 83 add $sp,$sp,4 # 84 85 li $s0,0 # return to OS 86 li $v0,10 87 syscall
- Приложения:
- MIPS ABI
Взаимодействие с ОС
Задачи операционной системы (унификация, разделение и учет ресурсов компьютера)
"операционная система Совокупность системных программ, предназначенная для обеспечения определенного уровня эффективности системы обработки информации за счет автоматизированного управления ее работой и предоставляемого пользователю определенного набора услуг." ГОСТ 15971-90
"Операционная система ? это программа, которая добавляет ряд команд и особенностей к тем, которые обеспечиваются уровнем команд. Обычно операционная система реализуется главным образом в программном обеспечении, но нет никаких веских причин, по которым ее нельзя было бы реализовать в аппаратном обеспечении (как микропрограммы)." (А.Таненбаум, курсив мой ali) Пожелания к ОС:
- Унификация
- Защита
Аппаратные требования(желательные):
- Защита. Режимы работы процессора(полный и ограниченный)
- Двойной поток вычислений.(исключения)
- Менеджмент памяти
Использование возможностей ОС: syscall
SYSCALL functions available in MARS
Примеры sysall-ов (в первую очередь В/В)
Примеры программирования для ОС
Соответствующие конвенции.
Понятие о сопроцессорах. FPU
- Сопроцессоры:
- Сопроцессор 1 - FPU
- Сопроцессор 0 - управления
- Стандарт IEEE 754
Mars -> Tools -> Floating Point Representation
- FPU MIPS
- MIPS поддерживает числа с плавающей точкой одинарной и двойной точности в IEEE-формате.
- Архитектура MIPS предусматривает наличие тридцати двух 32-битных регистров для чисел с плавающей точкой "$f0?$f31". Это не те же самые регистры, которые мы использовали до сих пор.
- Числа двойной точности (64-битные) размещаются в парах 32-битных регистров, так что для операций с такими числами доступны только 16 четных регистров "$f0, $f2, $f4, ..., $f30".
- В соответствии с соглашением, принятым в архитектуре MIPS, у этих регистров разное назначение:
Название
Номер
Назначение
$fv0?$fv1
0, 2
Значение, возвращаемое функцией
$ft0?$ft3
4, 6, 8, 10
Временные переменные
$fa0?$fa1
12, 14
Аргументы функции
$ft4?$ft5
16, 18
Временные переменные
$fs0?$fs5
20, 22, 24, 26, 28, 30
Сохраняемые переменные
- Код операции у всех команд с плавающей точкой равен 17 (10001 2 ). Для определения типа команды в них должны присутствовать поля funct и cop (от англ. coprocessor). Ниже показан формат команд типа F, используемый для чисел с плавающей точкой.
op
cop
ft
fs
fd
funct
6bits
5bits
5bits
5bits
5bits
6bits
- Команды одинарной и двойной точности различаются суффиксом в мнемонике (.s и .d соответственно). Команды с плавающей точкой включают сложение (add.s, add.d), вычитание (sub.s, sub.d), умножение (mul.s, mul.d), деление (div.s, div.d), изменение знака (neg.s, neg.d) и вычисление модуля (abs.s, abs.d).
- Регистры с плавающей точкой загружаются из памяти и записываются в память при помощи команд lwc1 и swc1 соответственно. Эти команды перемещают по 32 бита, так что для работы с числами двойной точности необходимо использовать по две такие команды.
- В тех случаях, когда ветвление зависит от условия, вычисляемого с использованием чисел с плавающей точкой, оно делится на две части. Сначала команда сравнения устанавливает или сбрасывает специальный флаг условия fpcond (от англ. floating point condition flag, флаг "0" "Coproc 1" в Mars). После этого команда ветвления проверяет этот флаг и в зависимости от его состояния осуществляет переход. Команды сравнения включают команды проверки на равенство (c.seq.s/c.seq.d), проверки на то, что один операнд меньше другого (c.lt.s/c.lt.d) или меньше или равен другому (c.le.s/c.le.d). Команды ветвления bc1f и bc1t осуществляют переход, если флаг fpcond имеет значение ЛОЖЬ или ИСТИНА соответственно. Другие варианты сравнений, такие как проверка на неравенство или на то, что один операнд больше другого, или больше или равен другому, осуществляются при помощи команд с суффиксами seq, lt, le и последующей командой bc1f.
- Пример. Использованы инструкции расширенного языка ассемблера.
1 ## newton.asm -- compute sqrt(n)
2
3 ## given an approximation x to sqrt(n),
4 ## an improved approximation is:
5
6 ## x' = (1/2)(x + n/x)
7
8 ## $f0 --- n
9 ## $f1 --- 1.0
10 ## $f2 --- 2.0
11 ## $f3 --- x : current approx.
12 ## $f4 --- x' : next approx.
13 ## $f8 --- temp
14
15 .text
16 .globl main
17
18 main:
19
20 l.s $f0,n # get n
21 l.s $f1,con_1 # constant 1.0
22 l.s $f2,con_2 # constant 2.0
23 l.s $f3,con_1 # x == first approx.
24 l.s $f10,ep # five figure accuracy
25
26 loop:
27 mov.s $f4,$f0 # x' = n
28 div.s $f4,$f4,$f3 # x' = n/x
29 add.s $f4,$f3,$f4 # x' = x + n/x
30 div.s $f3,$f4,$f2 # x = (1/2)(x + n/x)
31
32 mul.s $f8,$f3,$f3 # x^2
33 div.s $f8,$f0,$f8 # n/x^2
34 sub.s $f8,$f8,$f1 # n/x^2 - 1.0
35 abs.s $f8,$f8 # |n/x^2 - 1.0|
36 c.lt.s $f8,$f10 # |x^2 - n| < small ?
37 bc1t done # yes: done
38
39 j loop # next approximation
40
41 done:
42 mov.s $f12,$f3 # print the result
43 li $v0,2
44 syscall
45
46 li $a0,0
47 li $v0,10 # return to OS
48 syscall
49 ##
50 ## Data Segment
51 ##
52 .data
53 n: .float 4.0
54 ep: .float 1.0e-5
55 con_1: .float 1.0
56 con_2: .float 2.0
Исключения и системные вызовы
- Исключения - события, которые, помимо условных и безусловных переходов, изменяют нормальный порядок исполнения инструкций.
NB Терминология не устоялась. Так intel использует только термин "прерывание". В традиции mips(risc) принято использовать термин "исключение" для обозначения любого неожиданного изменения в алгоритме управления. Термин "прерывание" будет использоваться только для обозначения внешних событий.
- Возможная классификация:
Тип события
Источник
Термин MIPS
Переполнение
Внутренний
Исключение
Нет инструкции
Внутренний
Исключение
Системный вызов
Внутренний
Исключение
Запрос внешнего устройства
Внешний
Прерывание
Отказ оборудования
Внутренний/Внешний
Исключение/Прерывание
- Общая идея обработки исключения.
- Аппаратура процессора обнаруживает исключения и осуществляет передачу управления.
- переход на фиксированный адрес
- вектор прерываний
- Программная обработка
- Возврат к нормальному порядку исполнения инструкций.
- Аппаратура процессора обнаруживает исключения и осуществляет передачу управления.
- Еще одна возможная классификация:
Класс
Причина
Синхронное/Асинхронное
Поведение при возврате
Аварийное завершение(abort)
Фатальная ошибка
Да
Нет возврашения
Сбой(fault)
Потенциально восстановимая ошибка
Да
Возможен возврат к следующей инструкции
Системное прерывание(trap)
Предусмотренное исключение
Да
Возврат к следующей инструкции
Аппаратное прерывание(interrupt)
Сигнал устройства ввода/вывода
Нет
Возврат к следующей инструкции
- Обработка исключений в MIPS на примере эмулятора Mars.
- MARS имитирует основные элементы механизма MIPS32 исключений. Набор инструкций MIPS включает в себя ряд инструкций, которые вызывают исключение ловушки на основе относительных значений двух регистров или непосредственного значения и регистра:
- ten, teqi (ловушки если равно), tne, tnei (ловушки, если не равны), tge, tgeu, tgei, tgeiu (ловушкой, если больше или равно), tlt, tltu, tlti, tltiu (ловушка, если меньше).
- MARS содержит сопроцессор управления(сопроцессор 0). Инструкции mfc0 и mtc0 используются для чтения и записи данных в сопроцессор 0.
- Когда происходит исключение процессор совершает следующие действия:
- Устанавливает бит 1 регистра $12 (статус).
- Устанавливает биты 2-6 регистра $13(причина) согласно типу исключения (коды ниже).
- Устанавливает регистр $14 (EPC). В регистре сохраняется адрес инструкции, вызвавшей исключение.
- Если исключение было вызвано обращением к неправильному адресу памяти, регистр $8 (vaddr) устанавливается на этот неверный адрес.
Поток выполнения переключается с текущей инструкции MIPS на адрес 0x800000180. Этот адрес в сегменте текста ядра (.kext) является стандартным для расположение обработчика исключений MIPS32.
- Если нет инструкции по месту 0x800000180, Mars завершит работу программы MIPS с соответствующим сообщением об ошибке.
- Обработчик исключений может вернуть управление программе, используя команду eret. Это поместит значение из "EPC" (регистр $14) в счетчик команд("PC"). Увеличение регистра $14 на 4 перед возвращением позволит пропустить инструкцию, вызвавшую исключение.
- Типы исключений (не обязательно реализованы):
- ADDRESS_EXCEPTION_LOAD (4)
- ADDRESS_EXCEPTION_STORE (5)
- SYSCALL_EXCEPTION (8),
- BREAKPOINT_EXCEPTION (9),
- RESERVED_INSTRUCTION_EXCEPTION (10),
- ARITHMETIC_OVERFLOW_EXCEPTION (12),
- TRAP_EXCEPTION ( 13),
- DIVIDE_BY_ZERO_EXCEPTION (15),
- FLOATING_POINT_OVERFLOW (16),
- FLOATING_POINT_UNDERFLOW (17).
NB Int(0) неявно.(хак MARS)
- Регистры $k0 и $k1 по соглашениям могут быть использованы свободно.
- Простой пример:
1 .text 2 main: 3 teqi $t0,0 # immediately trap because $t0 contains 0 4 li $v0, 10 # After return from exception handler, specify exit service 5 syscall # terminate normally 6 7 # Trap handler in the standard MIPS32 kernel text segment 8 9 .ktext 0x80000180 10 move $k0,$v0 # Save $v0 value 11 move $k1,$a0 # Save $a0 value 12 la $a0, msg # address of string to print 13 li $v0, 4 # Print String service 14 syscall 15 move $v0,$k0 # Restore $v0 16 move $a0,$k1 # Restore $a0 17 mfc0 $k0,$14 # Coprocessor 0 register $14 has address of trapping instruction 18 addi $k0,$k0,4 # Add 4 to point to next instruction 19 mtc0 $k0,$14 # Store new address back into $14 20 eret # Error return; set PC to value in $14 21 .kdata 22 msg: 23 .asciiz "Trap generated"
- MARS имитирует основные элементы механизма MIPS32 исключений. Набор инструкций MIPS включает в себя ряд инструкций, которые вызывают исключение ловушки на основе относительных значений двух регистров или непосредственного значения и регистра:
- Приложение
- Coprocessor_0 Mars
Название
Номер
Назначение
BadVAddr
8
Адрес при обращении к которому произошло исключение
Status
12
Состояние: маска прерываний, биты разрешений, ...
Cause
13
Тип исключения и биты отложенных прерываний
EPC
14
Адрес инструкции, которая вызвала исключение
- Инструкции для работы с регистрами Cop_0:
- mfc0 Rdest, C0src
- mtc0 Rsrc, C0dest
- eret
Регистр Status:
bits
31-16
15-8
7-5
4
3,2
1
0
target
unused
Int. mask
unuse
K/U
unused
Exception level
Int enable
- Interrupt mask - Mаска прерываний. Бит равен 1, если соответствующее прерываний разрешено.
- K/U - не стимулируется Mars; всегда 1.
- Exception level - устанавливается автоматически при исключении; предотвращает повторный вход.
- Interrupt enable - глобальное разрешение прерываний (0 - отключить).
Регистр Cause:
bits
31
30-16
15-8
7
6-2
1-0
target
Br
unused
Pending interrupts
unused
Exception code
unused
- Br - 1 если исключение произошло на инструкции в слоте задержки перехода.
- Pending interrupts - ожидающие прерывания.
- Exception code - код исключения.
- Coprocessor_0 Mars
Внешние устройства и ввод/вывод
Устройства компьютера возожно разделить на два вида:
- внутренние (процессор, ОЗУ);
- внешние (периферийные).
Вычислительная система состоящая только из процессора и памяти мало полезна. Для повышения практической полезности ЭВМ снабжается периферийными устройствами(ПУ).
Внешние(периферийные) устройства ЭВМ, - устройства, предназначенные для внешней машинной обработки информации (в отличие от преобразований информации, осуществляемых центральным процессором). По роду выполняемых операций П. у. подразделяются на след. группы: устройства подготовки данных, служащие для занесения информации на промежуточные носители данных (перфорационные карты, перфорационные ленты, магнитные ленты, магнитные диски и др.); устройства ввода - для считывания информации и ее преобразования в кодовую последовательность электрических сигналов, подлежащих передаче в центральный процессор; устройства вывода - для регистрации результатов обработки информации или их отображения (дисплей, принтер, графопостроитель и др.); устройства хранения больших объемов информации (запоминающие устройства на магнитных дисках ...); устройства передачи информации на большие расстояния, обеспечивающие взаимодействие многих пользователей с ЭВМ (аппаратура передачи данных и др.).
ПУ имеют регистры. На программном уровне все управление ПУ сводится к чтению/записи регистров устройства.
CPU
r/w
ПУ
<->
Data registers
-->
Control registers
<--
Status registers
При работе с ПУ процессор выполняет функции, к числу которых относится:
- арбитраж (выбор устройств по приоритету);
- поиск периферийного устройства по заданному адресу;
- передача периферийному устройству команды на исполнение;
анализ состояния ПУ (получение от ПУ информации об его состоянии);
поискПУ, запрашивающего обслуживание;
прием и передача данных от ПУ;
- управление памятью.
Порт(многозначность и связанная с этим путаница). IN, OUT.
- Отображение регистров на память("MMIO").
Программный опрос ПУ, как способ организации взаимодействия.
- Пример терминала в Mars:
Tools -> Keyboard adn Display MMIO Simulator
1 # Memory mapped address of device registers. 2 # 0xFFFF0000 rcv contrl 3 # 0xFFFF0004 rcv data 4 # 0xFFFF0008 tx contrl 5 # 0xFFFF000c tx data 6 7 .text 8 main: 9 loop: 10 jal getc 11 beq $v0,0x32, exit 12 ori $a0, $v0, 0 13 jal putc 14 15 nop 16 nop 17 nop 18 nop 19 nop 20 j loop 21 exit: 22 li $v0, 10 23 syscall 24 25 getc: 26 # v0 = received byte 27 lui $t0,0xffff 28 gcloop: 29 lw $t1,0($t0) # read rcv ctrl 30 andi $t1,$t1,0x0001 # extract ready bit 31 beq $t1,$0,gcloop # keep polling till ready 32 lw $v0,4($t0) # read data and rtn 33 jr $ra 34 35 putc: 36 # a0 = byte to trransmit 37 lui $t0,0xffff 38 pcloop: 39 lw $t1,8($t0) # read tx ctrl 40 andi $t1,$t1,0x0001 # extract ready bit 41 beq $t1,$0,pcloop # wait till ready 42 sw $a0, 0xc($t0) # write data 43 jr $ra 44 45 .data
- Примечания:
- Keyboard adn Display MMIO Simulator использует для управления и передачи данных четыре регистра:
- 0xFFFF0000 rcv contrl
bits
31-2
1
0
target
unused
Int
ready
- 0xFFFF0004 rcv data
bits
31-8
7-0
target
unused
Resived Byte
- 0xFFFF0008 tx contrl
bits
31-2
1
0
target
unused
Int
ready
- 0xFFFF000c tx data
bits
31-8
7-0
target
unused
Transmitted Byte
Прерывания и DMA
- Прерывание ? сигнал, сообщающий процессору о наступлении какого-либо внешнего события.
- асинхронны
- позволяют освободить cpu от активного ожидания.
- Проблемы возникающие при обработке прерываний:
- распознавание природы прерывания
- прерывания важны
- прерывания нужно быстро обработать
- Маскирование прерываний.
- Прерывания, в зависимости от возможности запрета, делятся на:
- маскируемые ? прерывания, которые можно запрещать установкой соответствующих битов в регистре маскирования прерываний;
- немаскируемые ? обрабатываются всегда, независимо от запретов на другие прерывания.
- Прерывания, в зависимости от возможности запрета, делятся на:
- Приоритеты обслуживания прерываний.
- Прерывания в Mars.
- Микропроцессор имеет входы прерывания.
- Каждый запрос прерывания может индивидуально маскироваться(включаются при 1) соответствующими разрядами поля Int Mask в регистре Status. Все запросы прерываний маскируются при установке значения бита IЕ=1 в регистра Status.
Все прерывания обнаруживаются процессором. При поступлении сигналов прерывания процессор сбрасывает(0) биты поля ExcCode регистра Cause. При этом содержимое поля IP регистра Cause будет показывать, на какие входы поступили сигналы прерывания. При поступлении нескольких запросов прерывания приоритет их обслуживания должен задаваться программой-обработчиком.
- Сигнал прерывания продолжает восприниматься процессором после начала обработки прерывания. Чтобы избежать повторного обслуживания запроса, программа-обработчик должна выдать сообщение соответствующему внешнему устройству на снятие запроса прерывания или произвести маскирование запроса путем сброса в 0 соответствующего бита IMx регистре Status.
- Пример:
1 .text 2 .globl main 3 main: 4 mfc0 $a0, $12 # read from the status register 5 ori $a0, 0xff11 # enable all interrupts 6 mtc0 $a0, $12 # write back to the status register 7 8 lui $t0, 0xFFFF # $t0 = 0xFFFF0000; 9 ori $a0, $0, 2 # enable keyboard interrupt 10 sw $a0, 0($t0) # write back to 0xFFFF0000; 11 12 here: 13 j here # stay here forever 14 nop 15 li $v0, 10 # exit,if it ever comes here 16 syscall 17 18 19 .ktext 0x80000180 # kernel code starts here 20 21 .set noat # tell the assembler not to use $at, not needed here actually, just to illustrae the use of the .set noat 22 move $k1, $at # save $at. User prorams are not supposed to touch $k0 and $k1 23 .set at # tell the assembler okay to use $at 24 25 sw $v0, s1 # We need to use these registers 26 sw $a0, s2 # not using the stack because the interrupt might be triggered by a memory reference 27 # using a bad value of the stack pointer 28 29 mfc0 $k0, $13 # Cause register 30 srl $a0, $k0, 2 # Extract ExcCode Field 31 andi $a0, $a0, 0x1f 32 33 bne $a0, $zero, kdone # Exception Code 0 is I/O. Only processing I/O here 34 nop 35 36 lui $v0, 0xFFFF # $t0 = 0xFFFF0000; 37 lw $a0, 4($v0) # get the input key 38 li $v0,1 # print it here. 39 # Note: interrupt routine should return very fast, so doing something like 40 # print is NOT a good practice, actually! 41 syscall 42 43 li $v0,4 # print the new line 44 la $a0, new_line 45 syscall 46 47 kdone: 48 mtc0 $0, $13 # Clear Cause register 49 mfc0 $k0, $12 # Set Status register 50 andi $k0, 0xfffd # clear EXL bit 51 ori $k0, 0x01 # Interrupts enabled 52 mtc0 $k0, $12 # write back to status 53 54 lw $v0, s1 # Restore other registers 55 lw $a0, s2 56 57 .set noat # tell the assembler not to use $at 58 move $at, $k1 # Restore $at 59 .set at # tell the assembler okay to use $at 60 61 eret # return to EPC 62 nop 63 64 .kdata # kernel data 65 s1: .word 10 66 s2: .word 11 67 new_line: 68 .asciiz "\n"
- DMA - прямой доступ к памяти.
Кэш-память
TODO
- Зачем.Локальность.За все время существования вычислительной техники устойчиво наблюдаются два явления:
- Основная память работает значительно медленнее процессора.
- Обращения к памяти происходят локально в пространстве и времени.
- Виды:
- прямого отображения
- полностью ассоциативный
- n-канальный множественно-ассоциативный кэш
- Промахи
- стратегии записи
- пример из Marsa
- Tools-Data Cache Simulator
- пример на предсказании не перехода.
- Управление кэшированием. Текущие абстракции.
Эффективность выполнения инструкций
Принципиальная схема MARS. => параллельная загрузка узлов
Пример конвейера на MIPS
- Конфликт по данным
- Конфликт по управлению
Варианты:
- не обнаруживать (пускай компилятор думает)
- обнаруживать (процессор)
- переупорядочивать микрокоманды
- возможно, сразу нескольких инструкций, если они развязаны (суперскалярность)
- использовать несколько вычисляющих устройств для развязанных по данным команд (векторность)
- опережающее выполнение, предсказание по переходам и т. д.
Аппаратная поддержка многозадачности
Понятие контекста и переключения контекстов
- Кто7 Супервизор
- Как? По таймеру
Разделение памяти
- PIC
- Изолированное отображение памяти
- с использованием регистра смещения
- с использованием страниц и VMM
- ?
Всякое
- swapping
- paging
- overcommit и page fault
- ?
Многопроцессорный системы
Потенциальные возможности (общая память и реальный параллелисзм)
Проблема: атомарный доступ к памяти
- аппаратный семафор
- проблема Giant Lock в ядре
Проблема: обработка прерываний
- контроллер прерываний (решает, на какой процессор послать) и глобальные прерывания
- локальные прерывания
Закон Амдаля: В случае, когда задача разделяется на несколько частей, суммарное время ее выполнения на параллельной системе не может быть меньше времени выполнения самого длинного фрагмента
Non-SMP, кластеры
Виртуализация
Новые условия эксплуатации:
- Унификация HW
- Оперативное (горячее) изменение аппраратного профиля (память, диск, количество CPU)
- доступность и миграция
=>
- Виртуализация HW
- Проброс HW
- Гипервизор
- Двойная (многомерная) косвенность VMM
- Дедупликация и т. д.