Bootloader란 무엇인가?

2015. 6. 6. 19:39 from 하드웨어

부트로더는 소프트웨어를 공부하다가 조금 H/W에 가깝게 하게 되거나 OS를 공부하다보면 한번씩 보게 된다.

그렇다면 부트로더가 하는 일은 무엇일까? 


일단 컴퓨터의 구조부터 알아보자. 먼저 H/W가 있고 그 위에 H/W를 관리하는 Device Driver가 존재한다. 그리고 그 위에 운영체제가 있다. 그리고 그 운영체제에서 응용 프로그램들이 실행된다. 운영체제가 응용프로그램이 실행되는 동안에 Device Driver와 연결시켜 주어서 응용프로그래머들은 H/W에 대한 지식이 없이도 쉽게 운영체제 아랫단을 다룰 수 있는 것이다. 이것이 운영체제가 필요한 이유이다. 만약 운영체제가 없다면 프로그래머들은 실제 응용프로그램을 만드는 시간보다 이런 잡다한(삼성, HP, 캐논, 등의 동작을 관장하는 Device Deriver와 인터페이스) 것을 만드는 곳에 시간을 다 허비하게 될 것이다. 




다시 원점으로 돌아가서, 처음부터 컴퓨터를 만든다고 치자.

우린 먼저 하드웨어를 만들 것이다.(CPU, Memory, Hard drive, Mother board 등등)

그리고 또 뭘 만들어야 하나?

방금 이야기 했듯이 운영체제를 만들어야 한다. 우리는 실력이 엄청 좋아서 운영체제도 뚝딱 만들었다고 치자.

그런데 이 운영체제는 여러 프로그래밍 언어로 만들 수 있다. 아주 프로그래밍의 고수라면 어셈블리어로 운영체제를 만들 수 있겠지만, 이런 초고수가 얼마나 될까?

따라서 대부분의 사람들은 C언어로 운영체제를 만든다. Unix/Linux가 대표적인 C로 만들어진 운영체제이다.

자 이제 그럼 컴퓨터를 만들어 보자.


먼저 대충 하드웨어를 조립한다. Mother board에 CPU도 붙이고, 메모리도 붙이고, 하드 드라이브도 붙이고, 파워도 붙이고 등등...

자 이제 하드웨어적으로는 잘 된 것 같다.

앗...그런데... 하드웨어를 제어하는 것은 Device Driver(DD)라고 하지 않았나?

그리고 이 DD를 우리가 쉽게 이용할 수 있게 해주는게 운영체제라고 하지 않았나?

자~ 그럼 어떻게 운영체제와 DD를 하드웨어에서 돌아가게 할 수 있나?

걍 하드 드라이브에 운영체제와 DD를 때려 넣어놓으면 되는가?

위대한 폰 노이만 아저씨가 주구장창 주창했듯이, 우리는 하드 드라이브에 있는 운영체제나 DD를 사용하기 위해서는 이놈들을 메모리로 들어오게끔 꼬셔야(?)한다.

그런데 이상하지 않는가?

하드웨어는 걍 단순히 전기가 통하면 어떤 회로에 따라서 작동을 하는 기능뿐인데, 어떻게 이놈들을 메모리로 꼬셔올까?

여기서 우리에 귀염둥이 부트로더가 등장한다.

그럼 여기서 또 질문?

메모리의 어디에 이 부트로더가 있는지 어떻게 아냐?

여기서는 우리의 고마운 하드웨어가 도와준다.

컴퓨터를 처음 키면 Bios 어쩌고 저쩌고가 나온다. 이놈은 꽤나 고집스러운 놈이라, 항상 일정한 메모리 주소(RAM이 아니라 ROM이다. /혹은 하드드라이브의 일정 영역)를 읽어와서 거기에 있는 프로그램을 실행시킨다.(물론 다른 일도 좀 한다... ^^;)

즉 어떤 Bios가 난 메모리/혹은 하드드라이브(RAM이 아니라 ROM이다.)의 0x7D00에(하드드라이브의 경우 MBR) 있는 프로그램만 메모리로 꼬셔서 실행시켜 라고 마구마구 우기는 것이다.

그럼 여기서 뭔가 번뜩이지 않는가?

그렇다 우리는 바로 그 주소에다가(혹은 하드드라이브 영역에다가) 부트로더를 넣어두면 된다. ㅎㅎㅎ

이 부트로더가 하는 일은 메모리 주소체게(스택이나 힙)를 잡고, 하드웨어 초기화(I/O Setting), 운영체제를 메모리로 꼬시고 등등의 일을 수행한다.

자 그럼 다 된거 아닌가?

즉 하드웨어 구동 -> Bios가 특정 메모리 주소에 있는 프로그램을 실행 시킨다.(물론 그 프로그램은 부트로더가 되겠지) -> 부트로더가 여러 잡다한 일을 한 후 운영체제와 DD등등을 메모리로 꼬셔와서 운영체제를 실행시킨다. -> 운영체제가 열라 돌아간다. -> 게으른 응용프로그래머가 먹고 살기 위해서 프로그램을 짠다. -> 소비자가 울며 겨자먹기 식으로 프로그램을 사용한다.

이런 싸이클(자전거의 싸이클이 아니다.)이 생기는 것이다. 컴퓨터를 켜면.... ^^;


출처 : http://egloos.zum.com/shadowxx/v/2333450

