[강의] https://www.youtube.com/watch?v=GVX-m3RF-K0&list=PLVsNizTWUw7E2KrfnsyEjTqo-6uKiQoxc [뇌를 자극하는 윈도우즈 시스템 프로그래밍]
: 하드웨어(:컴퓨터 구조. [CPU, 캐쉬]) + 운영체제[메인메모리, 하드디스크(:I/O)]
시스템 프로그래밍은 Windows 운영체제 자체의 기능을 십분 활용하는 프로그래밍.
텍스트 파일이 아닌 다른 모든 파일은 바이너리 파일이다
main 안에서 printf를 호출하는 hello.c를 컴파일하는 단계
전처리기[pre-processor:cpp]
ex) 코드 앞에 헤더파일 import.
hello.c(txt) -> hello.i(txt)
컴파일러[compiler:cc1]
어셈블리어 프로그램을 저장
hello.i(txt) -> hello.s(txt)
어셈블러[assembler:as]
기계어 인스트럭션으로 번역 후 재배치가능 목적프로그램의 형태로 묶어서 목적파일로 저장. main 함수의 인스트럭션들을 인코딩하기 위한 17바이트를 포함한다. 텍스트 편집기로 열어보면 쓰레기처럼 보임(바이너리 파일이라서??)
hello.s(txt) -> hello.o(binary)
링커[linker:ld]
hello 프로그램은 c컴파일러에서 제공하는 표준 c 라이브러리에 들어있는 printf함수를 호출한다. printf 함수는 이미 printf 목적파일에 들어있고, 링커 프로그램이 hello.o파일과 printf.o파일을 통합한다. 그 결과인 hello파일은 실행가능 목적파일(=실행 파일)이 되고 메모리에 적재되어 시스템에 의해 실행된다.
프로그램 성능 최적화하기
-- switch문과 if-else문
-- while문 과 for문
-- 포인터와 배열인덱스
...
효율적인 프로그램을 작성하려면 기본적인 기계어 수준 코드를 이해해야 하며, 컴파일러가 어떻게 C 문장들을 기계어 코드로 번역하는지 알 필요가 있다. ( => 3장: x86-64 기계어)
링크 에러 이해하기
-- 정적변수와 전역변수의 차이
-- 서로 다른 파일에 같은 이름의 전역변수를 정의했을 때?
-- 정적 라이브러리와 동적 라이브러리의 차이
-- 링커가 어떤 참조를 풀어낼 수 없다고 할 때??
보안 약점[security hole] 피하기
버퍼 오버플로우 취약성: 신뢰할 수 없는 곳에서 획득한 데이터의 양과 형태를 제한하지 않아서 생겨난다.
프로그램 스택에 데이터와 제어 정보가 저장되는 방식 때문에 생겨나는 영향을 이해해야 안전한 프로그래밍을 배울 수 있다.
※인스트럭션(instruction)은 컴퓨터에게 일을 시키는 단위로서, 컴퓨터가 알아들을 수 있는 기계어로 이루어져 있는 명령이다. 지시 또는 명령이라고 한다.
컴파일 과정을 통해 저장된 실행파일을 실행
쉘에 실행파일의 이름을 입력하면 프로그램이 실행된다
(내장 쉘 명령어가 아닐경우 실행파일의 이름으로 판단한다)
컨트롤러나 어댑터를 통해 입출력 버스와 연결
입출력 장치 <-----> 컨트롤러 or 어댑터 <-----> 입출력 버스
컨트롤러: 디바이스 자체가 칩셋, 또는 머더보드(인쇄기판)에 장착
어댑터: 머더보드의 슬롯에 장착
메인 메모리: 임시 저장장치
프로세서가 프로그램을 실행하는 동안의 데이터와 프로그램을 저장한다.
메인메모리는 [DRAM: Dynamic Random Access Memory] 칩들로 구성되어 있다. 메모리는 연속적인 바이트들의 배열로, 0부터 시작해 고유 주소(배열의 인덱스)를 가지고 있다.
프로세서 [CPU: 주처리장치] : 메인 메모리에 저장된 인스트럭션 실행
ALU
컨트롤 유닛
레지스터
버스 인터페이스
프로세서의 중심에는 워드 크기의 저장장치(or 레지스터)인 프로그램 카운터(PC)가 있다. 어느 한 순간에 PC는 메인 메모리의 기계어 인스트럭션을 가리킨다.
점프(Jump)