// hello.c
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
❗참고
컨텍스트란?
어떤 객체를 핸들링하기 위한 접근 수단
linux> gcc -o hello hello.c
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)이 이 통합 작업을 수행프로그램 성능 최적화하기
최신 컴파일러들은 복잡한 도구로 대개 우수한 코드를 생성함. C 프로그램 작성 시 올바른 판단을 하기 위해서는 기계어 수준 코드에 대한 기본적인 이해를 할 필요가 있으며, 컴파일러가 어떻게 C 문장들을 기계어 코드로 번역하는지 알 필요가 있음.링크 에러 이해하기
가장 당혹스러운 프로그래밍 에러는 링커의 동작과 관련되어 있으며, 큰 규모의 소프트웨어 시스템을 빌드하려는 경우에 더욱 그럼.보안 약점(security hole) 피하기
오랫동안 버퍼 오버플로우(buffer overflow) 취약성이 인터넷과 네트워크상의 보안 약점의 주요 원인으로 설명됨. 안전한 프로그래밍을 배우는 첫 단계는 프로그램 스택에 데이터와 제어 정보가 저장되는 방식 때문에 생겨나는 영향을 이해하는 것.지금까지 hello.c 소스 프로그램은 컴파일 시스템에 의해 hello라는 실행가능한 목적파일로 번역되어 디스크에 저장되었음. 이 실행파일을 유닉스 시스템에서 실행하기 위해서 쉘이라는 응용프로그램에 그 이름을 입력
linux> ./hello
hello, world
linux>
쉘은 컨맨드라인 인터프리터로 프롬포트를 출력하고 명령어 라인을 입력 받아 그 명령을 실행.
❗참고
인스트럭션이란?
인스트럭션은 컴퓨터가 어느 정보를 가지고 어떠한 처리를 하는가를 나타냄.
1. 버스
2. 입출력 장치
패키징(packaging)
에 있음.컨트롤러
는 디바이스 자체가 칩셋이거나 시스템의 인쇄기판에 장착됨.어뎁터
는 머더보드의 슬롯에 장착되는 카드임.3. 메인 메모리
물리적
으로 메인 메모리는 DRAM(Dynamic Random Access Memory) 칩들로 구성되어 있음.논리적
으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있음.4. 프로세서
레지스터 파일
은 각각 고유의 이름을 갖는 워드 크기의 레지스터 집합으로 구성되어 있음.ALU
는 새 데이터와 주소 값을 계산함.적재(Load)
메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사함.저장(Store)
레지스터에서 메인 메모리로 한 바이트 또는 워드를 이전 값을 덮어쓰는 방식으로 복사함.작업(Operate)
두 레지스터의 값을 ALU로 복사하고 두 개의 워드로수식연산을 수행한 뒤, 결과를 덮어쓰기 방식으로 레지스터에 저장함.점프(Jump)
인스트럭션 자신으로부터 한 개의 워드를 추출하고, 이것을 PC에 덮어쓰기 방식으로 복사함.