[컴퓨터 시스템 02] 1장. hello, world
1. 정보는 비트와 컨텍스트로 이루어진다.
// hello.c
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
- 소스 프로그램은 0 또는 1로 표시 되는 비트들의 연속이며, 바이트라는 8비트 단위로 구성 됨.
- 각 바이트는 프로그램의 텍스트 문자를 나타냄.
- 대부분의 컴퓨터 시스템은 텍스트 문자를 아스키(ASCII) 표준을 사용하여 표시함.
- 아스키 표준은 각 문자를 바이트 길이의 정수 값으로 나타냄.
- 프로그램은 연속된 바이트들로 파일에 저장됨.
- 각 바이트는 특정 문자에 대응되는 정수 값을 갖음.
- 오로지 아스키 문자들로만 이루어진 파일들은 텍스트 파일이라고 부름. 다른 모든 파일들은 바이너리 파일이라고 함.
- 모든 시스템 내부의 정보-디스크 파일, 메모리상의 프로그램, 데이터, 네트워크를 통해 전송되는 데이터는 비트들로 표시됨.
- 서로 다른 객체들을 구분하는 유일한 방법은 이들을 바라보는 컨텍스트에 의해서임.
❗참고
컨텍스트란?
어떤 객체를 핸들링하기 위한 접근 수단
2. 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.
- hello.c를 시스템에서 실행시키려면, 각 C문장들은 다른 프로그램들에 의해 저급 기계어 인스트럭션들로 번역되어야 한다.
- 인스트럭션들은 실행가능 목적 프로그램이라고 하는 형태로 합쳐져서 바이너리 디스크 파일로 저장됨.
- 컴파일러 드라이버는 유닉스 시스템에서 다음과 같이 소스파일에서 오브젝트 파일로 번역함.
linux> gcc -o hello hello.c
- 여기서 GCC 컴파일러 드라이버는 소스파일 hello.c를 읽어서 실행파일인 hello로 번역
hello.c hello.i hello.s hello.o hello
-------->전처리기-------->컴파일러-------->어셈블러-------->링커-------->
전처리 단계
전처기(cpp)는 본래의 C프로그램의 #문자로 시작하는 디렉티브에 따라 수정. .i로 끝나는 새로운 C 프로그램이 생성컴파일 단계
컴파일러(ccl)는 텍스트 파일 hello.i를 텍스트파일인 hello.s로 번역하며, 어셈블리어 프로그램이 저장됨. 다음과 같은 main 함수의 정의를 포함함.
1 main:
2 subq $8, %rsp
3 movl $.LC0, %edi
4 call puts
5 movl $0, %eax
6 addq $8, %rsp
7 ret
2~7줄에서는 한 개의 저수준 기계어 명령어를 텍스트 형태로 나타내고 있다. 어셈블리어는 여러 상위수준 언어의 컴파일러들을 위한 공통의 출력언어를 제공하기 때문에 유용
어셈블리 단계
엄셈블러(as)가 hello.s를 기계어 인스트럭션으로 번역하고, 이들을 재배치가능 목적프로그램의 형태로 묶어서 hello.o라는 목적파일에 그 결과를 저장링크 단계
hello 프로그램이 C 컴파일러에서 제공하는 표준 C 라이브러리에 들어있는 printf함수를 호출하는 것에 주목. printf 함수는 이미 컴파일된 변도의 목적파일인 printf.o에 들어 있으며, 이 파일은 hello.o 파일과 어떤 형태로든 결합되어야 함. 링커 프로그램(ld)이 이 통합 작업을 수행
3. 컴파일 시스템이 어떻게 동작하는지 이해하는 것이 중요하다
프로그램 성능 최적화하기
최신 컴파일러들은 복잡한 도구로 대개 우수한 코드를 생성함. C 프로그램 작성 시 올바른 판단을 하기 위해서는 기계어 수준 코드에 대한 기본적인 이해를 할 필요가 있으며, 컴파일러가 어떻게 C 문장들을 기계어 코드로 번역하는지 알 필요가 있음.링크 에러 이해하기
가장 당혹스러운 프로그래밍 에러는 링커의 동작과 관련되어 있으며, 큰 규모의 소프트웨어 시스템을 빌드하려는 경우에 더욱 그럼.보안 약점(security hole) 피하기
오랫동안 버퍼 오버플로우(buffer overflow) 취약성이 인터넷과 네트워크상의 보안 약점의 주요 원인으로 설명됨. 안전한 프로그래밍을 배우는 첫 단계는 프로그램 스택에 데이터와 제어 정보가 저장되는 방식 때문에 생겨나는 영향을 이해하는 것.
4. 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다
지금까지 hello.c 소스 프로그램은 컴파일 시스템에 의해 hello라는 실행가능한 목적파일로 번역되어 디스크에 저장되었음. 이 실행파일을 유닉스 시스템에서 실행하기 위해서 쉘이라는 응용프로그램에 그 이름을 입력
linux> ./hello
hello, world
linux>
쉘은 컨맨드라인 인터프리터로 프롬포트를 출력하고 명령어 라인을 입력 받아 그 명령을 실행.
❗참고
인스트럭션이란?
인스트럭션은 컴퓨터가 어느 정보를 가지고 어떠한 처리를 하는가를 나타냄.
4.1 시스템의 하드웨어 조직
1. 버스
- 시스템 내를 관통하는 전기적 배선군을 버스(bus)라고 하며, 컴포넌트들 간에 바이트 정보들을 전송함.
- 일반적으로 워드(word)라고 하는 고정 크기의 바이트 단위로 데이터를 전송하도록 설계됨.
2. 입출력 장치
- 시스템과 외부세계와의 연결을 담당.
- 각 입출력 장치는 입출력 버스와 컨트롤러나 어댑터를 통해 연결.
- 이 두 장치의 파이는
패키징(packaging)
에 있음. 컨트롤러
는 디바이스 자체가 칩셋이거나 시스템의 인쇄기판에 장착됨.어뎁터
는 머더보드의 슬롯에 장착되는 카드임.
3. 메인 메모리
- 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치.
물리적
으로 메인 메모리는 DRAM(Dynamic Random Access Memory) 칩들로 구성되어 있음.논리적
으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있음.- 일반적으로 한 개의 프로그램을 구성하는 크기는 데이터 형에 따라 다름.
4. 프로세서
- 주처리장치(CPU) 또는 간단히 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독(실행)하는 엔진임.
- 프로세서의 중심에는 워드 크기의 저장장치(또는 레지스터)인 PC가 있음.
- 어느 한순간에 PC는 메인 메모리의 기계어 인스트럭션을 가리킴.
- 시스템에 전원이 공급되는 순간부터 전원이 끊어질 때까지 프로세서는 프로그램 카운터가 가리키는 곳의 인스트럭션을 반복적으로 실행하고 PC값이 다음 인스트럭션의 위치를 가리키도록 업데이트 함.
- 자신의 인스트럭션 집합 구조(Instruction setarchitecture)로 정의되는 매우 단순한 인스트럭션 실행 모델을 따라 작동하는 것처럼 보임.
- 이 모델에서 인스트럭션들은 규칙적인 순서로 실행되고, 한 개의 인스트럭션을 실행하는 것은 여러 단계를 수행함으로써 이루어짐.
- PC가 가리키는 메모리로부터 인스트럭션을 읽어오고, 이 인스트럭션에서 비트들을 해석하여 인스트럭션이 지정하는 간단한 동작을 실행하고, PC를 다음 인스트럭션 위치로 업데이트 함.
- 이 새로운 위치는 방금 수행한 인스트럭션과 메모리 상에서 연속적일 수도 있고, 그렇지 않을 수도 있음.
- 이와 같은 몇 개의 단순한 동작만이 있을 뿐이며, 이들은 메인 메모리, 레지스터 파일, 수식/논리 처리기(ALU) 주위를 순환함.
레지스터 파일
은 각각 고유의 이름을 갖는 워드 크기의 레지스터 집합으로 구성되어 있음.ALU
는 새 데이터와 주소 값을 계산함.
적재(Load)
메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사함.저장(Store)
레지스터에서 메인 메모리로 한 바이트 또는 워드를 이전 값을 덮어쓰는 방식으로 복사함.작업(Operate)
두 레지스터의 값을 ALU로 복사하고 두 개의 워드로수식연산을 수행한 뒤, 결과를 덮어쓰기 방식으로 레지스터에 저장함.점프(Jump)
인스트럭션 자신으로부터 한 개의 워드를 추출하고, 이것을 PC에 덮어쓰기 방식으로 복사함.
4.2 hello 프로그램의 실행
- 쉘 프로그램은 자신의 인스트럭션을 실행하면서 사용자가 명령을 입력하기를 기다림.
- 사용자가 ".\hello"를 입력하면 쉘 프로그램은 각각의 문자를 레지스터에 읽어 들인 후, 메모리에 저장함.
- 키보드에서 엔터(Enter) 키를 누르면 쉘은 명령 입력을 끝마쳤다는 것을 알게 됨.
- 쉘은 파일 내의 코드와 데이터를 복사하는 일련의 인스트럭션을 실행하여 실행파일 hello를 디스크에서 메인 메모리로 로딩함.
- 데이터 부분은 최종적으로 출력되는 문자 스트링인 "hello, world\n"을 포함함.
- 직접 메모리 접근이라고 알려진 기법을 이용해서 데이터는 프로세서를 거치지 않고 디스크에서 메인 메모리로 직접 이동함
- 일단 hello 목적파일의 코드와 데이터가 메모리에 적재된 후, 프로세서는 hello 프로그램의 main 루틴의 기계어 인스트럭션을 실행하기 시작함.
- 인스트럭션들은 "hello, world\n" 스트링을 메모리로부터 레지스터 파일로 복사하고, 거기로부터 디스플레이 장치로 전송하여 화면에 글자들이 표시됨.
Author And Source
이 문제에 관하여([컴퓨터 시스템 02] 1장. hello, world), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yunchanpark/컴퓨터-시스템-02-1장.-정보는-비트와-컨텍스트로-이루어진다저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)