Документ взят из кэша поисковой машины. Адрес оригинального документа : http://uneex.mithril.cs.msu.su/ArchitectureAssembler/FullPages
Дата изменения: Unknown
Дата индексирования: Sun Apr 10 03:29:59 2016
Кодировка: UTF-8

Поисковые слова: ori
ArchitectureAssembler/FullPages - UNИX

Архитектура ЭВМ и язык ассемблера

Представление об архитектуре ЭВМ

?ЭВМ вообще?


  • Калькулятор ? хранение команд ? хранение данных ? атрибуция данных ? подготовка и вывод результатов ? выполнение команд в зависимости от данных ? ЭВМ
    • Адресация и переходы как частные случаи
    ? Архитектура фон Неймана исполнитель, память, В/В, коммутатор

Хранение данных и команд в памяти. ММ3

ММ3: условия и циклы

ММ2, ММ1, рассказ о ММ0

УМ-Р

Регистровая машина с модификацией адреса. Проход массива циклом.

Ассемблер. Язык ассемблера

Проблемы программирования в кодах: синтаксическое однообразие и отсутствие мнемоники

Ассемблер: текст?машинный язык; мнемоника команд; представление данных; метки. Проблема ?второго прохода?.

MIPS, базовые сведения об архитектуре и работе; простейшая программа

  1. Базовые сведения об архитектуре и работе.

    MARS-1.png

  2. MARS
    • Получение с сайта.Download Mars

    • Установка и запуск.
    • Настройка для первой программы.
      • В меню settings следует к настройкам по умолчанию добавить:
        • Assemble and execute programs using delayed branching = ON
        • Permit programs to use extended (pseudo) instructions and formats = OFF
    • Редактирование, ассемблирование, трассировка первой программы.
  3. Простейшая программа:

   1 ## AddSome.asm
   2 ##
   3 ## Program to demonstrate addition
   4 
   5         ori      $8, $0, 0xAB       # put 0x000000AB into $8
   6         ori      $9, $0, 0x55       # put 0x00000055 into $9
   7         addu     $10,$9, $8         # $10 <?? sum
   8 
   9 ## End of file

MIPS ? архитектура и система команд

MIPS (англ. Microprocessor without Interlocked Pipeline Stages) ? микропроцессор, разработанный компанией MIPS Computer Systems в соответствии с концепцией проектирования процессоров RISC.

  1. Схема

    MIPS_single_cycle.gif

  2. Цикл работы процессора
    • Загрузка инструкции (IF = Instruction Fetch)
    • Декодирование инструкции, выделение команды и операндов, чтение регистров (ID = Instruction Decode)
    • Фактическое выполнение инструкции (Ex = Execute)
    • Сохранение регистра в память, Загрузка регистра из памяти (MEM = Memory access)
    • Запись результата регистр (WB = Writeback)
    1.Микрокоманды и микропрограмма
    • Инструкция уровня языка ассемблера может быть разбита на отдельные микрокоманды. Программа интерпретирующая машинные инструкции называется микропрограммой. Микропрограмма позволяет на одном и том же наборе аппаратуры реализовать разные архитектуры.
  3. MIPS
    • 4GB оперативной памяти.
    • Инструкции одинаковой длины 32 бита.
    • 32 регистра общего назначения размером 32 бита.
    • Регистр $0 всегда возвращает 0.
    • Регистры PC, Hi, Lo.
  4. Типы и форматы инструкций.
    • Инструкции делятся на три типа: 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)

  5. Инструкции типов I и R.

    • Схема исполнения:

    MIPS-1_1.jpg

    • Арифметические:
      • add, addu, sub, subu, mult, multu, div, divu
      • addi, addiu
    • Логические:
      • and, or, xor, nor, slt
      • andi, ori, xori, slti
    • Сдвига:
      • sll, srl, sra
    • Передачи данных:
      • mfhi, mflo
  6. Пример программы:

   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

  1. Адресация.
    • Адресация ? обращение к элементу данных по его адресу. Существует несколько способ интерпретации битов инструкции для указания местоположения данных:
    • Неявная адресация
    • Непосредственная
    • Прямая
    • Регистровая
    • Косвенная
    • Базовая
    • Относительная
    • Индексная
    • ...
  2. Секции(сегменты)
    • В программе принято отделять данные от кода. Секция есть непрерывный диапазон адресов, все данные в которых считаются с некоторой точки зрения однородными.
    • Некоторые процессоры аппаратно поддерживают подобное разделение.
    • Для определения секций в языке ассемблера MARS служат директивы: ".text" и ".data".
    • Ассемблер MARS не позволяет определять данные в секции .text.
      • директивы определения данных: ".word", ".half", ".byte", ".asciiz", ".ascii"
      • метки
      • точка входа, директива ".globl"
  3. Команды загрузки и сохранения:
    • 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
      
  4. Команды перехода:
    • 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
      
  5. Работа с байтами.
    •    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          
      
  6. Массивы.
    •    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
      
  7. Аресация MIPS:

