abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 17:22 | Bezpečnostní upozornění

Byly zveřejněny informace o dvou bezpečnostních chybách CVE-2020-14360 a CVE-2020-25712 v X.Org serveru. Chyby jsou zneužitelné k lokální eskalaci práv (pokud X server běží pod právy roota).

Ladislav Hagara | Komentářů: 5
dnes 16:22 | Nová verze

Byla vydána nová verze 4.0 aplikace pro práci s KeePass databázemi - Password Safe. Přináší zejména plnou podporu Librem 5, PinePhone a dalších linuxových telefonů, dále pak výrazné zrychlení při práci s databází a opravu mnoha chyb. Aplikace je k dispozici na Flathubu, případně jako distribuční balíček.

David Heidelberg | Komentářů: 0
dnes 15:11 | Komunita

Dle plánu bylo spuštěno předobjednávání telefonů PinePhone KDE Community Edition aneb telefonů PinePhone od společnosti PINE64 s předinstalovaným uživatelským rozhraním Plasma Mobile.

Ladislav Hagara | Komentářů: 0
dnes 08:00 | Zajímavý projekt

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2020 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2020. Pro programátory v Perlu je určen Perl Advent Calendar 2020, pro zájemce o kybernetickou bezpečnost Advent of Cyber, …

Ladislav Hagara | Komentářů: 0
dnes 07:00 | IT novinky

Humble Bundle nabízí balík technické literatury z oblasti počítačové bezpečnosti od vydavatelství No Starch Press v digitální podobě bez DRM, a to za zvýhodněnou cenu aspoň cca 1-15 eur. Akce Humble Book Bundle: Hacking 101 by No Starch Press trvá do 21. prosince.

Fluttershy, yay! | Komentářů: 0
včera 23:44 | Nová verze

OpenZFS (Wikipedie) byl vydán ve verzi 2.0.0. Jedná se o implementaci souborového systému ZFS. Nově současně pro Linux i FreeBSD. Doteď se na Linuxu používal ZFS on Linux.

Ladislav Hagara | Komentářů: 2
včera 16:44 | Nová verze

Glen MacArthur vydal AV Linux MX Edition (AVL-MXE) aneb AV Linux (Wikipedie) 2020.11.23. Jedná se o linuxovou distribuci optimalizovanou pro tvůrce audio a video obsahu. Nově založenou na MX Linuxu místo Debianu. Představení na YouTube. Více v pdf manuálu.

Ladislav Hagara | Komentářů: 0
včera 13:55 | IT novinky

Příspěvek na oficiálním blogu Raspberry Pi představuje (YouTube) nový produkt Raspberry Pi 4 Case Fan aneb pětidolarový větráček do oficiální krabičky pro Raspberry Pi 4.

Ladislav Hagara | Komentářů: 8
včera 13:44 | Komunita

Projekt GNOME představil iniciativu GNOME Circle. Cílem iniciativy je podpora nových nezávislých vývojářů a rozšíření ekosystému GNOME o nové aplikace a knihovny.

Ladislav Hagara | Komentářů: 7
včera 13:22 | Nová verze

Byla vydána nová major verze 6.1.0 svobodného softwaru a vysokoúrovňového programovacího jazyka pro numerické výpočty GNU Octave (Wikipedie). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
Jak nakládáte s řetězovými e-maily?
 (6%)
 (41%)
 (3%)
 (2%)
 (3%)
 (9%)
 (57%)
Celkem 318 hlasů
 Komentářů: 8, poslední 16.11. 22:50
Rozcestník

Dotaz: Zapisovanie do pamate

12.8.2019 19:24 mates
Zapisovanie do pamate
Přečteno: 452×
Ahojte potreboval by som v C / C++ daco zapisat na adresu v pamati

V Basicu na to boli funckie

PEEK(ADRESA%) - funkcia precitala hodnotu zo zadanej adresy
POKE ADRESA%, hodnota% - procedura zapisala hodnotu na zadanu adresu ak sme chceli zapisat znak bolo ho potrebne previest na cislo

A k tymto funkciam bola este prikaz:
DEF SEG, ktorym sa prepinali segmenty.

Ako sa tieto funkcie a prikazy volaju v C++ resp C? Alebo vedeli by ste mi poradit ako tento priklad z basicu prepisat do C++?
DIM a%(2)
DEF SEG = VARSEG(a%(0))
FOR i% = 0 TO 2
  READ d%
  POKE VARPTR(a%(0)) + i%, d%
NEXT i%
DATA 205, 5, 203

CALL ABSOLUTE(VARPTR(a%(0)))
DEF SEG

Řešení dotazu:


Odpovědi

12.8.2019 21:33 debian+
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
9 Smerniky

V C neprepinaju pametove segmenty.
xkucf03 avatar 12.8.2019 21:40 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Zapisovanie do pamate

Zapisovat můžeš pomocí funkce outb():

outb(0b00000001, addr);

(celý příklad)

Nebo si ukazatel mířící na dané místo v paměti přetypovat na datový typ, který chceš zapsat a pak normálně přiřadit pomocí =.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
13.8.2019 10:26 R
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
out zapisuje na I/O port, nie do pamati.
13.8.2019 11:45 Rezervní Polská Kotace
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Je sice pravda, že na x86 jsou to oddělené adresní prostory, ale v první řadě by to chtělo vědět, co je cílem tazatele. Dost možná totiž přímo do paměti zapisovat nepotřebuje...
13.8.2019 18:56 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Zapisovanie do pamate

