라벨이 운영체제인 게시물 표시

[Linux, Unix]GCC 옵션 알아보기

GCC Option GCC Option -E 전처리 과정 화면에 출력 -S 어셈블리 파일 생성 -c 오브젝트 파일 생성 gcc -o main.c -o output 파일 생성(.out) gcc -o prog main.o sum.o -v : 컴파일 과정 화면에 출력 --save-temps 컴파일시 생성되는 중간 파일 저장 -da 컴파일 과정에서 생성되는 중간 코드 생성 -O option -O0 : 최적화를 진행하지 않고 컴파일 -O1 : 이 레벨은 매우 기본적인 최적화를 수행 -O2 : 중간단계 최적화 -O3 : 최고 수준의 최적화 -Os : 코드 크기를 최적화 합니다. 만든 코드의 크기가 늘어나지 않게 하는 모든 -O2 옵션을 활성화 합니다. 매우 제한된 디스크 저장소 공간을 가지고 있거나 CPU의 캐시 크기가 작을 경우 유용합니다. -Og : 빠른 컴파일을 필요로 하며 실행시간 성능의 타당한 수준을 제공하면서 우수한 디버깅 경험을 할 수 있게 바로 잡았습니다. 개발에 있어 전체적인 경험은 기본 최적화 레벨 -O0 보단 낫습니다.

[System Programming ]제어 이동 ECF, Exceptional Control Flow

[예습] 8.1, 8.5 제어 흐름 제어 이동 PC값을 하나씩 증가시키면서 순서대로 인스트럭션을 실행시키는 것을 제어 이동이라고 부른다. 때로는 jmp와 같이 더 멀리 건너뛰는 경우도 있지만 PC값을 바꾸어 제어하는 상황을 제어 이동이라고 부른다. 예외적인 제어 이동 Exceptional Control Flow 예외란 시스템이 제어권을 가지고 처리해줘야 하는 상황을 말한다. 각 예외 요청에는 고유의 번호가 있고 각각 예외를 처리하는 시스템 함수가 있는데 이를 핸들러라고 부른다. 시스템 예외 테이블은 각 예외 번호를 key로 하고 핸들러의 주소를 값으로 하는 테이블을 부팅시에 메모리에 올리게 된다. 총 0~ 255번까지의 예외 번호중에서 0번 ~ 31번까지는 하드웨어에 관한 예외로 지정되어 있고 32 ~ 255번까지는 운영체제가 직접 설정한 예외로 구성되어 있다. 예외는 응용프로그램이나 외부 디바이스에서 요청할 수 있는데 그 특징에 따라서 4가지 유형으로 나눌 수 있다. 1. 인터럽트 키보드나 마우스와 같은 외부 디바이스의 입출력 장치에서 시스템에게 요청하는 것으로 응용프로그램의 인스트럭션과는 상관없는 유일한 예외이다. 시스템은 외부 디바이스로부터 인터럽트를 받으면 응용 프로그램을 중지하고 사용자 모드에서 커널모드로 전환한 후에 중지한 응용 프로그램의 환경을 커널 스택에 기록한 후에 핸들러를 불러 인터럽트를 처리한다. 커널의 스택 정보를 다시 pop한 후에 사용자 모드로 들어가 중지되었던 인스트럭션 다음 인스트럭션으로 돌아가 응용 프로그램을 수행한다. 인터럽트 시간이 매우 짧기 때문에 응용 프로그램이 끊임없이 실행되는 것처럼 보일 수 있다. 2. 트랩 트랩은 응용 프로그램의 인스트럭션 수행중 발생하는 것으로 의도적인 예외 요청이다. 예를 들어 파일을 open 한다던지 close 하는 것처럼 시스템에 접근해야 할 경우 트랩을 통해서 처리한다. 3. 에러 에러란 복구할 수 있는 예외 로서 페이지 오류...

Firmware와 Bios 그리고 EFI

