Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Programujeme v jazyce Assembler v Linuxu: Úvod

Můj článek se zabývá programováním v nízkoúrovňovém jazyce Assembler v Linuxu pro znalé tohoto jazyka. Pokusím se zde popsat možnosti, které nám Linux nabízí, a vlastnosti překladače NASM, volání systému a odlaďování aplikací, a také to, že Tux umí Assembler:).

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Můj článek se zabývá programováním v nízkoúrovňovém jazyce Assembler v Linuxu pro znalé tohoto jazyka. Pokusím se zde popsat možnosti, které nám Linux nabízí, a vlastnosti překladače NASM, volání systému a odlaďování aplikací, a také to, že Tux umí Assembler:).

Předpokládejme tedy, že jste seznámeni s programováním v Assembleru nebo jste již pár programů vytvořili, zde jsou možnosti, jak v něm vytvořit efektivní programy pro Linux a využít jeho možnosti.

V prvním dílu tohoto seriálu se seznámíme s uspořádáním paměti procesu, předáváním argumentů příkazové řádky a voláním operačního systému.

Jak to tam uvnitř vypadá – uspořádání paměti procesoru

Linux jako víceprocesový (multitaskingový) operační systém, jehož jádro je z největší části napsáno v jazyce C, ale obsahuje i části psané v Assembleru, používá 32bitový systém adresování paměti. Díky této vlastnosti máme k dispozici 4 GB adresového prostoru pro každý proces v něm běžící. Tyto procesy „nevidí“ jádro, protože to je všem procesům skryto, a „nepoflakuje“ se v jejich paměti. To z důvodů bezpečnosti, jeden proces totiž neovlivňuje druhý. Tudíž havárie jednoho programu neshodí jiný běžící program nebo celý systém. Proces je zcela samostatný ve svém vlastním prostoru, který má k dispozici pouze pro sebe.

Tedy prostor pro náš program je veliký, je osamocen ve 4GB prostoru. Programy se skládají z několika segmentů (sekcí), Linux však podporuje mnoho formátů spustitelných souborů, my se zaměříme třeba na formát ELF – executable and linkable format. Pořadí načítání sekcí se u růzých spustitelných formátů může velmi lišit, některé formáty jsou si podobné, jiné jsou však zcela odlišné. Program bez dynamicky vázaných knihoven tedy bude spuštěn po svých částech v tomto pořadí.

Adresa 0×08048000

Tabulka č. 575
Spustitelný kód ;kód našeho programu, to co se má vykonat
Statická data ;data, která nebudou změněna
Dynamická (heap) data  
Volný prostor  
Zásobník ;zásobník dat, k jeho využití použijeme instrukci POP

Adresa 0×BFFFFFFF       hranice 4 GB

Program obvykle bývá nahrán do 128 MB adresového prostoru. Program se do paměti stránkuje (to znamená, že v paměti existuje právě jedna stránka programu). Další stránky jsou nahrány až po uvolnění té první, ve chvíli, kdy jsou zapotřebí. Původní stránka zcela z paměti mizí, části programu, které při jeho spuštění nebudou použity, se v paměti nikdy neobjeví. V programu samotném tyto sekce nejsou fyzicky odděleny, jsou rozdělovány až během zavádění programu do paměti. Na disku se jedná pouze o jeden kompletní a ucelený soubor.

Má-li program dynamicky zaváděné knihovny (linked libraries), budou jejich moduly nahrávány do stejného adresového prostoru, ale jejich adresy budou v pozici nad 1 GB a výše. V prostoru 3 GB, která nám zbývají do zásobníku, je volná pamět patřící procesu, ale ta není stránkovaná (nemá přiděleny žádné stránky). Když program zapíše na nealokované místo, bude proces ukončen (SIGKILL kernelu). Jedná se o velmi závažnou chybu, které bychom se jako programátoři měli vyvarovat. Program s touto chybou nikdy nebude proveden do svého konce, takže je zcela neužitečný, avšak důvodů k této chybě je více, podrobněji se budeme problematice chyb věnovat v nějakém z dalších dílů v sekci odlaďování programů. Pro přidělení dynamického stránkování pro data se musí jádro požádat, to ji pak přidělí, o tom si povíme později.