addr.png

Взаимодействие процессор-память

В современном компьютере можно выделить несколько функционально различных блоков: процессор, основная память, внешние запоминающие устройства, ...(более того, эти блоки обладают внутренней сложной структурой).

  1. Шина ? подсистема, служащая для передачи данных между функциональными блоками компьютера.
  2. Протокол шины.
  3. Шины адреса и данных. Гарвард/Принстон.
  4. Организация микросхем основной памяти. Цикл чтения/записи. Длительность цикла чтения/записи в циклах шины/процессора.
  5. Идея кэширования.
  6. Виды памяти:
    • SRAM ? быстрая и дорогая:
      • Регистры
      • Кэш
    • DRAM ? медленная и не дорогая:
      • Основная память
    • Прочее SSD, HDD,... ? энергонезависимая:
      • Внешние запоминающие устройства.
  7. Пирамида задержек.
    • [ПРИКРЕПЛЕННЫЙ ФАЙЛ]

  8. Методы повышения производительности подсистемы памяти
    • Буферизация.
    • перекрытие циклов(конвейер).
    • расщеплении(параллелизм)
  9. Постоянные программируемые запоминающие устройства с произвольным доступом(ROM). Использование ROM для первоначальной инициализации компьютера.

Конвенции, псевдоинструкции и макросы

Структура памяти, псевдоинструкции, макросы, понятие о конвенциях ().

  1. Конвенции.
  2. Расширенный ассемблер.
    • Ассемблер 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  
  1. Макроподстановки

