Uke 5 - Datamaskin-simulering, Rettigheter, omdirigering

Oppgaver til mandag 27. - fredag 31. jan

  1. (Oblig) Dette er en latch som kan lagre en bit. A er verdien som skal lagres. Hvis B er null(hvit) beholdes verdine som er lagret i latchen. Hvis B er en(rød) overskrives det som er lagret av input fra A.
  2. (Oblig) S0 = 1, S1 = 0 og Ci=0 gir addisjon. S0 = 0, S1 = 0 og Ci=1 gir inkrement, A øker med en.
  3. S0 = 0, S1 = 1 og Ci=0 gir addisjon, load = 1 gjør at resultatet lagres i registeret. Klokken sørger for at ingenting lagres mens beregningen gjøres. Når beregningen er ferdig sørger klokken for at resultatet lagres.
  4. (Oblig) ALU, Arithmetic Logic Unit, er den enheten som utfører aritmetiske (som ADD og SUB) og logiske beregninger(som CMP).
  5. (Oblig) Resultatet blir summen S = 6 og resultatet ligger i registeret R3:
    R3 = 0110 = 6
    
  6. Den største forskjellen er at von Neuman arkitekturen henter både instruksjoner og data fra samme minne-enhet og disse dataene fraktes med den samme bussen(data-kanal). I Harvard arkitekturen er instruksjoner og data lagret i to forskjellige enheter og de fraktes til ALU'en over to forskjellige busser. Den simulerte datamaskinen ligner derfor mest på Harvard arkitekturen, siden data ligger i RAM og instruksjoner ligger i en egen ROM.
  7. (Oblig) Ved å endre verdien som legges i R0 til 2 i første linje, endre siste bit i første byte i ROM til 0, kjører løkka bare to runder. Hvis man så legger til R0 (=2) istedet for R2 (=i) i den andre addisjonen, ender man opp med resultatet, summen S = 4 lagret i R3.
    R0 = 2
    R1 = 1
    R2 = 2
    R3 = 4
    
  8. Følgende assembly-rutine

     
    .globl iftest
    # C-signatur:int iftest ()

    iftest:        # Standard start av funskjon

    #if(R0 != R1){
    #            R2 += R3;
    #         }
    #         else {
    #            R3 += R2;
    #         }

    # %r10 = R0, %r11 = R1, etc.

    mov $2, %r10
    mov $2, %r11
    mov $4, %r12
    mov $5, %r13

    cmp  %r10, %r11 # compare
    jne  different     

    add %r12,%r13    # R3 += R2;

    mov $2, %r10
    mov $1, %r11  # Dermed er de forskjellige
    jne return    # Siden vi ikke har noen jmp instruksjon

    different:
    add %r13,%r12    # R2 += R3;

    return:
    mov %r12,%rax
    ret  # Verdien i rax returneres

    viser hvordan dette i prinsippet kan løses og det kan oversettes linje for linje til vår simuleringsmaskin. Siden man ikke har en JMP-funksjon, må man trikse litt med JNE.
  9. Følgende assembly-rutine

     
    .globl fibo 
    # C-signatur:int fibo ()

    fibo:                # Standard

    # %r10 = R0, %r11 = R1, etc.

    mov   $3, %r12       # 1 -> 1, 2 -> 5, 3 -> 13 ... 
    mov   $1, %r10       # 1 -> r10, første fibonacci-tall
    mov   $1, %r11       # 1 -> r11, siste tall så langt i fibonacci-rekken
    mov   $0, %r13       # 0 -> r13, teller

    # løkke
    start: # label
    add %r11, %r10  # r10 = r10 + r11, r10 er nå siste tall i rekken
    add %r10, %r11  # r11 er nå igjen siste tall i rekken og vi kan hoppe
    inc %r13
    cmp  %r12, %r13 # compare, er r13 lik max?
    jne  start      # Jump Not Equal til start:
     
    mov %r10,%rax  # Skriver ut r10, slik at det blir 13 (21 for stort....)
    ret  # Verdien i rax returneres

    viser hvordan dette kan løses med 4 registere og det kan oversettes linje for linje til vår simuleringsmaskin. I dette tilfellet må rekken stoppe på 13 fordi med bare 4-bit registere er det største tallet som kan representeres 15.
  10. $ whoami
    $ echo $USER
    
  11. $ hostname
    
  12. (Oblig)
    $ uname -a
    
  13. grep haugerud /etc/group
    
    Kommandoen
    groups haugerud
    
    gir alle gruppen direkte. På data2500 er det en forskjell fordi default gruppe (101964) ikke er definert i /etc/group, men i AD sentralt på OsloMet.
  14. Da blir man selv eier av den kopierte filen.
  15. Nei, r, w og x settes uavhengig av hverandre. Men -w-(kun skriverettigheter) brukes i praksis aldri.
  16. Ja, om man har skriverettigheter til katalogen den ligger i, men man får en advarsel og blir spurt først. Det samme gjelder en fil med ingen rettigheter, 000.
  17. $ echo $minvar 
    
    $ echo $DINVAR
    HALLO
    
    Bare DINVAR som er global arves av det nye shellet.
  18. (Oblig) Det er et nytt shell som startes når vari.sh kjøres. Alle variable som ble definert i dette shellet (også de globale) er glemt og borte for godt når vari.sh er ferdig, for da avsluttes shellet scriptet kjørte i.
  19. (Oblig) Svarene kan variere fra gang til gang, men når jeg forsøkte så svarte GPT 3.5 helt feil, at begge variablene ble skrevet ut og GPT 4.0 helt riktig.
  20. (Oblig)
      ps aux | grep $USER | grep jed # Eller pico, nano
      kill ???
    
    hvor ??? er PID til editor-prosessen.
  21. (Oblig)
    OS=$(uname) 
     OS=`uname`# Alternativt
    
  22. PATH="~/bin:$PATH:."
    
    Legger ~/bin først og "." siste i $PATH.
  23. #! /bin/bash
    rm=/bin/rm
    $rm *.bak
    $rm *.BAK
    $rm *%
    $rm \#*
    
  24. basename fjerner path-angivelse fra en fil (eller katalog) og trekker et eventuelt argument vekk fra slutten om det matcher. dirname trekker ut path-angivelsen. Bemerk at de kun ser på argumentene som tekststrenger og at de ikke ser på det virkelige filsystemet.
  25. (Oblig) data2500:~$ find / -name "passwd" 2> /dev/null
  26. #! /bin/bash
    
    echo hallo
    echo "Error!" 1>&2
    
    $ ./err.sh 2> err.txt
    hallo
    $ cat err.txt 
    Error!
    
  27. (Oblig)
        data2500:~$ grep systemd /etc/passwd | wc -l > systemd.txt
    
  28. sort sorterer listen med brukernavn alfabetisk. uniq fjerner identiske linjer, men kun de som kommer etter hverandre, derfor sort først. wc -l returnerer antall linjer.
     ps aux | awk '{print $1}' | sort | uniq | grep -v USER | wc -l 
    Alternativt:
    ps aux | awk '{print $1}' | sort | uniq | wc -l | xargs expr -1 +
    xargs tar imot stdin og utfører "expr -1 + STDIN" hvor STDIN er den input xargs mottotk i stdin.
  29.  data2500:~$ (grep haugerud /etc/passwd;grep haugerud /etc/group) | wc -l
    
    
  30. (Oblig) Et nytt shell startes opp når scriptet starter og i det shellet går man til en annen katalog. Når shellet avsluttes, forsvinner denne endringen. Kjøres scriptet med
     $ source usrbin.bash
    eller
     $ . usrbin.bash
    vil linjene i scriptet tolkes i shellet du allerede kjører i og endringen merkes der.
  31. #!/bin/bash cat /proc/meminfo | grep $1 >> $1.dat
  32. data2500:~/tmp$ tree
    .
    |__ dir2
        |__ dir1
        |   |__ fildir1
        |__ dir3
        |   |__ fildir3
        |__ fildir2
    
    3 directories, 3 files
    
  33. for fil in *.HTML
    do 
       name=`basename $fil .HTML`
       mv $name.HTML $name.html
    done
    
  34. (Oblig)