Kdepak to vše leží – předávání argumentů příkazove řádky

Proces je tedy naprosto sám ve své paměti, jak ale k němu dostat parametry a argumenty příkazové řádky nebo proměnné prostředí? Najdeme je na vrcholu zásobníku, který vypadá takto:

Tabulka č. 576
argc počet parametrů (dword)
argv[0] pointer na název programu
argv[1] … argv[argc-1] pointery na parametry programu
NULL konec pointerů parametrů
env[x] x=(0;n)
NULL konec pointerů na prostředí

Použití těchto parametrů se provádí přes instrukci POP pro výběr dat ze zásobníku. Nezapomeňme však, že zásobník používá metodu LIFO (last in first out), to znamená, že to, co do něj přijde jako poslední, jde ven jako první. Doporučuji jako první ze zásobníku přečíst počet parametrů (argc).

První pointer bude obsahovat jméno našeho programu, ostatní pointery, s hodnotou argc větší než 1, budou obsahovat další pointery uložené v zásobníku.

Haló, vy tam – volání operačního systému

Pro systémová volání se v Linuxu používá přerušení int 0×80. Řekněme si jak se dovolat jádra z našeho programu. Při provedení instrukce int 0×80 se změní hodnota segmentového registru a začne běžet jaderný kód. Po jeho skončení se normálně pokračuje ve vykonávání našeho programu, jakoby se nechumelilo :).

Parametry jednotlivých systémových volání (syscalls) se předávají v registrech. Každá služba má své číslo, toto číslo se předává v registru EAX. Parametr této služby, pokud nějaký má, se předává v registru EBX, další parametr je předán pomocí registru ECX a další pomocí, můžete hádat, pokud jste hádali EDX, tak jste hádali správně:). Parametry služby se tedy předávají v pevně stanovených registrech. Od jádra 2.4.0 se poslední parametr předává v registru EBP.

TIB2012

       

Závěrem

Dnes jsme si ukázali pár základních věcí o vlastnostech a chování aplikace ve formátu spustitelného souboru ELF v Linuxu a o jeho paměti a registru, ze kterého umíme vybrat důležité informace. Příště budeme pokračovat o něco dále a povíme si více o chybových kódech a o tom, kde najít více informací o nich, napíšeme si jednoduchý program a povíme si, co jsou to ASMUTILS.

Doufám, že se vám tento článek líbil a přečtete si i jeho pokračování, které nebude již tolik teoretické, vneseme do něj více praxe a ukázek:).

Školení: Pokročilejší kurz jazyka Java

Java je multiplatformní programovací jazyk, který vytvořila a vyvíjí společnost Sun. Java je silný, objektově orientovaný jazyk se širokou komunitou, nabízející především vysokou produktivitu vývoje.

  • Práce s řetězci
  • Regulární výrazy
  • Kolekce
  • Generiky
  • Smyčka typu "for" ve verzi Java 1.5
  • Výčty
  • Vlákna, synchronizace
  • Polymorfismus, RTTI
  • Java Beany
  • JDBC (práce s databázemi)
  • GUI (knihovny AWT a Swing)
  • Java na serveru (servlety, JSP)

Podrobnější informace a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 2,95

Přehled názorů

par dotazov
abc 1. 7. 2004 08:07
Nový
├ 
Re: par dotazov
hkmaly 1. 7. 2004 18:04
Nový
├ 
Re: par dotazov
Clock 2. 7. 2004 11:44
Nový
└ 
Re: par dotazov
Valery 16. 2. 2008 15:33
Nový
^souhlas^
Martin 1. 7. 2004 08:20
Nový
└ 
Re: ^souhlas^
Martin Podhola 1. 7. 2004 21:20
Nový
assembler pre powerpc na mac os x
QWERTZ 1. 7. 2004 08:23
Nový
└ 
Re: assembler pre powerpc na mac os x
Michal Ludvig 1. 7. 2004 11:44
Nový
 