Стек и подпрограммы

  1. Стек:
    • Стек
    • Стек 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
        
    • Аппаратный стек
  2. Подпрограммы:
    • повторное использование
    • модульность
    • проблема возврата
    • аппаратная поддержка:
      • инструкции - "jal" и "jr"("jalr")
      • особая роль регистра $31($ra)
  3. Конвенции о вызове:
    • вызывающий и и вызываемый
    • правила сохранения и использования регистров
  4. Простая конечная подпрограмма:
    • Простая конвенция о вызове:
      1. Подпрограмма вызывается с помощью инструкции "jal"(которая сохранит обратный адрес в регистре $ra).
      2. Подпрограмма не будет вызывать другую подпрограмму(конечная).
      3. Подпрограмма возвращает управление вызывающей программе с помощью инструкции "jr $rа".
      4. Регистры используются следующим образом:
        • $t0 - $t9 - подпрограмма может изменить эти регистры.
        • $s0 - $s7 - подпрограмма не должны изменять эти регистры.
        • $а0 - $a3 - эти регистры содержат аргументы для подпрограммы. Подпрограмма может изменить их.
        • $v0 - $v1 - эти регистры содержат значения, возвращаемые из подпрограммы.
      5. Основная программа возвращает управление с помощью системного вызова(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: "
    

Фреймы, локальные переменные, рекурсия

Ранее рассмотренная конвенция не обеспечивает некоторые возможности языков высокого уровня. Добавим некоторые из этих функций в новой конвенции о вызове процедур на основе стека.

  1. Сохранение регистров в стеке
    • Сохранение адреса возврата в стеке($ra)
    • Сохранение и восстановление регистров $s0?$s7 в/из стеке/стека
  2. Конвенция о вызове процедур на основе стека.
    • Это не официальное соглашение. Однако, оно может быть использовано для небольшого проекта на языке ассемблера. Конвенция не очень сложна и делает почти все, что может быть нужно. Если вы хотите использовать процедуры из программы на языке "C", использовать процедуры из библиотек, написанных на других ЯП или вызывать вашу процедуру из программы на ЯВУ, то необходимо использовать официальные правила в полном объеме. (Что в эмуляторе MARS невозможно.)
    • Правила:
      1. Вызов подпрограммы (делает вызывающая процедура):
        • Сохранить в стеке регистры "$t0 - $t9", которые должны быть сохранены(будут использованы вызывающей процедурой после вызова подпрограммы). Подпрограмма может изменить эти регистры.
        • Загрузить значения аргументов в регистры "$a0 - $a3".
        • Вызов подпрограммы с помощью "jal".
      2. Пролог подпрограммы:
        • Сохранить регистр "$ra" в стек.
        • Сохранить в стек регистры "$s0 - $s7"(подпрограмма может изменять их).
      3. Тело подпрограммы:
        • Подпрограмма может изменять регистры "$t0 - $t9", или те из регистров "$s0 - $s7", которые были сохранены в прологе.
        • Из подпрограммы можно вызывать другую подпрограмму, следуя этим правилам.
      4. Эпилог подпрограммы (непосредственно перед возвращением):
        • Загрузить возвращаемые значения в регистры "$v0 - $v1".
        • Извлечь из стека (в обратном порядке) сохраненые в прологе регистры "$s0 - $s7".
        • Извлечь из стека в регистр '$ra" адрес возврата.
        • Вернуться в вызывающую процедуру, используя "jr $ra".
      5. Восстановление состояния при выходе из подпрограммы:
        • Извлечь из стека (в обратном порядке) сохраненые регистры "$t0 - $t9".
  3. Пролог и эпилог вызываемой подпрограммы:
  4. Вызов и возврат.
  5. Вложенные вызовы подпрограмм и цепь активации.
  6. О реальных конвенциях(ABI).
  7. Пример программы:
    •    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         
      
  8. Локальные переменные.
  9. Кадр стека.
  10. Конвенция о вызове процедур с использованием указателя кадра стека.
    • Это не официальное соглашение. В большинстве реальных MIPS-ABI использование указателя кадра стека факультативно. В широко распространенной архитектуре "intel32/64" указателя кадра стека активно используется.
    1. Вызов подпрограммы (делает вызывающая процедура):
      • Сохранить в стеке регистры "$t0 - $t9", которые должны быть сохранены(будут использованы вызывающей процедурой после вызова подпрограммы). Подпрограмма может изменить эти регистры.
      • Загрузить значения аргументов в регистры "$a0 - $a3".
      • Вызов подпрограммы с помощью "jal".
    2. Пролог подпрограммы:
      • Сохранить регистр "$ra" в стек.
      • Сохранить регистр "$fp" в стек.
      • Сохранить в стек регистры "$s0 - $s7"(подпрограмма может изменять их).
      • Инициализировать указатель кадра: $fp = ($sp - размер пространства для локальных переменных).
        • NB Помните, что вычитание из $sp увеличивает стек, что стек растет вниз, что размер переменной всегда четыре байта.

      • Инициализировать указателя стека: $sp = $fp.
    3. Тело подпрограммы:
      • Подпрограмма может изменять регистры "$t0 - $t9", или те из регистров "$s0 - $s7", которые были сохранены в прологе.
      • Из подпрограммы можно вызывать другую подпрограмму, следуя этим правилам.
      • Подпрограмма обращается к локальным переменным, как disp($fp).
      • Подпрограмма может работать со стеком, используя регистр "$sp".
    4. Эпилог подпрограммы (непосредственно перед возвращением):
      • Загрузить возвращаемые значения в регистры "$v0 - $v1".
      • $sp = ($fp + размер пространства для локальных переменных).
      • Извлечь из стека (в обратном порядке) сохраненные в прологе регистры "$s0 - $s7".
      • Извлечь из стека в регистр "$fp" адрес кадра стека.
      • Извлечь из стека в регистр '$ra" адрес возврата.
      • Вернуться в вызывающую процедуру, используя "jr $ra".
    5. Восстановление состояния при выходе из подпрограммы (делает вызывающая процедура):
      • Извлечь из стека (в обратном порядке) сохраненые регистры "$t0 - $t9".
  11. Пример программы:
       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
    
  12. Приложения:
    • MIPS ABI

    MIPS ABI History

    MIPS ABIs Described

    SYSTEM V APPLICATION BINARY INTERFACE

    MIPSpro TM N32 ABI Handbook

    mips eabi documentation...

Взаимодействие с ОС

Задачи операционной системы (унификация, разделение и учет ресурсов компьютера)

"операционная система Совокупность системных программ, предназначенная для обеспечения определенного уровня эффективности системы обработки информации за счет автоматизированного управления ее работой и предоставляемого пользователю определенного набора услуг." ГОСТ 15971-90

"Операционная система ? это программа, которая добавляет ряд команд и особенностей к тем, которые обеспечиваются уровнем команд. Обычно операционная система реализуется главным образом в программном обеспечении, но нет никаких веских причин, по которым ее нельзя было бы реализовать в аппаратном обеспечении (как микропрограммы)." (А.Таненбаум, курсив мой ali) Пожелания к ОС:

  • Унификация
  • Защита

Аппаратные требования(желательные):

  • Защита. Режимы работы процессора(полный и ограниченный)
  • Двойной поток вычислений.(исключения)
  • Менеджмент памяти

Использование возможностей ОС: syscall

SYSCALL functions available in MARS

Примеры sysall-ов (в первую очередь В/В)

Примеры программирования для ОС

Соответствующие конвенции.

Понятие о сопроцессорах. FPU

  1. Сопроцессоры:
    • Сопроцессор 1 - FPU
    • Сопроцессор 0 - управления
  2. Стандарт IEEE 754
    • Mars -> Tools -> Floating Point Representation

  3. FPU MIPS
    1. MIPS поддерживает числа с плавающей точкой одинарной и двойной точности в IEEE-формате.
    2. Архитектура MIPS предусматривает наличие тридцати двух 32-битных регистров для чисел с плавающей точкой "$f0?$f31". Это не те же самые регистры, которые мы использовали до сих пор.
    3. Числа двойной точности (64-битные) размещаются в парах 32-битных регистров, так что для операций с такими числами доступны только 16 четных регистров "$f0, $f2, $f4, ..., $f30".
    4. В соответствии с соглашением, принятым в архитектуре 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

        Сохраняемые переменные

    5. Код операции у всех команд с плавающей точкой равен 17 (10001 2 ). Для определения типа команды в них должны присутствовать поля funct и cop (от англ. coprocessor). Ниже показан формат команд типа F, используемый для чисел с плавающей точкой.
      • op

        cop

        ft

        fs

        fd

        funct

        6bits

        5bits

        5bits

        5bits

        5bits

        6bits

      Поле cop равно 16 (10000 2 ) для команд одинарной точности и 17 (10001 2 ) для команд двойной точности. Аналогично командам типа R, у команд типа F есть два операнда-источника (fs и ft) и один операнд-назначение (fd). Формат команд типа F
    6. Команды одинарной и двойной точности различаются суффиксом в мнемонике (.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).
    7. Регистры с плавающей точкой загружаются из памяти и записываются в память при помощи команд lwc1 и swc1 соответственно. Эти команды перемещают по 32 бита, так что для работы с числами двойной точности необходимо использовать по две такие команды.
    8. В тех случаях, когда ветвление зависит от условия, вычисляемого с использованием чисел с плавающей точкой, оно делится на две части. Сначала команда сравнения устанавливает или сбрасывает специальный флаг условия 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.
  4. Пример. Использованы инструкции расширенного языка ассемблера.

   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

Исключения и системные вызовы

  1. Исключения - события, которые, помимо условных и безусловных переходов, изменяют нормальный порядок исполнения инструкций.
    • NB Терминология не устоялась. Так intel использует только термин "прерывание". В традиции mips(risc) принято использовать термин "исключение" для обозначения любого неожиданного изменения в алгоритме управления. Термин "прерывание" будет использоваться только для обозначения внешних событий.

  2. Возможная классификация:
    • Тип события

      Источник

      Термин MIPS

      Переполнение

      Внутренний

      Исключение

      Нет инструкции

      Внутренний

      Исключение

      Системный вызов

      Внутренний

      Исключение

      Запрос внешнего устройства

      Внешний

      Прерывание

      Отказ оборудования

      Внутренний/Внешний

      Исключение/Прерывание

  3. Общая идея обработки исключения.
    • Аппаратура процессора обнаруживает исключения и осуществляет передачу управления.
      • переход на фиксированный адрес
      • вектор прерываний
    • Программная обработка
    • Возврат к нормальному порядку исполнения инструкций.
  4. Еще одна возможная классификация:
    • Класс

      Причина

      Синхронное/Асинхронное

      Поведение при возврате

      Аварийное завершение(abort)

      Фатальная ошибка

      Да

      Нет возврашения

      Сбой(fault)

      Потенциально восстановимая ошибка

      Да

      Возможен возврат к следующей инструкции

      Системное прерывание(trap)

      Предусмотренное исключение

      Да

      Возврат к следующей инструкции

      Аппаратное прерывание(interrupt)

      Сигнал устройства ввода/вывода

      Нет

      Возврат к следующей инструкции

  5. Обработка исключений в MIPS на примере эмулятора Mars.
    1. MARS имитирует основные элементы механизма MIPS32 исключений. Набор инструкций MIPS включает в себя ряд инструкций, которые вызывают исключение ловушки на основе относительных значений двух регистров или непосредственного значения и регистра:
      • ten, teqi (ловушки если равно), tne, tnei (ловушки, если не равны), tge, tgeu, tgei, tgeiu (ловушкой, если больше или равно), tlt, tltu, tlti, tltiu (ловушка, если меньше).
      • MARS содержит сопроцессор управления(сопроцессор 0). Инструкции mfc0 и mtc0 используются для чтения и записи данных в сопроцессор 0.
    2. Когда происходит исключение процессор совершает следующие действия:
      • Устанавливает бит 1 регистра $12 (статус).
      • Устанавливает биты 2-6 регистра $13(причина) согласно типу исключения (коды ниже).
      • Устанавливает регистр $14 (EPC). В регистре сохраняется адрес инструкции, вызвавшей исключение.
      • Если исключение было вызвано обращением к неправильному адресу памяти, регистр $8 (vaddr) устанавливается на этот неверный адрес.
      • Поток выполнения переключается с текущей инструкции MIPS на адрес 0x800000180. Этот адрес в сегменте текста ядра (.kext) является стандартным для расположение обработчика исключений MIPS32.

      • Если нет инструкции по месту 0x800000180, Mars завершит работу программы MIPS с соответствующим сообщением об ошибке.
      • Обработчик исключений может вернуть управление программе, используя команду eret. Это поместит значение из "EPC" (регистр $14) в счетчик команд("PC"). Увеличение регистра $14 на 4 перед возвращением позволит пропустить инструкцию, вызвавшую исключение.
    3. Типы исключений (не обязательно реализованы):
      • 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)

    4. Регистры $k0 и $k1 по соглашениям могут быть использованы свободно.
    5. Простой пример:
      •    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"
        
  6. Приложение
    1. Coprocessor_0 Mars

      Название

      Номер

      Назначение

      BadVAddr

      8

      Адрес при обращении к которому произошло исключение

      Status

      12

      Состояние: маска прерываний, биты разрешений, ...

      Cause

      13

      Тип исключения и биты отложенных прерываний

      EPC

      14

      Адрес инструкции, которая вызвала исключение

    2. Инструкции для работы с регистрами Cop_0:
      • mfc0 Rdest, C0src
      • mtc0 Rsrc, C0dest
      • eret
    3. Регистр 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

    4. Interrupt mask - Mаска прерываний. Бит равен 1, если соответствующее прерываний разрешено.
    5. K/U - не стимулируется Mars; всегда 1.
    6. Exception level - устанавливается автоматически при исключении; предотвращает повторный вход.
    7. Interrupt enable - глобальное разрешение прерываний (0 - отключить).
    8. Регистр Cause:

      bits

      31

      30-16

      15-8

      7

      6-2

      1-0

      target

      Br

      unused

      Pending interrupts

      unused

      Exception code

      unused

    9. Br - 1 если исключение произошло на инструкции в слоте задержки перехода.
    10. Pending interrupts - ожидающие прерывания.
    11. Exception code - код исключения.

