Skip to content

Hw

과제

  1. 자신의 실험 결과에 대한 write-up 을 쓰세요.

    • 사람은 어떤 학문을 이해하든지 간에 그 학문이 정말로 맞는지 확인하기 위해 자신만의 실험을 하기 마련이다. 특히 컴퓨터 공학은 그러한 실험이 많이 일어나는데 어제의 내용과 오늘의 내용을 이해하기 위해서 자신이 했던 생각이나 의문이나 고민을 write-up 에 작성하고 그 생각과 의문과 고민을 해결하기 위해서 시도했던 실험과 실험 결과를 write-up 에 작성하시오.

    • 아직 감이 잡히지 않은 사람들을 위해 예시를 들어보자.

    // https://github.com/ccss17/test_virt_memory
    #include <stdio.h>
    #include <stdlib.h>
    #include "libkdump.h"
    
    #define R "\033[31m"
    #define G "\033[32m"
    #define B "\033[34;1m"
    #define E "\033[0m"
    
    int data = 5555;
    int bss = 0;
    int bss2;
    
    void text(){ 1+1 == 2; }
    
    int main(int argc, char * argv[]){
        if (argc != 3) {
            fputs(R "Please pass TWO arguments...\n" E , stderr);
            return 1;
        }
        static char * data2 = "twice";
        int stack = 78;
        int stack2 = 23;
        int * heap = (int *)malloc(sizeof(int));
        int * heap2 = (int *)malloc(sizeof(int));
        char * environment_variable = getenv("PATH");
    
        printf("Let's check addresses of each memory section of virtual memory system.\n");
        printf(G"Text  section " E " : " B "%p\n", text);
        printf(G"Data  section " E " : " B "%p\n", &data2);
        printf(G"              " E " : " B "%p\n", &data);
        printf(G"BSS   section " E " : " B "%p\n", &bss);
        printf(G"              " E " : " B "%p\n", &bss2);
        printf(G"Heap  section " E " : " B "%p\n", heap);
        printf(G"              " E " : " B "%p\n", heap2);
        printf(G"Main arg-argc " E " : " B "%p\n", &argc);
        printf(G"Stack section " E " : " B "%p\n", &stack);
        printf(G"              " E " : " B "%p\n", &stack2);
        printf(G"Main arg-argv " E " : " B "%p\n", argv);
        printf(G"     argv[1]  " E " : " B "%p\n", argv[1]);
        printf(G"     argv[2]  " E " : " B "%p\n", argv[2]);
        printf(G"Env variable  " E " : " B "%p\n", environment_variable);
        printf(R "These are Virtual Address\n\n"E);
    
        printf("Let's check physical addresses(Real Address)!\n");
        void * physical_text = libkdump_virt_to_phys((size_t)text);
        if (physical_text == NULL) {
            puts(R "If you want to see physical memory address, reexecute with root privileges!"E);
            return 1;
        }
        printf(G"Text  section " E " : " B "%p\n", physical_text);
        printf(G"Data  section " E " : " B "%p\n", libkdump_virt_to_phys((size_t)&data2));
        printf(G"              " E " : " B "%p\n", libkdump_virt_to_phys((size_t)&data));
        printf(G"BSS   section " E " : " B "%p\n", libkdump_virt_to_phys((size_t)&bss));
        printf(G"              " E " : " B "%p\n", libkdump_virt_to_phys((size_t)&bss2));
        printf(G"Heap  section " E " : " B "%p\n", libkdump_virt_to_phys((size_t)heap));
        printf(G"              " E " : " B "%p\n", libkdump_virt_to_phys((size_t)heap2));
        printf(G"Main arg-argc " E " : " B "%p\n", libkdump_virt_to_phys((size_t)&argc));
        printf(G"Stack section " E " : " B "%p\n", libkdump_virt_to_phys((size_t)&stack));
        printf(G"              " E " : " B "%p\n", libkdump_virt_to_phys((size_t)&stack2));
        printf(G"Main argument " E " : " B "%p\n", libkdump_virt_to_phys((size_t)argv));
        printf(G"     arg-argv " E " : " B "%p\n", libkdump_virt_to_phys((size_t)argv));
        printf(G"     argv[1]  " E " : " B "%p\n", libkdump_virt_to_phys((size_t)argv[1]));
        printf(G"     argv[2]  " E " : " B "%p\n", libkdump_virt_to_phys((size_t)argv[2]));
        printf(G"Env variable  " E " : " B "%p\n", libkdump_virt_to_phys((size_t)environment_variable));
        printf(R "These are real Physical Address\n"E);
        return 0;
    }
    
    • 본문에는 위와 같은 C 프로그램이 있었다. 사실 이 C 프로그램 자체가 내가 메모리 구조에 대한 설명을 듣고 나서 메모리 구조가 정말로 TEXT 영역, DATA 영역, BSS 영역, HEAP 영역, STACK 영역, MAIN 함수의 인자의 순서로 이루어져있는지 확인해 보려고 한 실험의 결과물이다. 나는 컴퓨터가 프로그램을 실행할 때 메모리 구조를 어떻게 할당하는지 의문이 들었고 그 의문과 고민을 해결하기 위해서 저러한 C 프로그램으로 실험을 해본 것이다. 여러분도 어떤 내용에 대해서 의문이 들 수도 있고 좀 더 깊게 이해해보고 싶은 호기심이 생길 수도 있다. 그리고 컴퓨터 공학은 그러한 의문과 호기심이 곧바로 실험으로 연결된다. 직접 본인이 실험해봄으로써 의문을 풀거나 호기심을 해결하는 것이다.

    • 또 다른 예시로써 예를 들어 지난 시간에 알아봤던 괴델의 불완전성 정리에 대한 설명을 듣고 정말로 "참이지만 증명 불가능한 명제가 존재하는지" 알아보고 싶어서 그 정리의 증명에 대해서 좀 더 알아보았고 알아본 결과는 어떠했다 라고 써도 좋다.

    • 너무 거창하게 하려고 하지 않아도 되고 순수하게 자신의 호기심과 의문과 생각을 해결하기 위한 소소한 실험에 대한 결과를 써도 된다. 소소하게 나는 printf 함수가 내부적으로 write 함수를 사용하고 write 함수가 1 번 syscall 을 사용한다는 설명을 듣고 scanf 함수는 내부적으로 어떤 어셈블리어로 구성되어있는지 궁금해졌다. 그래서 알아보았더니 이러이러 했다 와 같은 식으로 써도 좋다.

  • 이 숙제의 예시 1, 2, 3, 4