코스웨어/15년 스마트컨트롤러
20151202 임현수 업무일지 ELF파일 포맷, 스레드
알 수 없는 사용자
2015. 12. 3. 00:35
728x90
반응형
■ ARM assembly
■ 오브젝트 파일
C에서 어셈블리로 넘어가면 값들은 주소기반이 된다.
즉 심볼테이블이 그변수의 주소를 갖게 되기 때문이다.
오브젝트가 여러개(소스파일이 여러개)있으면 주소를 정리해야된다.
가상주소가 오브젝트파일 별로 나온다.
오브젝트파일이 나올때는 용량에대한 정보만 나온다고 보면 된다.
이를 바탕으로 실행파일 만들때 구체적인 주소가 나온다 -> 맵파일
지역 변수들...
기준주소 + 0
기준주소 + 4
기준주소는 EBP를 말한다고 보면 된다.
기준주소를 실행할 때마다 바꾼다. - 보안성 향상
실행 시킬 때만 함수의 위치를 알 수 있다. (c++의 가상함수 개념과 비슷하다.)
이름이 동일한 변수나 함수를 사용해서 발생하는 에러는 주소 충돌이라고 볼 수 있다.
지역변수는 ESP와 EBP사이에 있어야 보호 받는다고 볼 수 있다. - lifecycle
■ ELF 파일 포맷
▲ gcc로 컴파일된 object파일은(.O) ELF파일 포맷을 갖는다.
오브젝트파일은 리눅스에서 readelf 명령으로 파일정보를 확인 할 수 있다.
실습을 위해 오브젝트파일을 라즈베리에 복사한다.
삼바를 이용해서 라즈베리에 파일 복사할때 권한때문에 안된다고하면 "chmod 777 디렉토리이름" 후 재시도.
▲ readelf 유틸리티로 ELF file 정보 확인
beginthreadex의 3번째인자는 스레드로 만들 함수의 이름
■ 쓰레드
윈32의 메세지를 생각해보자.
윈드프록이 윈도우에 의해서 실행된다. - 메시지가 오지않으면 프로그램은 돌지않는다.
즉 폴링방식.
운영체제가 메시지를 던져준다.
프로그램 입장에서는 메시지가 인터럽트이다.
운영체제가없다고 생각하자.
동시성이 있다는말은 흐름적으로 짜면 안된다는 뜻이다.
소켓에서들어오는지 키보드에서 들어오는지 Select()가 해결한다.
Select()가 없으면 키보드입력과 소켓통신으로 외부에서 들어오는것을 어떻게 감시할 것인가.
인터럽트방식을 쓰는데, 소켓이많으면 힘들어진다.
순차실행이기때문에
A(); B(); 동시에 절대로 안된다.
해결책
1. 멀티프로세스방식 - fork()
2. 스레드
스레드는 main죽이면 다죽일 수 있다.
경량화, 자원을 아낄 수 있다.
윈도우에서는 쓰레드를 쓸 수 밖에없도록 구조가 되어있다.
beginthreadex 이후로
main과 thread가 같이 돌고있다.
스레드가 죽을 때까지 main을 기다리게 만드는 함수가
WaitForSingleObject() 함수.
스레드가 죽을 때까지 동작을 보장한다.
728x90