Внешние устройства и ввод/вывод

Устройства компьютера возожно разделить на два вида:

  • внутренние (процессор, ОЗУ);
  • внешние (периферийные).

Вычислительная система состоящая только из процессора и памяти мало полезна. Для повышения практической полезности ЭВМ снабжается периферийными устройствами(ПУ).

Внешние(периферийные) устройства ЭВМ, - устройства, предназначенные для внешней машинной обработки информации (в отличие от преобразований информации, осуществляемых центральным процессором). По роду выполняемых операций П. у. подразделяются на след. группы: устройства подготовки данных, служащие для занесения информации на промежуточные носители данных (перфорационные карты, перфорационные ленты, магнитные ленты, магнитные диски и др.); устройства ввода - для считывания информации и ее преобразования в кодовую последовательность электрических сигналов, подлежащих передаче в центральный процессор; устройства вывода - для регистрации результатов обработки информации или их отображения (дисплей, принтер, графопостроитель и др.); устройства хранения больших объемов информации (запоминающие устройства на магнитных дисках ...); устройства передачи информации на большие расстояния, обеспечивающие взаимодействие многих пользователей с ЭВМ (аппаратура передачи данных и др.).

  1. ПУ имеют регистры. На программном уровне все управление ПУ сводится к чтению/записи регистров устройства.

    CPU

    r/w

    ПУ

    <->

    Data registers

    -->

    Control registers

    <--

    Status registers

    При работе с ПУ процессор выполняет функции, к числу которых относится:

    • арбитраж (выбор устройств по приоритету);
    • поиск периферийного устройства по заданному адресу;
    • передача периферийному устройству команды на исполнение;
    • анализ состояния ПУ (получение от ПУ информации об его состоянии);

    • поискПУ, запрашивающего обслуживание;

    • прием и передача данных от ПУ;

    • управление памятью.
  2. Порт(многозначность и связанная с этим путаница). IN, OUT.

  3. Отображение регистров на память("MMIO").
  4. Программный опрос ПУ, как способ организации взаимодействия.

  5. Пример терминала в 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
    
  6. Примечания:
    • 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

  1. Прерывание ? сигнал, сообщающий процессору о наступлении какого-либо внешнего события.
    • асинхронны
    • позволяют освободить cpu от активного ожидания.
  2. Проблемы возникающие при обработке прерываний:
    • распознавание природы прерывания
    • прерывания важны
    • прерывания нужно быстро обработать
  3. Маскирование прерываний.
    • Прерывания, в зависимости от возможности запрета, делятся на:
      • маскируемые ? прерывания, которые можно запрещать установкой соответствующих битов в регистре маскирования прерываний;
      • немаскируемые ? обрабатываются всегда, независимо от запретов на другие прерывания.
  4. Приоритеты обслуживания прерываний.
  5. Прерывания в Mars.
    1. Микропроцессор имеет входы прерывания.
    2. Каждый запрос прерывания может индивидуально маскироваться(включаются при 1) соответствующими разрядами поля Int Mask в регистре Status. Все запросы прерываний маскируются при установке значения бита IЕ=1 в регистра Status.
    3. Все прерывания обнаруживаются процессором. При поступлении сигналов прерывания процессор сбрасывает(0) биты поля ExcCode регистра Cause. При этом содержимое поля IP регистра Cause будет показывать, на какие входы поступили сигналы прерывания. При поступлении нескольких запросов прерывания приоритет их обслуживания должен задаваться программой-обработчиком.

    4. Сигнал прерывания продолжает восприниматься процессором после начала обработки прерывания. Чтобы избежать повторного обслуживания запроса, программа-обработчик должна выдать сообщение соответствующему внешнему устройству на снятие запроса прерывания или произвести маскирование запроса путем сброса в 0 соответствующего бита IMx регистре Status.
  6. Пример:
       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"
    
  7. DMA - прямой доступ к памяти.