'하드웨어' 카테고리의 다른 글

Tri-state (3상 상태) 란??  (0) 2016.08.19
Impedance(임피던스)란?  (0) 2016.08.19
래치와 플립 플롭  (0) 2015.05.31
Sink current, Source current  (0) 2015.05.31
ROM BIOS 란?  (1) 2013.10.23
Posted by 나무길 :

프로그램을 실행시키기 위해서는 메모리 공간이 필요함. 지역 변수나 전역 변수를 선언하기 위해서도 메모리 공간이 필요하듯이. 컴퓨터는 우리가 실행시킨 프로그램의 실행을 위해서 메모리 공간을 할당해 준다.(사실은 운영체제가 메모리 공간을 할당해 준다고 표현해야 정확한 표현이 된다.) 이렇게 해서 할당되는 메모리 공간은 크게 Stack, Heap, Data 영역으로 나뉘어진다.

이 세 개의 메모리 영역은 프로그래머가 반드시 이해하고 있어야 하는 최소한의 메모리 공간이다. 그렇다면 이러한 메모리 공간은 어떠한 용도로 언제, 어디서 할당되는지 이해해 볼 것.




데이터 영역 (Data Area)

데이터 영역은 전역 변수와 static 변수가 할당되는 영역이다. 이 영역에 할당되는 변수들은 일반적으로 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸된다. 즉, 데이터 영역에 할당된 변수는 프로그램이 종료될 때까지 계속 존재한다는 특징을 지닌다. 전역 변수와 static 변수는 프로그램이 종료될 때까지 존재하는 변수들이다. 이러한 특징이 데이터 영역의 특징과 일치한다.


스택 영역(Stack Area)

스택 영역은 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. 이 영역에 할당 된 변수는 함수 호출이 완료되면 사라진다는 특징을 지닌다. 이는 다른 메모리 영역과 확실히 비교되는 특징이다.


힙 영역(Heap Area)

힙은 프로그래머가 관리하는 메모리 영역이다. 즉 프로그래머의 필요에 의해서 메모리 공간이 할당 및 소멸되는 영역이다.프로그램을 실행 시 사용자의 요구에 맞게 메모리(배열의 길이)를 할당해 주는 영역. 즉, 런-타임에 메모리의 크기를 결정하고 싶은 것이다. 이러한 용도로 사용하기 위해서 존재하는 메모리 공간이 바로 힙(Heap)이다.


* 배열은 반드시 상수로 선언해야 하는 이유 : 스택과 데이터 영역에 할당될 메모리의 크기는 컴파일되는 동안 결정되어야 한다. 컴파일하고 나면 function 함수 내에서 필요로 하는 스택 공간의 크기를 알 수 있다. 컴파일 되는 동안에 메모리의 크기가 결정된다는 것은 바로 이것을 의미하는 것. "데이터 영억과 스택에 할당될 메모리의 크기는 컴파일-타임에 결정되어야 한다."

* "int i = 10;" 변수 i가 10으로 초기화된다는 것이 결저되는 순간은 컴파일되는 동안이 아닌 실행되는 동안에 결정된다. 즉 function 함수가 호출되어서 int i = 10; 을 실행하여야 결정이 된다. 이를 두고 "런-타임에 결정된다."라고 표현한다. 


'Language > C언어' 카테고리의 다른 글

재귀함수  (0) 2015.11.02
선언(declaration)과 정의(definition)의 차이  (0) 2013.11.08
C언어 따옴표의 의미  (0) 2013.11.06
반복문 for 의 함정  (1) 2013.10.23
강제 형 변환  (0) 2013.10.23
Posted by 나무길 :

왜 TTL 통신인가

2015. 6. 1. 15:37 from 통신

TTL 레벨과 RS-232C 레벨 통신의 차이는 아래와 같은 파형으로 구분될 수 있다. TTL 레벨은 0 V 와 5 V 를 왔다갔다 하면서 0과 1을 표현하지만 RS_232C 레벨은 +, -5V 양 전압 사이를 왔다갔다 해서 노이즈에 대한 면역성을 높혔다고 할 수 있다.


우리가 다이나믹셀 통신을 하면서 TTL 이라고 부르는 이유는 바로 여기에 있는 것이다. 5V 인 TTL 레벨로 UART 통신을 하기 때문이다. 사실 임베디드 환경에서 +,- 양전압으로 RS-232C 통신을 하기에는 제약이 많기 때문에 간편하게 5V TTL 레벨로 UART 통신을 한다고 보면 된다. 하지만 ttl 레벨은 노이즈 마진이 너무 작아서 조금만 노이즈가 첨가 되어도 오류가 생길 수 있다. 그래서 나온 것이 RS-232C 통신 규격이고 위아래가 대칭인 +,-5 V 양전압을 쓰기 때문에 노이즈 마진이 더욱 크기 때문에 좀 더 먼 거리(최대 15m)까지 통신이 가능하다.





출처 : 임베디드 로보틱스 (오픈 소스를 활용한,OpenCM의 활용)


'통신' 카테고리의 다른 글

차동 신호란? (differential input signal)  (3) 2016.04.14
통신 방식  (0) 2015.06.07
RS-232와 UART  (0) 2015.06.01
Buad rate  (0) 2015.06.01
직렬 통신과 병렬 통신  (0) 2015.06.01
Posted by 나무길 :