nízkoúrovňové programování

Post on 16-Feb-2017

308 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

http://d3s.mff.cuni.cz

Martin Děcký

decky@d3s.mff.cuni.cz

CHARLES UNIVERSITY IN PRAGUE

Faculty of Mathematics and PhysicsFaculty of Mathematics and Physics

Nízkoúrovňové programováníNízkoúrovňové programování

2Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Nízkoúrovňové programování kdysiNízkoúrovňové programování kdysi

3Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Nízkoúrovňové programování dnesNízkoúrovňové programování dnes

fa31 c08e d866 0f 01 1629 82 0f 20 c0 6683 c8 010f 22 c066 ea 1d 80 00 0008 00

clixor %eax, %eaxmov %eax, %dslgdtw (%esi)sub %eax, 0x66c0200f(%edx)or $0x1, %eaxmov %eax, %cr0ljmpw $0x0, $0x801dor %al, (%eax)

strojový kód na IA-32Posloupnost bytů uloženáv paměti kódující instrukceprováděné procesorem

instrukční mnemonika na IA-32 (AT&T syntaxe)Kód napsaný ručně nebo vyrobený překladačem vyššíhoprogramovacího jazyka

Assembler překládá mnemonika na strojový kód

instruction nameopcoderegister name

displacement

dereference

constant

4Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Nízkoúrovňové programování dnes (2)Nízkoúrovňové programování dnes (2)

86 03 a7 ff89 57 c0 0082 10 3f ff83 28 70 0e86 08 c0 01c4 58 e0 1881 c3 e0 08c8 70 a4 78

add %sp, 0x7ff, %g3rdpr %ver, %g4mov -1, %g1sllx %g1, 0xe, %g1and %g3, %g1, %g3ldx [ %g3 + 0x18 ], %g2retlstx %g4, [ %g2 + 0x478 ]

opcode

strojový kód na SPARC V9Všechny instrukce mají délku4 byty

instrukční mnemonika na SPARC V9

instruction name

register name

displacement

dereference

constant

5Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

K čemu mi to může být dobré?K čemu mi to může být dobré?

Vždyť přece budu stejně celý život programovat v Javě, C , Pythonu nebo PHP!♯

Procesor

C++

Strojový kód

Assembler

Firmware / Operační systém

JVM / CLR

Java / .NET

Komponentový systém

Aplikační framework

C

8Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Stovky tisíc řádků kóduStovky tisíc řádků kódu

Aplikační softwareNapř. textový editorKnihovny pro uživatelské rozhraní

Systémový softwareOperační systém

Vstupně/výstupní operaceAlokace paměti a úložného prostoruSdílení prostředků

FirmwareHardware

Procesor, paměť, periferie

Hardware

10Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Paměťová zeďPaměťová zeď

Výkon procesorů omezen výkonem pamětVýkon procesorů roste rychleji než výkon pamět

Jednoduché operace trvají desetiny ns, přístup do paměti trvá desítky nsNedosažitelný cíl – kombinace: Paměť stejně rychlá jako procesor, dostatečná kapacita, rozumná cena

11Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Proč je důležité vědět o CPU cache?Proč je důležité vědět o CPU cache?

Quick Sort vs. Radix SortLaMarca, Ladner (1996)O(n×log n) vs. O(n)

Teoreticky „není co řešit“

Zdroj: Patterson & Hennessy

12Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Proč je důležité vědět o CPU cache? (2)Proč je důležité vědět o CPU cache? (2)

Jenže: Quick Sort se pro větší množství dat ukázal rychlejší ...

Zdroj: Patterson & Hennessy

13Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Proč je důležité vědět o CPU cache? (3)Proč je důležité vědět o CPU cache? (3)

DůvodZpůsob přístupu k datům v implementaci algoritmu Radix Sort způsoboval příliš mnoho výpadků cache

Zdroj: Patterson & Hennessy

14Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Proč je důležité vědět o CPU cache? (4)Proč je důležité vědět o CPU cache? (4)

ŘešeníÚprava implementace algoritmu Radix Sort, aby pracoval s daty nejprve v rámci bloku paměti, který je již načtený v cache (řádku cache)

15Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce: Od uživatele k algoritmuAbstrakce: Od uživatele k algoritmu