Кэш-память

TODO

  1. Зачем.Локальность.За все время существования вычислительной техники устойчиво наблюдаются два явления:
    • Основная память работает значительно медленнее процессора.
    • Обращения к памяти происходят локально в пространстве и времени.
    Эти замечательные факты позволяют увеличить скорость выполнения вычислений, создав кэш. Кэш ? промежуточный буфер с быстрым доступом, содержащий информацию, которая может быть запрошена с наибольшей вероятностью.
  2. Виды:
    • прямого отображения
    • полностью ассоциативный
    • n-канальный множественно-ассоциативный кэш
  3. Промахи
  4. стратегии записи
  5. пример из Marsa
  6. пример на предсказании не перехода.
  7. Управление кэшированием. Текущие абстракции.

Что такое кэш процессора, и как он работает

Кэш про?цес?со?ра

Эффективность выполнения инструкций

Принципиальная схема MARS. => параллельная загрузка узлов

Пример конвейера на MIPS

  • Конфликт по данным
  • Конфликт по управлению

Варианты:

  • не обнаруживать (пускай компилятор думает)
  • обнаруживать (процессор)
    • переупорядочивать микрокоманды
    • возможно, сразу нескольких инструкций, если они развязаны (суперскалярность)
    • использовать несколько вычисляющих устройств для развязанных по данным команд (векторность)
    • опережающее выполнение, предсказание по переходам и т. д.

