How to recognize executable files.


현재 디렉토리의 파일들



파일리스트를 출력하는 소스 test2.out 실행 결과 



sicsim.c.swp는 작성 중에 vim 종료를 비정상적으로 해서 디스크에 swap되어 있는 것 같다. 

디렉토리는 끝에 '/'를 출력하고 실행가능 파일은 끝에 '*'를 출력


그럼 이제 소스를 보장




괄호 안의 숫자들은 statbuf.st_mode를 8진수로 출력한 것


값들의 의미를 살펴보자면 (6개의 숫자 중 하위 3개의 숫자들만)


이런거라고 한다. 



위에 include한 헤더파일 중 sys/stat.h에 File type과 File mode bit를 위한 symbolic name들이 정의 되어 있다.

요기 참고



실행 여부를 가늠하기 위해서는 S_IXUSR, S_IXGRP, S_IXOTH 값이 필요하다. 

위의 값들은 8진수로 각각 100,10,1의 값을 가지고 있다. 

그래서 위에서 출력한 파일 모드의 값들과 &(AND연산)을 하면 실행가능하면 1, 불가하면 0의 값이 나오는 것이다. 


S_ISDIR은 헤더파일에 정의되어 있는 함수로 파일이 디렉토리인지 아닌지를 출력해주는 함수이다.


※포인터의 개념


C에서 int형 변수 a를 선언후 10을 대입한 후의 메모리를 추상적으로 나타내면 다음과 같다. 


int a=10;

이때 a를 담고 있는 메모리 주소를 가리키는 포인터는 &a 로 표현한다. 



포인터 &a100번지에 있는 정수형 공간을, 또는 100번지에 저장된 정수가리킨다고 말한다. 

  • a의 포인터 → &a
  • &: 포인터(주소) 연산자

- &a(a의 포인터)에 들어있는 정보

  • 변수 a가 저장된 공간의 시작주소: 100
  • 변수 a가 저장되는 방식: int(4byte 정수)


※포인터가 가리키는 공간/값 얻기

포인터가 가리키는 공간을 얻는 참조연산자: *
- 사용법: * 포인터
int a;  →   *(&a)

해당 공간을 변수처럼 사용할 수 있다.


-포인터가 가리키는 값 읽어서 변수에 저장하기 

int a=10, b;

b = *(&a)


-포인터가 가리키는 공간에 값 저장하기

int a, b = 10;

*(&a) = b;


※포인터 저장


그럼 포인터는 어떤 자료형에 저장해야 하는가?

int a; int b = &a;

이렇게 하면 되나?

그럼 'int'의 간접 참조수준이 'int*'과(와) 다릅니다. 

라는 에러를 만나게 될것이다. 

포인터를 저장하기 위해서는 새로운 자료형 변수가 필요하다. 


- 포인터 자료형의 선언

  • 가리키는 자료형 *  →  int *, char*, double *, ...
  • int * : 포인터 자료형(*)인데 가리키는 자료형이 int 형


int a = 10;

int *p = &a;


이 때 '*'는 포인터라는 의미이며 참조연산자의 의미가 아님. (*(&a)에 쓰였던 *와는 다름)


- 가리키는 변수를 접근하여 읽고 쓰기



1.인터럽트 개념


인터럽트란 일상 생활에서의 갑작스러운 사건이라고 할 수 있다. 예를 들어

  • 인터럽트 요청: 학생이 질문 하였다면,
  • 상태저장: 강사는 설명하던 것을 잠시 멈추고,
  • 인터럽트 서비스: 학생의 질문에 답변을 한 후에,
  • 인터럽트 복귀: 다시 질문 전에 강의하던 내용으로 돌아와 계속 강의를 진행한다. 

컴퓨터에서도 이와 같은 사건이 발생할 수 있다.

컴퓨터의 정상적인 프로그램 실행을 방해하는 사건이 발생하는 것을 컴퓨터의 실행을 방해한다는 의미로 인터럽트라고 한다. 

인터럽트는 컴퓨터내부와 외부에서 발생할 수 있다.

컴퓨터 내부에서 발생하는 인터럽트가 발생하면 컴퓨터는 더이상 프로그램을 실행할 수가 없다. 


-내부 인터럽트

  • 하드웨어 고장: 데이터 전달 과정에서 비트 오류 혹은 컴퓨터 전원 꺼짐 등 프로그램의 실행과 관계 없음
  • 실행할 수 없는 명령어: 기억장치에서 인출한 명령어의 비트 패턴이 정의되어 있지 않아 CPU가 그 명령어를 실행할 수 없음
  • 명령어 실행 오류: 인출 명령어는 정상적이지만 명령어를 실행할 수 없는 경우.(ex. 인출한 명령어가 나누기인데, 나누는 수가 0)
  • 사용 권한 위배: 운영체제가 컴퓨터자원을 보호하기 위해 사용자가 접근할 수 있는 영역과 접근할 수 없는 영역을 제한해 놓았다. 만약 운영체제만 접근 가능한 영역에                     액세스하려고 한다면 인터럽트가 발생한다. 

-외부 인터럽트 

  • 타이머 인터럽트
  • 입추력 인터럽트: 속도가 느린 입출력장치가 입출력 준비가 완료되었다는 것을 중앙처리 장치에게 알리기 위하여 사용하는 인터럽트


2. 인터럽트 처리 과정


①인터럽트 요청(interrupt request): 임의의 소스가 인터럽트를 요청

②인터럽트 승인(interrupt acknowledge): CPU는 인터럽트 요청을 인식하고, 인터럽트 소스에게 인터럽트를 확인하였을음 알려준다. 

③상태 저장(context save): CPU는 현재 실행하던 프로그램을 중단하고 현 상태를 저장한다.

④인터럽트 서비스(interrupt service): CPU는 인터럽트 소스가 요구한 작업을 실행한다.

⑤인터럽트에서 복귀(return form interrupt): CPU는 원래 실행하던 프로그램으로 복귀한다. 


CPU는 인터럽트 소스가 요청한 작업을 수행하여야 하는데, 이것도 기억장치에 저장되어 있는 프로그램이다. 

이프로그램을 인터럽트 서비스 루틴(Interrupt Service Routine, ISR) 혹은 인터럽트 핸들러(interrupt handler)라고 한다. 

인터럽트 서비스 루틴은 인터럽트 종류마다 하나씩 기억장치에 준비되어 있어야 한다. 


CPU가 인터럽트 요청을 인식하고 승인하기 위하여 중앙처리장치의 제어 버스는 다음과 같은 두개의 제어선을 포함하고 있다. 





'컴퓨터 공부 > 컴퓨터구조' 카테고리의 다른 글

인터넷 접속 과정과 nat  (0) 2016.08.11
스택포인터  (4) 2016.01.18

+ Recent posts