CS

    SystemSoftware - Creating Processes #1

    SystemSoftware - Creating Processes #1

    OS에서 process를 만드는 방식에 대해서 알아보자 process는 fork()라는 syscall을 통해서 child process를 생성한다. fork를 호출한 process가 parent process가 되고, 새로 생긴 process가 child가 process이다. int fork(void) return을 2번 한다. parent에서 fork를 호출하면 child에서 return 하고 parent에서도 return 한다. 이때 return 값에 따라서 parent인지 child인지를 구분할 수 있다. 0을 return 하면 child이고, child의 PID를 return 하면 parent이다. child는 parent의 모든 부분이 복제되어 생성된다. (가상 주소, parent에서 open ..

    SystemSoftware - Exceptional Control Flow #2

    SystemSoftware - Exceptional Control Flow #2

    SystemSoftware - Exceptional Control Flow #1 예외상황(예외처리)에 관해서 알아보자 예외 상황 : Segmentation Fault, Hardware Interrupt 등을 예외 상황이라고 한다 CPU는 명령어 주소에 있는 레지스터에 적혀있는 메모리에 가서 명령을 수행하고, 다 hyeo-noo.tistory.com 이전 포스팅에 이어서 Process와 context switch에 대해서 알아보자 Process : 실행중인 Program에서의 instace (Program : class, Process : object 라고 하기도 한다) Process의 추상화를위한 2개의 중요한 key 가 있다. 1. Logical control flow : 각각의 program이 cpu..

    SystemSoftware - Exceptional Control Flow #1

    SystemSoftware - Exceptional Control Flow #1

    예외상황(예외처리)에 관해서 알아보자 예외 상황 : Segmentation Fault, Hardware Interrupt 등을 예외 상황이라고 한다 CPU는 명령어 주소에 있는 레지스터에 적혀있는 메모리에 가서 명령을 수행하고, 다음 명령어를 받고 메모리에 가서 명령을 수행하는 반복적인 작업을 컴퓨터가 꺼질 때까지 반복한다. 이러한 시퀀스를 Control Flow라고 한다. 일반적으로 코드는 연속적으로 실행된다. 하지만 jump와 branch 같은 제어문(if, for loop)을 통해서 control flow를 바꿀 수 있다. 그리고 함수 호출을 통해서도 control flow를 제어할 수 있다. 하지만 위와 같이 일반적으로 제어할 수 없는 부분(system 상태의 변화)이 존재한다. 하드디스크, 네트..

    [XV-6 운영체제] Copy-on-Write #2  구현

    [XV-6 운영체제] Copy-on-Write #2 구현

    [XV-6 운영체제] Copy-on-Write #1 Copy-on-Write가 어떤 기능을 하는지 알아보자 Copy on Write는 기본적으로 forks 기능과 관련이 있다. forks는 parent process를 이용해서 child process를 만들어 내는 것으로 볼 수 있다. (기본적으로 복제를.. hyeo-noo.tistory.com 이전 포스팅인 Copy-on-Write에 대한 설명에 이어서 Copy-on-Write를 구현해 보겠다. 1. vm.c 수정 page table entry(PTE)에 writeable flag(PTE_W)를 disable (read-only 상태로 만들어준다) 새로운 page 할당없이 parent process의 page를 child process의 mapping..

    [XV-6 운영체제] Copy-on-Write #1

    [XV-6 운영체제] Copy-on-Write #1

    Copy-on-Write가 어떤 기능을 하는지 알아보자 Copy on Write는 기본적으로 forks 기능과 관련이 있다. forks는 parent process를 이용해서 child process를 만들어 내는 것으로 볼 수 있다. (기본적으로 부모 프로세스를 복제함) 대부분의 자식 프로세스들은 이후에 exec을 이용해서 새로운 process로 Overwite한다. 그러면 부모로부터 복사해온 페이지들은 다 쓸모없는 것들이 되고 만다. 복사를 하고 바로 exec을 통해서 새로운 process를 만들어 낼 텐데 굳이 복사를 할 필요가 있는가? 라는 의문에 의해서 탄생한 것이 Copy on Write 라는 방법이다. Copy on Write : parent process의 이미지를 child에 복사하지 않..

    [컴퓨터 구조] ILP & Superscalar

    [컴퓨터 구조] ILP & Superscalar

    ILP : Instrction Level Parallelism ILP의 2가지 방법 Superscalar : 1 Cycle 동안에 서로 다른 독립적인 2개의 연산을 동시에 수행하는 기술이다. Superpipeline : 한 클럭을 2개로 나누고, 나누어진 클럭에서 각각 서로 다른 연산을 수행하는 기술이다. ILP실행의 한계점 1. True Data Dependency ADD의 r1과 MOVE의 r1은 서로 의존적이다. pipeline에서의 타이밍을 맞추지 못하면 MOVE에서 잘못된 r1값(add가 되기 전의 r1)을 받아서 틀린 연산 결과를 낼 수 있다. 2. Procedural Dependancy if(~) ... else(~) ... 위와 같은 branch가 있을 때 branch이전과 branch 이..

    SystemSoftware - Linking #2

    SystemSoftware - Linking #2

    SystemSoftware - Linking #1 컴파일된 object 파일들을 linking해서 exe파일로 만드는 과정에서 어떤 일들이 일어나는지 알아보자 // main.c int sum(int *a, int n) int array[2] = {1, 2} int main(){ int val = sum(array, 2); return val;.. hyeo-noo.tistory.com 지난 글에 이어서 Linking을 하는 2가지 방법에 대해서 알아보자 다 쓰고 파일 날아가서 다시 씀 일반적으로 사용하는 함수의 Packaging 모든 함수를 하나의 source file에 넣는경우 : 공간과 시간측면에서 비효율적임 각각의 함수마다 나누어진 source file에 넣는 경우 : 효율적 Static librar..

    [컴퓨터 구조] RISC (feat. CISC)

    [컴퓨터 구조] RISC (feat. CISC)

    CICS구조를 비교 모델로 삼아 RISC구조에 대해서 알아보자. RISC(Reduced Instruction Set Computer) - 명령어가 축약된 컴퓨터 명령어 set이 매우 짧고 심플하다 CISC에 비해서 레지스터의 수가 매우 많다 (CISC : 8~16, RISC : 32~520) 소프트웨어적인 기술의 중요성이 크다 (컴파일러의 역할 증가(레지스터 최적화)) 명령어의 개수 : 60~100 (CISC : 200~300) 명령어의 크기 : 4 (CISC : 1 ~ 60) addressing mode : 1 (레지스터를 사용) (CISC : 4 ~ 22) CISC(Complex Instruction Set Computer)가 나오게 된 이유, 장점 과거에는 소프트웨어보다 하드웨어 기술이 상대적으로 ..

    SystemSoftware - Linking #1

    SystemSoftware - Linking #1

    컴파일된 object 파일들을 linking해서 exe파일로 만드는 과정에서 어떤 일들이 일어나는지 알아보자 // main.c int sum(int *a, int n) int array[2] = {1, 2} int main(){ int val = sum(array, 2); return val; } // sum.c int sum(int *a, int n){ int i, s = 0; for(i = 0; i < n; i++){ s += a[i]; } return s; } main.c의 sum 함수는 어떤 과정을 통해서 sum.c의 sum 함수를 불러와서 기능을 수행할 수 있을까? 위와 같이 여러 개로 이루어진 파일들을 연결하는 과정을 Linking이라고 한다. 먼저 cpp(C Pre-Processor 전처리)..

    Attack Lab Solution  Phase_1 ~ Phase_5

    Attack Lab Solution Phase_1 ~ Phase_5

    - Code Injection Attacks : CTARGET %rsp를 0x38 만큼 빼주는 것으로 보아 buffer의 크기는 0x38bytes임을 알 수 있습니다. Phase1은 touch1을 호출만 하면 되므로 입력에 0x38bytes 만큼 dummy값을 준 후 touch1함수가 존재하는 주소인 40 18 c5 값을 리틀-엔디안 방식으로 입력해주었습니다. Answer : - Code Injection Attacks : CTARGET Touch2를 실행하고 %edi값과 Cookie값을 비교해서 같은 경우에 통과합니다. Touch2함수를 실행하기 전에 %rdi 레지스터에 Cookie값을 넣어주고 Touch2 함수를 실행해야 합니다. Buffer공간을 0x38만큼 할당 받은 후의 %rsp위치를 보니 0x..