└ 
Re: assembler pre powerpc na mac os x
QWERTZ 1. 7. 2004 15:34
Nový
 
 
└ 
Re: assembler pre powerpc na mac os x
Michal Ludvig 1. 7. 2004 15:36
Nový
 
 
 
└ 
Re: assembler pre powerpc na mac os x
hkmaly 1. 7. 2004 18:09
Nový
 
 
 
 
├ 
Re: assembler pre powerpc na mac os x
Michal Ludvig 1. 7. 2004 21:47
Nový
 
 
 
 
│
└ 
Re: assembler pre powerpc na mac os x
hkmaly 2. 7. 2004 15:37
Nový
 
 
 
 
└ 
Re: assembler pre powerpc na mac os x
QWERTZ 2. 7. 2004 10:44
Nový
vcelku fajn
MiKRO 1. 7. 2004 09:05
Nový
├ 
Re: vcelku fajn
huhla 1. 7. 2004 11:54
Nový
├ 
Re: vcelku fajn
panHo 1. 7. 2004 14:02
Nový
│
└ 
Re: vcelku fajn
hkmaly 1. 7. 2004 18:10
Nový
└ 
Re: vcelku fajn
Rejpal 7. 7. 2004 09:47
Nový
ako je to v C?
xy 1. 7. 2004 09:19
Nový
└ 
Re: ako je to v C?
Martin Podhola 1. 7. 2004 21:24
Nový
k pripominkam (obrazky, slovicka...)
Milan 1. 7. 2004 10:01
Nový
Jak je to s tím stránkováním?
Atom 1. 7. 2004 10:05
Nový
├ 
Re: Jak je to s tím stránkováním?
Michal Ludvig 1. 7. 2004 11:34
Nový
│
├ 
Re: Jak je to s tím stránkováním?
hkmaly 1. 7. 2004 18:16
Nový
│
└ 
Stránkování a kernel
anonymní uživatel 30. 7. 2004 18:18
Nový
└ 
Re: Jak je to s tím stránkováním?
hkmaly 1. 7. 2004 18:23
Nový
MMX a SSE instrukce
Jiri Hnidek 1. 7. 2004 10:35
Nový
├ 
Re: MMX a SSE instrukce
Michal Ludvig 1. 7. 2004 11:38
Nový
│
└ 
Re: MMX a SSE instrukce
Mikulas Patocka 2. 7. 2004 03:33
Nový
│
 
└ 
Re: MMX a SSE instrukce
Clock 2. 7. 2004 11:41
Nový
├ 
Re: MMX a SSE instrukce
x0rph 1. 7. 2004 16:18
Nový
└ 
Re: MMX a SSE instrukce
Martin Podhola 1. 7. 2004 21:28
Nový
syntaxe
Pat 1. 7. 2004 11:18
Nový
└ 
Re: syntaxe
Martin Podhola 1. 7. 2004 21:31
Nový
 
└ 
Re: syntaxe
hkmaly 1. 7. 2004 21:36
Nový
 
 
└ 
Re: syntaxe
anonymní uživatel 2. 7. 2004 16:51
Nový
Par pripominek
Michal Ludvig 1. 7. 2004 12:00
Nový
├ 
Re: Par pripominek
polish 1. 7. 2004 13:07
Nový
│
└ 
Re: Par pripominek
Martin Podhola 1. 7. 2004 21:33
Nový
├ 
Re: Par pripominek
Mark 1. 7. 2004 17:18
Nový
├ 
Re: Par pripominek
ondrej 1. 7. 2004 19:03
Nový
│
├ 
Re: Par pripominek
hkmaly 1. 7. 2004 21:39
Nový
│
│
├ 
Re: Par pripominek
Michal Ludvig 1. 7. 2004 22:03
Nový
│
│
│
└ 
Re: Par pripominek
hkmaly 2. 7. 2004 15:42
Nový
│
│
└ 
Re: Par pripominek
Ivona Prenosilova 1. 7. 2004 23:33
Nový
│
│
 
└ 
guard pages
Mikulas Patocka 2. 7. 2004 03:23
Nový
│
│
 
 
└ 
Re: guard pages
Ivona Prenosilova 2. 7. 2004 14:42
Nový
│
│
 
 
 