Cílem je kopírovat příklady z Dokumentace QBasicu poplatné reálnému režimu x86.

Ne že by ho jazyk C omezoval v zapisování do paměti. Ale skok na konkrétní adresu už problém bude. Předně C bude očekávat platformě závislou volací konvenci, takže autor bude muset ty tři bajty kódu obalit nějakou hlavičkou. A pak bude muset najít operační systém, který mu dovolí spustit kód z adresy, kam má právo zapisovat. Řada moderních systémů takovému mapování paměti brání. Nehledě na to, že volání BIOSu mu z uživatelského ringu opět fungovat nebude. Ale je docela možné, že tazatel stále používá DOS a jen vyměnil QBasic za C.

13.8.2019 20:07 debian+
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Ako skakanie v Cecku funguje. Pouziva sa goto. Ale nikto ti negarantuje, ze sa neposkodi zasobnik. C je cecko.
Předně C bude očekávat platformě závislou volací konvenci, takže autor bude muset ty tři bajty kódu obalit nějakou hlavičkou. A pak bude muset najít operační systém, který mu dovolí spustit kód z adresy, kam má právo zapisovat. Řada moderních systémů takovému mapování paměti brání. Nehledě na to, že volání BIOSu mu z uživatelského ringu opět fungovat nebude. Ale je docela možné, že tazatel stále používá DOS a jen vyměnil QBasic za C.
Ak on mysli na skok na nejaku funkciu z adresa, da sa to. Zavolat funkciu cez smernik na funkciu. Ale nechod tak LOW ak nemusis a nechod az tak LOW ako pascal resp. assambler. Ano, ma pravdu, ze existuje nejake standart, ako sa predavaju data medzi OS a programom. A je to v C osetrene aj platformove veci - napr. big/little endian. Pokial sa bavime o OS s Linuxom. Ak to zariadenie nema OS. Tak volas funkcie alebo funkcie cez smernik na funkcie, pouzitie goto alebo inline assambler v C.
13.8.2019 20:13 debian+
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Hm, este tu mame setjmp() a longjmp(), pre "goto" nie len v prave lokalnom ("static") .c subore.
Jendа avatar 14.8.2019 01:16 Jendа | skóre: 76 | blog: Výlevníček | JO70FB
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Ale skok na konkrétní adresu už problém bude. Předně C bude očekávat platformě závislou volací konvenci, takže autor bude muset ty tři bajty kódu obalit nějakou hlavičkou.
A pokud se bude chtít vrátit, tak bude muset vědět, co ten kód udělal, a jak po něm uklidit. Ale to mu neporadíme dokud nebudeme vědět o co se snaží.

(pokud to má správnou konvenci tak teoreticky chce udělat to co dělá dlopen/dlsym, ne?)
A pak bude muset najít operační systém, který mu dovolí spustit kód z adresy, kam má právo zapisovat. Řada moderních systémů takovému mapování paměti brání.
AFAIK to jde třeba na Linuxu dost snadno vypnout (viz mprotect) a i takový non-executable stack se teprve nedávno řešil že by měl být všude defaultně zapnutý.
13.8.2019 09:35 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Toto bude prča.

/me clicks "Začni sledovat"
13.8.2019 11:40 Rezervní Polská Kotace
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Co je špatného na tom, že odložil svůj Commodore 64 na půdu a pořídil si modernější systém?
13.8.2019 12:13 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Špatné absolutne nic. Ale občas je zábavné sledovať ľudí zažívajúcich kultúrny šok ;-)
Řešení 1× (xkucf03)
Jendа avatar 13.8.2019 17:06 Jendа | skóre: 76 | blog: Výlevníček | JO70FB
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Příklad z Arduína, zapíše 0x7777 na adresu 0x0300
volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0300;
*bootKeyPtr = 0x7777;
Samozřejmě pokud je to na nějakém operačním systému a ne přímo bare-metal, tak jde o virtuální paměť, kterou tvému programu poskytl operační systém. Pokud chceš přímo zapisovat do fyzické paměti (například máš v paměti namapované nějaké zařízení, které se pomocí zápisů ovládá), musíš si (na Linuxu) zkompilovat podporu pro zařízení /dev/mem. Následně toto zařízení otevřeš, pomocí lseek dojedeš na danou pozici a pomocí read přečteš (případně je možné namapovat kousek tohoto souboru pomocí mmap do tvého virtuálního prostoru a zápisy jsou pak překládány jak by člověk čekal).
15.8.2019 17:31 Jindřich Makovička | skóre: 17
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
Pokud opravdu chcete ekvivalent uvedeného kódu, tak tady. (v DOSu by to mohlo tu obrazovku na tiskárně vyjet, v Linuxu to pochopitelně spadne na segfault)
#include <stdlib.h>

void int5() {
    asm volatile("int $5" : : : "memory");
}


int main(int argc, char **argv) {
    int5();

    return EXIT_SUCCESS;
}
15.8.2019 20:36 debian+
Rozbalit Rozbalit vše Re: Zapisovanie do pamate
gcc pouzi AT/X syntax. Zaujimavostou je, ze mozte v tom asm pouzivat premenne z C prostredia a prekladat ich nahradi, za realne hodnoty pri preklade.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.