이미지
Firmware란 하드웨어란 컴퓨터 때문에 화가 났을 때 망치로 부술 수 있는 것이고 소프트웨어는 그럴 수 없는 것이다. 그렇다면 펌웨어는 무엇일까. 보통 펌웨어를 하드웨어화된 소프트웨어라고 한다. 소프트웨어의 가장 큰 특징은 변경할 수 있다는 점이다. 하지만 때로는 변경할 필요가 없는 소프트웨어가 필요할 수 있다. 이런 종류의 소프트웨어는 읽기만 가능한(ROM)에 작성함으로써 변경하지 못하도록 컴퓨터와 약속을 하고 작으면서도 필수적인 역할을 수행하도록 하는 경우가 많다. 컴퓨터의 가장 근본적인 소프트웨어가 그런 종류인데 예를 들어 BIOS와 같은 소프트웨어가 그 종류이다. BIOS vs UEFI BIOS란 우리의 숨쉬는 일을 도와주는 뇌의 기능과 비슷하다. 우리의 손 발이 하드웨어고 뇌의 사고능력을 소프트웨어라고 한다면 우리가 아무 생각없이도 숨을 쉴 수 있는 이유는 펌 웨어 덕분이다. 컴퓨터의 마더보드에 내재된 BIOS는 컴퓨터에 전원이 들어올때의 일을 담당한다. 하드웨어의 상태를 체크하고, 키보드를 컴퓨터와 연결하고, 마우스를 연결하고 어떤 디스크에 있는 부팅시스템에 연결해줄 것인지를 선택하게 한다. 운영체제의 발전으로 운영체제가 하드웨어를 더 직접적으로 관리할 수 있게되면서 지금은 평상시에 BIOS를 통해 하드웨어를 관리하지는 않고 필요할 때를 기다리며 BIOS는 잠들어 있다. UEFI는 BIOS를 대체하기 위해서 나온 펌웨어로서 마우스 사용이 가능하고 더 편리해진 펌웨어라고 생각하면 된다.

[Linux, Unix] export, echo 명령어 알아보기

[Linux, Unix] export, echo 명령어 알아보기 export 그리고 echo 명령어 유닉스 환경에서 개발을 하다보면 export와 echo라는 명령어를 종종 사용하게 됩니다. 간단하게 정리하려고 합니다. 유닉스를 사용한다면 Bash, ZSH라는 이름을 많이 들어보셨을 텐데요. Bash와 Zsh는 쉘 스크립트 언어를 말합니다. 터미널을 키면 그 터미널이 동작하는 방식을 결정하는 것이 쉘 스크립트 언어입니다. 변수와 echo 우리가 알아볼 것은 운영체제 변수와 쉘 변수 입니다. 운영체제 변수는 우리 프로그램이 돌아가는 운영체제의 변수를 말하는 것이 쉘 변수는 터미널 내에서 변수를 말하는 것입니다. water = "삼다수" 명령어를 터미널에서 입력한다면 water라는 쉘 변수를 만드는 것이 됩니다. echo 명령어는 변수를 출력하는 프린트 함수인데요. 다음과 같이 입력하면 water에 저장된 값을 터미널에 출력합니다. 만약 $를 빼고 출력한다면 문자열을 출력하는 것으로 받아들여 water를 그대로 출력하게 됩니다. echo $water unset water unset 명령어는 변수를 삭제하는 역할을 하지요. 내 컴퓨터가 어떤 쉘 스크립트 언어를 사용하는지 궁금하면 bash echo $SHELL 명령어를 통해서 어떤 쉘 스크립트 언어를 사용하고 있는지 알 수 있습니다. 지금까지의 변수들은 쉘 변수들을 다루어 보았구요. 이제 운영체제 변수에 대해서 알아보도록 할게요. env 위의 명령어를 입력하게 되면 운영체제 변수들을 출력하게 됩니다. 모든 프로그램은 운영체제위에서 돌아가기 때문에 운영체제 변수를 다른 말로 환경변수라고도 합니다. export export 명령어를 통해서 쉘 변수를 환경변수로 저장할 수 있는데요. export water 터미널에 위 명령어를 입력하고 env 라고 입력하면 환경변수 목록에 water가 추가되었음을 확인할 수 있습니다. 하지만 이...