├ 
Re: guard pages
Mikulas Patocka 2. 7. 2004 15:00
Nový
│
│
 
 
 
├ 
velikost zasobniku
Mikulas Patocka 2. 7. 2004 15:04
Nový
│
│
 
 
 
└ 
Re: guard pages
kvr 2. 7. 2004 17:02
Nový
│
└ 
Re: Par pripominek
Michal Ludvig 1. 7. 2004 21:59
Nový
└ 
Re: Par pripominek
Zdenek 23. 7. 2004 10:20
Nový
.
Ivona Prenosilova 1. 7. 2004 14:10
Nový
├ 
Re: .
Michal Ludvig 1. 7. 2004 16:15
Nový
│
└ 
Re: .
hkmaly 1. 7. 2004 18:22
Nový
├ 
Re: .
David Belohrad 1. 7. 2004 18:15
Nový
│
├ 
Naprostý souhlas s Davidem
Vladimír Stwora 1. 7. 2004 19:34
Nový
│
│
├ 
Re: Naprosty souhlas s Davidem
neologism 1. 7. 2004 21:20
Nový
│
│
│
├ 
Re: Naprosty souhlas s Davidem
David Belohrad 2. 7. 2004 13:59
Nový
│
│
│
├ 
Re: Naprosty souhlas s Davidem
Zedik 4. 7. 2004 01:30
Nový
│
│
│
├ 
Re: neologism
vtech 6. 7. 2004 23:23
Nový
│
│
│
└ 
Re: Naprosty souhlas s Davidem
alobal 12. 7. 2004 17:38
Nový
│
│
└ 
Re: Naprostý souhlas s Davidem
Clock 2. 7. 2004 11:56
Nový
│
│
 
├ 
Re: Naprosty souhlas s Davidem
Mikulas Patocka 2. 7. 2004 14:54
Nový
│
│
 
└ 
Re: Naprostý souhlas s Davidem
QWERTZ 6. 7. 2004 09:36
Nový
│
├ 
Re: .
Martin Podhola 1. 7. 2004 21:37
Nový
│
├ 
Re: .
hkmaly 1. 7. 2004 21:44
Nový
│
│
└ 
Re: .
Tomas Zellerin 2. 7. 2004 09:34
Nový
│
├ 
Re: .
Ivona Prenosilova 1. 7. 2004 23:19
Nový
│
│
├ 
Re: .
OldFrog 2. 7. 2004 09:08
Nový
│
│
├ 
Re: .
David Belohrad 2. 7. 2004 14:23
Nový
│
│
│
└ 
Re: .
Ivona Prenosilova 2. 7. 2004 14:52
Nový
│
│
│
 
└ 
Re: .
David Belohrad 2. 7. 2004 20:29
Nový
│
│
└ 
Re: .
anonymní uživatel 6. 7. 2004 09:40
Nový
│
└ 
Re: .
Atom 2. 7. 2004 11:07
Nový
└ 
Re: .
Mikuláš Patočka 1. 7. 2004 18:42
Nový
 
├ 
Re: .
Ivona Prenosilova 1. 7. 2004 23:27
Nový
 
│
├ 
Re: .
Mikulas Patocka 2. 7. 2004 03:38
Nový
 
│
│
├ 
Re: .
Ivona Prenosilova 2. 7. 2004 15:32
Nový
 
│
│
└ 
Re: .
kvr 2. 7. 2004 17:13
Nový
 
│
└ 
Re: .
hkmaly 2. 7. 2004 15:49
Nový
 
│
 
└ 
Re: .
Ivona Prenosilova 2. 7. 2004 16:16
Nový
 
└ 
Re: .
Zdenek 23. 7. 2004 11:15
Nový
Obsah zasobniku
hkmaly 1. 7. 2004 18:28
Nový
└ 
Re: Obsah zasobniku
Mikuláš Patočka 1. 7. 2004 18:44
Nový
 
└ 
Re: Obsah zasobniku
hkmaly 1. 7. 2004 21:53
Nový
prace s pameti
drb 5. 7. 2004 11:33
Nový
*&^
anonymní uživatel 28. 10. 2007 12:57
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem