====== 1. Seznámení s učebnou, základy reprezentace dat, číselné soustavy a plovoucí řádová čárka ====== * pro vyučující: [[..:..:internal:tutorials:01:start|cvičení 1]] ===== Osnova cvičení ===== - požadavky na zápočet, hodnocení - seznámení s učebnou - základní reprezentace čísel, program v C - výstup binární hodnoty na port hardware ===== Co bych si měl na první cvičení zopakovat / připravit ===== - K přihlášení ke GNU/Linuxu v KN:E-2 se používá Hlavní přístupové heslo (více na stránce {{https://support.dce.felk.cvut.cz/mediawiki/index.php/Hesla_a_jejich_spr%C3%A1va_na_%C4%8CVUT/FEL|o přístupových heslech}} na Wiki IT skupiny) - binární a hexadecimální reprezentace celých čísel čísel - doplňkový kód - operace sčítání, odčítání, násobení a dělení - logické operace s binárními čísly (and, or, rotace, ...) - reprezentace reálných čísel ([[https://en.wikipedia.org/wiki/IEEE_754|IEEE 754]]) ===== Náplň cvičení ===== Cílem cvičení je seznámení s učebnou, zopakování základních pojmů na téma reprezentace dat v počítači. Na cvičení budeme vycházet z následujícího programu v C, který budeme dále modifikovat. Program pro zobrazování reprezentace čísel: /* Simple program to examine how are different data types encoded in memory */ #include /* * The macro determines size of given variable and then * prints individual bytes of the value representation */ #define PRINT_MEM(a) print_mem((unsigned char*)&(a), sizeof(a)) void print_mem(unsigned char *ptr, int size) { int i; printf("address = 0x%016lx\n", (long unsigned int)ptr); for (i = 0; i < size; i++) { printf("0x%02x ", *(ptr+i)); // == printf("0x%02x ", ptr[i]); } printf("\n"); } int main() { /* try for more types: long, float, double, pointer */ unsigned int unsig = 5; int sig = -5; /* Read GNU C Library manual for conversion syntax for other types */ /* https://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html */ printf("value = %d\n", unsig); PRINT_MEM(unsig); printf("\nvalue = %d\n", sig); PRINT_MEM(sig); return 0; } Zdojový kód programu je z počítačů v laboratoři možné zkopírovat z adresáře ''/opt/apo/binrep/print_binrep''. K překladu programu použijte buď přímo příkaz: gcc -Wall -pedantic -o print_binrep ./print_binrep.c nebo přiložený soubor s popisem sestavení (''Makefile'') pro program 'make'. K editaci použijte některý z nainstalovaných editorů (geany, vim, emacs, qtcreator, ...). Pro ty, co nemají vlastní preferenci je vhodné začít třeba s programem [[https://www.geany.org/|geany]]. ==== Úkoly ==== - přeložte a spusťte uvedený program, interpretujte výstupy programu a postupně ho modifikujte tak * aby tiskl vnitřní reprezentaci i jiných datových typů (např. char, float, long, int*) * aby vytiskl tabulku celých čísel čísel včetně jejich reprezentace v rozsahu -16 až 15 * aby realizoval operace sčítání a odčítání dvou proměnných (celá čísla) a vytiskl na obrazovku vstupní operandy a výsledky těchto operací včetně jejich vnitřní reprezentace * vyzkoušejte operace s kladnými i zápornými čísly, zaměřte se i na takové hodnoty, kdy po provedení operace dojde k přetečení - Vyzkoušejte si ručně sčítání a odčítání celých čísel v doplňkovém kódu * demonstrujte výpočet např. 7+6, 7-6 * procvičte výpočet na dalších číslech a s pomocí programu výsledky ověřte * Kdy může dojít k přetečení a jak poznáte, že k němu došlo? - Násobení celých čísel * demonstrujte výpočet např. 7*6 * jak se výpočet změní v případě záporných čísel? např. -7*6, -7*(-6), 7*(-6) * rychlá verze hw násobičky (jak zrychlit opakované sčítání na jedné sčítačce použitím většího množství sčítaček?) - Dělení celých čísel * demonstrujte výpočet např. 42/7, 43/7 * jak se výpočet změní v případě záporných čísel? - Reprezentace reálných čísel (IEEE 754) * binární reprezentace reálných čísel (float - 32bit, double - 64bit) * převeďte na binární reprezentaci číslo -0.75, ověřte správnost s pomocí programu pro zobrazení reprezentace v paměti * převeďte float z binární reprezentace 0xC0A00000 na reálné číslo v desitkové soustavě * demonstrujte výpočet (v desítkové soustavě) 9.999*10^1 + 1.1610*10^(-1), předpokládejte, že je možné uložit pouze 4 cifry čísla a 2 cifry exponentu. * Návod: 1) zarovnání čísel, 2) součet, 3) normalizace, 4) zaokrouhlení * v binární reprezentaci sečtěte čísla 0.5 a -0.4375 * demonstrujte výpočet (v desítkové soustavě) 1.110*10^10 * 9.200*10^(-5) * v binární reprezentaci vynásobte čísla 0.5 a -0.4375 ===== Užitečné odkazy ===== * [[http://support.dce.felk.cvut.cz/pos/cv-langc/|http://support.dce.felk.cvut.cz/pos/cv-langc/]] - Základy jazyka C * [[http://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html|http://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html]] - Dokumentace k řízení formátovaného výstupu pro implementaci **printf** z knihovny funkcí pro jazyk C ([[http://www.gnu.org/software/libc/|GLIBC]]) z projektu [[http://www.gnu.org/|GNU]] * [[https://bootlin.com/doc/legacy/command-line/command_memento.pdf|Základní příkazy pro práci v příkazové řádce]] na [[https://bootlin.com/|Bootlin]] * Materiál k IEEE 754: {{courses:B35APO:tutorials:02:apo2.pdf|}} * Popis form8tu IEEE 754 na [[https://en.wikipedia.org/wiki/IEEE_754|Wikipedii]] * [[https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgcc/fp-bit.c]] - implementace operací v plovoucí řádové čárce s využitím operací v pevné řádové čárce tak v knihovně kompilátoru [[http://gcc.gnu.org|GCC]] pro procesory, které hardwarovou implementací operací nedisponují. ===== Domácí úkoly ===== * domácí úkoly 1 až 4 budou zadané a odevzdávané elektronickou formou * vstup k zadání a odevzdání úkolů je přes adresu [[https://dcenet.felk.cvut.cz/apo/|https://dcenet.felk.cvut.cz/apo/]] * Na stránce "Assignments" naleznete seznam zadaných úkolů * Pro vyzkoušení práce s odevzdávacím systémem je k dispozici nehodnocená varianta prvního úkolu **1st training homework** * Případnými problémy s odevzdávacím systémem se obracejte na svého cvičícího nebo přímo na autora/správce sytému [[courses:b35apo:teacher:susta:start|Richarda Šustu]] ===== Počítačová síť v učebně KN:E-2 ===== Učebna KN:E-2 je vybavena počítači se síťovou instalací operačního systému [[https://www.debian.org/|Debian]] GNU/Linux Jessie. Po zapnutí počítače je zaveden z lokálního serveru přes PXE zavaděč PXElinux. Ten umožňuje volit * boot z lokálního disku stanice (nebudeme používat) * volba ''DCE 4.9 stretch app'' spuštění síťové verze operačního systému [[http://www.debian.org/|Debian Stretch]] Volba menu zajistí natažení image jádra GNU/Linux a počátečního RAM-disku ze sítě s využitím protokolu TFTP. Po spuštění jádra je připojen přes NFS kořenový svazek. Ten je ale připojen jen v režimu pro čtení. Pro dočasné uložení lokálních změn je pak nad tuto adresářovou strukturu namapovaný souborový systém pro dočasné uložení lokálních změn. Jedná se buď o modul [[https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/overlayfs.txt|Overlayfs]] (dříve se používal [[http://aufs.sourceforge.net/|AUFS]]). Pro ověření přihlašovacích údajů se používá systém Kerberos a ověřuje se proti hlavnímu ČVUT heslo. Po úspěšném přihlášení je pak do adresářové struktury stanice připojen přes NFS svazek s uživatelským kontem, ke kterému má uživatel práva pro čtení a zápis. Další informace o použitém řešení lze nalézt na stránce Wiki [[https://support.dce.felk.cvut.cz/mediawiki/index.php/Jak_vytvo%C5%99it_bezdiskov%C3%BD_stroj_s_opera%C4%8Dn%C3%ADm_syst%C3%A9mem_GNU/Linux|Jak vytvořit bezdiskový stroj s operačním systémem GNU/Linux]]. Dále jsou k dispozici slide [[http://cmp.felk.cvut.cz/~pisa/linux/diskless/diskless_dce_slides.pdf|DiskLess Debian/GNU Linux]] z prezentace našeho řešení na konferenci/akci [[http://installfest.cz/|Install Fest]]. ===== Studentská konta a hesla ===== Pro ověření oprávnění k přístupu do systému a se používá centrální ČVUT/FEL heslo. ===== Vzdálený přístup k datům na uživatelských kontech ===== Kromě místnosti KN:E-2 je prostředí dostupné v místnosti KN:E-s109 a na externě přístupném serveru postel.felk.cvut.cz přes SSH spojení. Pro přenos souborů lze pak použít příkaz SCP případně jiné klienty podporující SCP/SFTP protokol. Konto si lze připojit do vlastního GNU/Linux systému přes utilitu sshfs, např.: sshfs jmeno@postel.felk.cvut.cz: /mnt/tmp Odpojení konta se dá provést příkazem: fusermount -u /mnt/tmp Server nabízí i vzdálené připojení k na něm spouštěným grafickým aplikacím ssh -X jmeno@postel.felk.cvut.cz Poznámka: Jméno nebylo zvoleno pouze z důvodu pohodlného přístupu z pohodlí domova, ale je především připomínkou jedné z klíčových osobností počítačové sítě Internet - [[http://en.wikipedia.org/wiki/Jon_Postel|Jona Postela]]. ===== Řešení problémů s konty, obnova dat ===== V případě problémů s instalací GNU/Linxu kontaktuje Aleše Kapicu ze skupiny IT (http://support.dce.felk.cvut.cz/mediawiki/index.php/IT_kontakty) případně další kolegy ze skupiny IT, kteří mají správu hardware a sítí ne jen v KN:E-2 na starosti.