+ All Categories
Home > Technology > Nízkoúrovňové programování

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

Date post: 16-Feb-2017
Category:
Upload: martin-decky
View: 307 times
Download: 1 times
Share this document with a friend
39
http://d3s.mff.cuni.cz Marn Děcký [email protected] CHARLES UNIVERSITY IN PRAGUE Faculty of Mathemacs and Physics Faculty of Mathemacs and Physics Nízkoúrovňové programování Nízkoúrovňové programování
Transcript
Page 1: Nízkoúrovňové programování

http://d3s.mff.cuni.cz

Martin Děcký

[email protected]

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í

Page 2: 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

Page 3: Nízkoúrovňové programování

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

Page 4: Nízkoúrovňové programování

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

Page 5: Nízkoúrovňové programování

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!♯

Page 6: Nízkoúrovňové programování
Page 7: Nízkoúrovňové programování

Procesor

C++

Strojový kód

Assembler

Firmware / Operační systém

JVM / CLR

Java / .NET

Komponentový systém

Aplikační framework

C

Page 8: Nízkoúrovňové programování

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

Page 9: Nízkoúrovňové programování
Page 10: Nízkoúrovňové programování

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

Page 11: Nízkoúrovňové programování

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

Page 12: Nízkoúrovňové programování

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

Page 13: Nízkoúrovňové programování

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

Page 14: Nízkoúrovňové programování

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)

Page 15: Nízkoúrovňové programování

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

....

Page 16: Nízkoúrovňové programování

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(...);...

Page 17: Nízkoúrovňové programování

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

Page 18: Nízkoúrovňové programování

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(...);...

Page 19: Nízkoúrovňové programování

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)...

Page 20: Nízkoúrovňové programování

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)...

Page 21: Nízkoúrovňové programování

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...

Page 22: Nízkoúrovňové programování

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)

Page 23: Nízkoúrovňové programování

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

Page 24: Nízkoúrovňové programování

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

Page 25: Nízkoúrovňové programování

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

Page 26: Nízkoúrovňové programování

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

Page 27: Nízkoúrovňové programování

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

Page 28: Nízkoúrovňové programování

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

Page 29: Nízkoúrovňové programování

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

Page 30: Nízkoúrovňové programování

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_)

Page 31: Nízkoúrovňové programování

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

Page 32: Nízkoúrovňové programování

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)

Page 33: Nízkoúrovňové programování

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

Page 34: Nízkoúrovňové programování
Page 35: Nízkoúrovňové programování

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

Page 36: Nízkoúrovňové programování
Page 37: Nízkoúrovňové programování

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

Page 38: Nízkoúrovňové programování

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

Q&A

Page 39: Nízkoúrovňové programování

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


Recommended