Part 1 1장 서론 ... 2 1.1 시스템 프로그램이란 무엇인가? ... 2 1.2 시스템 프로그램의 분류 ... 3 1.2.1 언어 프로세서 ... 3 1.2.2 운영체제 ... 4 1.2.3 그 밖의 시스템 프로그램 ... 5 1.3 책의 구성 ... 6 1.4 책의 계통도 ... 8 2장 UNIX 시스템 환경 ... 11 2.1 초기 UNIX 시스템의 발전과 계보 ... 11 2.2 UNIX 시스템의 구조와 특징 ... 14 2.2.1 UNIX 시스템의 구조 ... 14 2.2.2 UNIX 시스템의 특징 ... 16 2.3 UNIX 시스템의 쉘 명령어 ... 20 2.3.1 UNIX 세션 ... 20 2.3.2 우편 ... 23 2.3.3 매뉴얼 ... 23 2.3.4 화일 관련 명령어 ... 24 2.3.5 디렉토리 ... 33 2.3.6 쉘 ... 36 2.4 쉘(Shell) 프로그래밍 ... 46 2.5 요약 ... 49 3장 표준 입출력을 이용한 C 프로그래밍 ... 53 3.1 표준입력과 표준출력 : show ... 53 3.2 프로그램의 인수 : show의 버전 2 ... 57 3.3 화일의 사용 : show의 버전 3 ... 58 3.4 페이지 단위 출력 프로그램 p 버전 1 ... 63 3.5 페이지 단위 출력 프로그램 p 버전 2 : 페이지길이 선택사항 이용하기 ... 67 3.6 이름으로 프로세스 죽이기 kp ... 68 3.7 기타 표준 I/O ... 71 3.7.1 버퍼링(buffering) ... 72 3.7.2 이진 I/O ... 73 3.7.3 개방된 화일의 특정 위치로 가기 ... 74 3.7.4 임시 화일 ... 74 Part 2 4장 UNIX 시스템 호출 ... 78 4.1 저수준 I/O ... 78 4.1.1 화일 기술자(File descriptors) ... 78 4.1.2 화일 입출력 - read와 write ... 80 4.1.3 화일의 생성: open, creat, close, unlink ... 84 4.1.4 임의 접근:lseek ... 89 4.2 디렉토리(directory)의 처리 ... 90 4.3 i-node(또는 inode) ... 92 4.4 프로세스 ... 98 4.4.1 다른 프로그램으로의 변경 : execlp와 execvp ... 98 4.4.2 프로세스의 생성, 프로세스의 종료 기다리기 : fork와 waitpid ... 102 4.5 시그널 ... 112 4.6 비상탈출 기능 ... 117 5장 프로그램의 개발 ... 123 5.1 문맥자유문법(CFG)과 문맥민감문법(CSG) ... 123 5.2 가감승제 계산기 calc1 ... 126 5.2.1 calc1의 문법 ... 126 5.2.2 스캐너 yylex()의 작성 ... 127 5.2.3 yacc의 입력함수의 작성 ... 129 5.2.4 makefile을 이용한 컴파일 ... 135 5.3 변수와 에러회복 능력을 갖춘 계산기 calc2 ... 136 5.3.1 calc2.y의 구현 ... 136 5.3.2 calc2의 동작 ... 141 5.4 임의의 변수 명이 가능한 가감승제 계산기 calc3 ... 143 5.4.1 헤더 file의 작성 ... 143 5.4.2 심볼 테이블의 관리 ... 144 5.4.3 calc3.y 의 작성 ... 146 5.4.4 makefile을 이용한 calc3의 제작 ... 151 5.5 가감승제 계산기 calc의 개선된 구현법 : 심볼 테이블 제작과 스캐너의 자동제작 ... 152 5.5.1 심볼 테이블의 제작 ... 152 5.5.2 스캐너의 자동 제작 : lex의 사용법 ... 159 5.5.3 최종 calc 프로그램의 작성 ... 163 5.6 lex만을 이용한 프로그램 ... 165 5.7 돌아보며 ... 167 6장 기타 UNIX 시스템 호출 ... 173 6.1 화일 I/O ... 173 6.1.1 /dev/fd의 사용 ... 173 6.1.2 fcntl 함수 ... 174 6.1.3 ioctl 함수 ... 177 6.2 화일과 디렉토리 ... 178 6.2.1 화일 접근 권한 ... 178 6.2.2 set-user-ID와 set-group-ID ... 179 6.2.3 access 함수 ... 180 6.2.4 umask 함수 ... 181 6.2.5 chmod 함수 ... 183 6.2.6 chown 함수 ... 184 6.2.7 화일의 절단 : truncate ... 185 6.2.8 화일시스템 ... 185 6.2.9 링크와 심볼식 링크 ... 187 6.2.10 chdir과 getcwd 함수 ... 189 6.2.11 sync 함수 ... 190 6.3 시스템 자료의 처리 ... 190 6.3.1 패스워드 화일 ... 191 6.3.2 그룹 화일 ... 193 6.3.3 시스템 확인 ... 194 6.3.4 시간과 날짜 ... 195 6.3.5 기타 자료 화일들 ... 196 6.4 프로세스 환경 ... 197 6.4.1 main 함수 ... 197 6.4.2 프로세스의 종료 ... 198 6.4.3 C 프로그램의 메모리 배치 ... 200 6.4.4 환경 변수 ... 203 6.4.5 동적 메모리 배정:배열크기의 동적 변경 방법 ... 205 6.4.6 setjmp와 longjmp ... 207 6.5 시그널 ... 210 6.5.1 기본적인 시그널 사용법 ... 210 6.5.2 신뢰할 수 없는 시그널(Unreliable Signals) ... 212 6.5.3 느린 시스템 호출(Slow System Calls) ... 214 6.5.4 재진입 함수(Reentrant Functions) ... 215 6.5.5 alarm과 sleep ... 216 6.5.6 믿을 수 있는 시그널 ... 218 6.5.7 추가적인 시그널 함수들 ... 221 6.5.8 시그널 금지 영역의 해제 ... 223 6.5.9 작업 제어 시그널 ... 225 6.6 레코드 록킹( Record Locking) ... 226 6.6.1 fcntl 함수를 이용한 레코드 록킹 ... 226 6.6.2 충고식 록컴(Advisory locking)과 강제식 록킹(Mandatory Locking) ... 229 6.7 경주 조건(Race Conditions) ... 230 6.8 I/O 멀티플렉싱(Multuplexing) ... 233 6.9 메모리 사상 I/O(Memory Mapped I/O) ... 237 6.9.1 가상 메모리 ... 237 6.9.2 mmap 함수 ... 238 6.10 다중 쓰레딩(Multi-Threading) ... 242 6.10.1 쓰레드 사용법 ... 242 6.10.2 다중 쓰레딩 환경에서 임계영역 문제 ... 245 7장 프로세스 간의 통신(IPC) : 소켓 이용법 ... 251 7.1 인터넷 모델과 계층 ... 251 7.2 인터넷 주소 ... 252 7.3 데이터그램 통신기법 ... 256 7.3.1 데이터그램을 이용한 수신용 서버 프로그램 ... 257 7.3.2 socket, bind, getsockname ... 258 7.3.3 데이터그램을 이용한 송신용 클라이언트 프로그램 ... 260 7.3.4 gethostbyname, bcopy, sendto ... 261 7.4 스트림 통신기법 ... 263 7.4.1 스트림 서버 버전 1 ... 265 7.4.2 listen, accept, connect ... 268 7.4.3 고객 프로그램 stclient ... 269 7.4.4 스트림 서버의 개선 : 버전 2 ... 271 7.4.5 select ... 274 7.4.6 스트림 서버 버전 3 : 요청처리마다 새로운 아들 프로세스가 처리하는 버전 ... 276 7.4.7 fork, waitpid ... 279 Part 3 8장 어셈블리 언어와 어셈블러 ... 284 8.1 시스템/370의 구조 ... 284 8.1.1 개요 ... 285 8.1.2 바이트, 반 단어, 단어 및 2배 단어 ... 287 8.1.3 명령어 이해를 위한 기본 사항 ... 288 8.2 명령어의 포맷 ... 289 8.2.1 RR 포맷 (레지스터 - 레지스터 포맷) ... 290 8.2.2 RX 포맷 (레지스터 - 인덱스를 가진 기억장치 포맷) ... 292 8.2.3 RS 포맷 (레지스터 - 기억장치 포맷) ... 294 8.2.4 SI 포맷 (기억장치 - 즉시 포맷) ... 295 8.2.5 SS 포맷 (기억장치 - 기억장치 포맷) ... 296 8.3 분기 명령어 (Branch Instruction) ... 300 8.3.1 BC 및 BCR 명령어 ... 300 8.3.2 BAL 및 BALR 명령어 ... 301 8.4 예제 프로그램 및 그 이해 ... 303 8.4.1 예제 프로그램 ... 303 8.4.2 기계 연산과 의사 연산 ... 304 8.4.3 인덱스 레지스터의 용도 : 순수 코드 ... 305 8.4.4 리터럴(Literal)의 이용 ... 306 8.5 어셈블러의 출력 형태 ... 307 8.6 어셈블러가 사용하는 테이블 ... 309 8.6.1 미리 준비된 테이블 : 기계연산 테이블과 의사연산 테이블 ... 309 8.6.2 심볼 테이블과 리터럴 테이블 ... 311 8.6.3 기준 테이블 ... 311 8.7 어셈블러의 제작 ... 313 8.8 기타 숙고할 사항 ... 316 8.8.1 DC 및 DS 의 길이 표시에 심볼 사용 ... 316 8.8.2 백-패칭 기법과 1-패스 어셈블러 ... 319 8.9 단축 370 어셈블리 ... 320 8.9.1 기계 연산(Machine Op) ... 320 8.9.2 의사 연산(Pseudo-Op) ... 322 8.9.3 단축 370 프로그램의 시뮬레이션 ... 323 9장 연결 및 적재(Linking and Loading) ... 333 9.1 서론 ... 333 9.2 적재기 (또는 로더; loader) 및 연결기 (linker) ... 334 9.2.1 적재기 ... 334 9.2.2 연결기(linker) ... 336 9.3 연결 편집기 (linkage editor) ... 339 9.3.1 객체 모듈 (object module) ... 339 9.3.2 적재모들 (load module) ... 349 9.3.3 주소의 배정 및 주소 상수의 재배치 ... 351 9.3.4 연결의 예제 ... 353 9.3.5 연결 편집기의 다른 기능 ... 354 9.3.6 단축 370 어셈블리용 연결기와의 비교 ... 357 9.4 모듈 적재기(module loader) ... 358 9.4.1 모듈적재기의 동작 방식 ... 358 9.4.2 예제를 통해 본 적재 과정 ... 359 9.5 결론 ... 361 10장 매크로 프로세서 ... 367 10.1 매크로 프로세서의 개념 ... 367 10.2 M6 매크로 프로세서 ... 370 10.2.1 M6에서의 매크로 처리 ... 372 10.2.2 M6의 구현 ... 376 10.2.3 M6의 고급 기능 ... 394 10.3 프로그래밍 프로젝트 ... 401 10.3.1 기본 사양 ... 401 10.3.2 주의사항 ... 401 10.3.3 구현 ... 402 10.3.4 추가 기능 ... 402 부록 A UNIX 사용법 ... 407 부록 B UNIX 에디터 ⅵ의 사용법: 화일 prog1.c라 가정 ... 410 부록 C ftp(file transfer protocol) ... 415 찾아보기 ... 419