Uživatel

Smaž odstavecNastav písmo

....

16Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce: Od uživatele k algoritmuAbstrakce: Od uživatele k algoritmu

Algoritmus

Uživatel

Smaž odstavecNastav písmo

....

document.par[i].value = ...;document.set_font(...);...

17Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce: Od uživatele k algoritmuAbstrakce: Od uživatele k algoritmu

Algoritmus

Uživatel

Smaž odstavecNastav písmo

....

document.par[i].value = ...;document.set_font(...);...

Sémantickámezera

18Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce: Od algoritmu k programuAbstrakce: Od algoritmu k programu

Algoritmus

document.par[i].value = ...;document.set_font(...);...

19Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce: Od algoritmu k programuAbstrakce: Od algoritmu k programu

Algoritmus

document.par[i].value = ...;document.set_font(...);...

Sémantickámezera Program

MULI $2, $5, 4ADD $2, $4, $2LW $16, 0($2)...

20Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce: Od programu ke kóduAbstrakce: Od programu ke kódu

Program

MULI $2, $5, 4ADD $2, $4, $2LW $16, 0($2)...

21Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce: Od programu ke kóduAbstrakce: Od programu ke kódu

SémantickámezeraProgram

MULI $2, $5, 4ADD $2, $4, $2LW $16, 0($2)...

Procesor

010100101001001101010011010111010110101...

22Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

AbstrakceAbstrakce

Překonávání sémantických mezerPostup od konkrétního (technického) jazyka k abstraktnímu (obecnému) jazykuIdeálně se zachováním přesnosti, ale využit šířeji definovaných pojmů a „zapouzdření“ vnitřních detailů

Stručnější a kompaktnější vyjádření„An abstraction is one thing that represents several real things equally well.“ (Edsger Dijkstra)

23Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce (2)Abstrakce (2)

Vhodný jazyk pro danou úroveň abstrakceŘídící logika procesoru

Pomocí jednotky ALU sečti hodnotu z registru A a hodnotu z registru B, výsledek ulož do registru C

Strojový kód: instrukce (slova) nad abecedou {0, 1}1000110010100000

Assembler: symbolický zápis instrukcí programuadd R2, R3, R1

Vyšší programovací jazyk: symbolický zápis algoritmu

fruits := apples + oranges

24Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Abstrakce (3)Abstrakce (3)

Vhodný jazyk pro danou úroveň abstrakcePřeklad mezi jazyky = překonávání sémantické mezeryJazyk vyšší úrovně = vyšší produktivita člověka

Doménově-specifické jazykyJazyk nižší úrovně = vyšší produktivita stroje

Strojový kódPřekladač

Překlad z vyššího programovacího jazyka do jazyka nižší úrovně (často až do symbolického zápisu instrukcí konkrétního procesoru)

AssemblerPřeklad ze symbolického zápisu instrukcí do binárního kódu vykonatelného konkrétním procesorem

25Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Překladač vyššího jazykaPřekladač vyššího jazyka

preprocessor compiler assembler.h .i

.c

.h

.s

.o

cc -c -o output.o input.cas -o output.o input.s

26Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Assembler s preprocessoremAssembler s preprocessorem

cc -c -o output.o input.S

preprocesor assembler.h

.S

.h

.s

.o

27Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

LinkováníLinkování

linker.o

binary

.o

.o

linker script

ld -T link.ld -o output.bin input0.o input1.o

28Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Linkování (2)Linkování (2)

void global_fnc01() { }void global_fnc02() { }

int global_int;void *global_ptr;

int another_symbol __attribute__((section(“another_section”)));

input0.c

.textglobal_fnc01global_fnc02

.bssglobal_intglobal_ptr

another_sectionanother_symbol

input0.o

29Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Linkování (3)Linkování (3)

SECTIONS {.output 0x80000000 : {

*(.text)*(.bss)*(another_section)_output_end = .;

}}

link.ld

.output (displacement: 0x80000000)global_fnc01global_fnc02global_intglobal_ptranother_symbol_output_end

output.bin

30Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Užitečné přepínače překladačeUžitečné přepínače překladače

GCC-ffreestanding

Překlad bez standardní knihovny a funkce main()-nostdlib

Bez prohledávání systémové cesty knihoven-nostdinc

