View
7
Download
0
Category
Preview:
Citation preview
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
Recommended