Аппаратная поддержка многозадачности

Понятие контекста и переключения контекстов

  • Кто7 Супервизор
  • Как? По таймеру

Разделение памяти

  • PIC
  • Изолированное отображение памяти
    • с использованием регистра смещения
    • с использованием страниц и VMM
    • ?

Всякое

  • swapping
  • paging
  • overcommit и page fault
  • ?

Многопроцессорный системы

Потенциальные возможности (общая память и реальный параллелисзм)

Проблема: атомарный доступ к памяти

  • аппаратный семафор
  • проблема Giant Lock в ядре

Проблема: обработка прерываний

  • контроллер прерываний (решает, на какой процессор послать) и глобальные прерывания
  • локальные прерывания

Закон Амдаля: В случае, когда задача разделяется на несколько частей, суммарное время ее выполнения на параллельной системе не может быть меньше времени выполнения самого длинного фрагмента

Non-SMP, кластеры

Виртуализация

Новые условия эксплуатации:

  • Унификация HW
  • Оперативное (горячее) изменение аппраратного профиля (память, диск, количество CPU)
  • доступность и миграция

=>

  • Виртуализация HW
  • Проброс HW
  • Гипервизор
  • Двойная (многомерная) косвенность VMM
  • Дедупликация и т. д.

ArchitectureAssembler/FullPages (последним исправлял пользователь FrBrGeorge 2015-12-29 08:41:31)