Bez prohledávání systémové cesty hlavičkových souborů-fno-builtin

Nepoužívat vestavěné funkce překladače (není-li explicitně použit prefix __builtin_)

31Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Užitečné atributy překladačeUžitečné atributy překladače

GCC__attribute__((packed))

Struktura bez standardního zarovnání prvků__attribute__((may_alias))

Proměnná daného datového typu může být zároveň jiným datovým typem

__attribute__((aligned(n)))Proměnná se zarovnáním v paměti na n bytů

__attribute__((section(“sekce”)))Symbol umístěn ve vstupní sekci sekce

__attribute__((returns_twice))Pro implementaci funkcí obnovujících kontext procesoru

32Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Užitečné nástrojeUžitečné nástroje

objdumpVýpis informací o objektových a binárních souborech

-xVýpis všech hlaviček

-dDisassemblování spustitelných sekcí

-DDisassemblování všech sekcí

-SDisassemblování proložené řádky zdrojového kóduPotřebuje debuggovací informace (gcc -g)

33Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Kde se to naučit pořádně?Kde se to naučit pořádně?

Kurzy na MFF UK (a obdobné na jiných univerzitách)Principy počítačůArchitektura počítačůOperační systémyPrincipy překladačůCrash dump analýza

LiteraturaDavid Patterson, John Hennessy: ComputerOrganization and Design

On-lineSérie článků Co se děje v počítači na Root.cz

35Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Stručná charakteristikaStručná charakteristika

open source general-purpose multiplatform microkernel multiserver operating system implemented from

scratch

37Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

HelenOS: Architektura v kostceHelenOS: Architektura v kostcear

chit

ectu

re in

depe

nden

t

shar

ed a

rchi

tect

ure

depe

nden

t

arch

itec

ture

depe

nden

t

bootstraproutines

CPUmgmt

atomics&

barriers

I/Omgmt

platformmemory

mgmt

platformdrivers

debuggingsupport

contextswitching

interrupthandling

platformlibrary

routines

sharedplatformdrivers

shareddebugging

support

hierarchicalpage table

support

global pagehash table

support

hardware

layer

abst

ract

ion

kernelunittests

memorybackends

memoryzonesmgmt

frameallocator

slaballocator

addressspacemgmt

memoryreservation

spinlocks

waitqueues

workqueues

interrupt &syscall

dispatch

threadscheduler

thread &task

mgmt

kernellifecyclemgmt

lists,trees,

bitmaps

concurrenthashtable

genericresourceallocator

ELFloader

stringroutines

miscroutines

kernelconsole

IPC

kernellog

hardwareresource

mgmt

systeminformation

cycle &time

mgmt

tracingsupport

read-copy-

update

taskcapabilities

cachecoherency

synchro-nizationinterface

kernel

namingservice loader task

monitor

kloglocationservice logger

devicemanager

device drivers

clientsession

vterm bdsh

vfs

file systemdrivers

FAT exFAT ext4

ISO 9660 UDF MINIX FS

TMPFS Location FS

init

transportlayer protocols

tcp udp

link layerprotocols

loopip ethip

slip

inetsrv

networkingmanagement

dnsrsrv dhcp

nconfsrv

human interface

clipboard audio

outputinput

console compositor

remoteconsole

remoteframebuffer

Kernel subsystems System components

38Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

Q&A

39Martin Děcký, InstallFest, 5. 3. 2016 Nízkoúrovňové programování

ReferencesReferences

Slide 2Harvard Mark I, © IBM 1944 (cited under fair use doctrine)

Slide 6Tron: Legacy, © Walt Disney Studios Motion Pictures 2010 (cited under fair use doctrine)

Slide 9Data compiled by Jonas Bonér (https://gist.github.com/jboner/2841832), Jeffrey Dean and Peter Norvig; rendering by ayshen (https://github.com/ayshen)

Slide 10Roth A., Martin M.: CIS 371 – Computer Organization and Design, University of Pennsylvania, Department of Computer and Information Science, 2009; data and rendering © Elsevier Science 2003

Slide 11, 12, 13, 33D. A. Patterson, J. L. Hennessy: Computer Organization and Design, Morgan Kaufmann, ISBN 978-0123747501, 2011

top related