OS를 만듭시다. 어때요~ 참 쉽죠? (2)

나빌레라의 이미지

OS. 영어로 풀어서 Operating System. 한자어로 번역해서 운영체제. 이것을 만든다고 하면 사람들은 굉장히 어렵게 생각한다. 리눅스나 윈도우같은 OS를 비교대상으로 본다면 OS를 만드는것은 정말 어렵고 힘들고, 개인이 만들기엔 어쩌면 불가능에 가까운 도전일지도 모른다. 하지만 OS의 기본 개념들은 대학교 학부과정에서 가르칠 정도로 이미 보편화 되어 있고 그 개념 자체들은 그다지 어렵지 않다. 개념 구현을 중심으로 동작하는 것 자체에 의미를 둔 OS를 만드는 것은 어쩌면 도전 해 볼만 한 가치가 있는 시도가 아닐까.

2. LED 켜기

일반적인 임베디드 환경에서 프로세서에 연결된 LED를 켜려면 어떤 과정을 거쳐야 할까. 먼저 프로세서의 GPIO핀중 하나에 LED를 연결해야 한다. 그전에 알아 둘것은 GPIO핀에서 몇 볼트의 전압으로 전기가 나가느냐를 봐야 한다. 그것은 데이터시트를 보면 된다. 그런다음 LED가 터지지 않게 LED앞쪽에 적당히 저항을 붙여주고, LED를 +,- 방향에 맞춰 연결해 준다음, 반대쪽을 접지에 연결한다. 그리고 펌웨어등으로 해당 GPIO를 제어하는 레지스터를 세팅해서 OUT핀으로 설정하고, 해당 레지스터에 비트를 세팅해서 전압이 걸리게 만든다. 그럼 프로세서에서는 전기가 나가고 LED의 불을 켠다음 접지로 흘러들어간다. (전자공학적으로 정확한 설명인 지는 잘 모르겠다.)

우리가 타겟보드로 사용하는 이지보드에는 4개의 디버그용 LED가 붙어 있다. 그리고 이지부트가 처음 기동될때 LED가 순서대로 켜지는걸 확인함으로써 시리얼포트를 연결하기 전에 간단하게 제대로 보드가 동작하는지 볼 수 있다. 이 말은 무슨 뜻이냐 하니, 이지부트 소스안에 이지보드의 디버그용 LED를 제어하는 소스가 들어가 있다는 것이다. LED를 제어하는 전체 과정을 처음부터 프로그래밍 해도 상관이 없긴 하지만, 그 과정은 어렵다기 보다는 귀찮다. 그리고 가져다가 쓸 수 있는 코드가 있을 때는 가져다가 쓰는 것이 예의이다. :)

그럼 다시 이지부트의 소스코드를 보자, 다른 프로그램의 소스코드를 볼때는 main()함수를 먼저 보는것이 순서이다. main()함수를 쭉 보다 보면, 아래와 같은 부분이 보인다.

	printf( "\n\n");
	printf( "WELCOME EZBOOT.X5 V1.8...................for PXA255\n");
    printf( "Program by You Young-chang, fooji (FALinux Co.,Ltd)\n");
    printf( "Last Modify %s\n\n", __DATE__);
 
 
    LedBlink();

이지부트가 처음 시작할때 나오는 메시지를 출력하는 부분이 보이고, 다음에 LedBlink()라는 함수가 보인다. 함수이름에 LED가 들어간다. 어떤식으로든 LED와 관련있는 함수일것이라고 생각 된다. 해당함수의 본체를 찾아본다. 다행히 같은 main.c 파일에 있는 함수이다. LedBlink()함수의 내용은 다음과 같다.

int     LedBlink( void )
{
    int  delay = (Cfg.AutoBootWaitTime >= 2) ? 250:50;
 
    GPIO_SetLED( 0, LED_ON  ); GPIO_SetLED( 1, LED_OFF ); GPIO_SetLED( 2, LED_ON  ); GPIO_SetLED( 3, LED_OFF );
 
    msleep(delay);
 
    GPIO_SetLED( 0, LED_OFF ); GPIO_SetLED( 1, LED_ON  ); GPIO_SetLED( 2, LED_OFF ); GPIO_SetLED( 3, LED_ON  );
 
    msleep(delay);
 
    GPIO_SetLED( 0, LED_OFF ); GPIO_SetLED( 1, LED_OFF ); GPIO_SetLED( 2, LED_OFF ); GPIO_SetLED( 3, LED_OFF );
}

소스코드를 보고 동작을 유추해 보건데 4개의 LED중 첫번째 세번째가 켜지고, 두번째 네번째는 꺼지고, 약간의 시간이 지난다음에 반대로 첫번째 세번째는 꺼지고 두번째 네번째는 켜지는 동작을 반복하는 코드인듯 하다. 이 동작은 실제 이지보드가 켜지고 이지부트가 뜰때 LED의 동작과 일치 한다. 그리고 함수의 이름도 GPIO_SetLED() 여서 그냥 보기만 해도 이 함수를 이용해서 LED를 켜고 끄는건지 알 수 있다. 필요한 C 파일들은 그대로 가져 왔으므로 별다른 이변이 없는한 함수만 가져다 쓰면 나빌눅스 커널에서도 그냥 동작 할것으로 예상된다.

나빌눅스 커널의 main() 함수를 수정해 보자

#include <pxa255.h>
#include <time.h>
#include <gpio.h>
#include <stdio.h>
#include <string.h>
 
int main(void)
{
	int i = 0;
 
	printf("hello world\n");
	msleep(1000);
 
	while(1){
		GPIO_SetLED( i, LED_OFF );
		msleep(500);
		GPIO_SetLED( i, LED_ON );
		msleep(500);
		i++;
		if(i >= 4) i = 0;
	}
}

이지부트 소스의 코딩스타일을 그대로 따라서 작성했다. 아직까지도 별다르게 OS 라고 보이진 않는다. 다만 운영체제 위에서 돌아가는 프로그램이 아니라, 펌웨어처럼 동작하는 ARM 이미지 프로그램을 만드는 과정이다. 다르게 생각하면 OS라는 것은 결국 덩치크고 체계적으로 돌아가는 펌웨어일 뿐이니깐.

쓰고나니깐 이번편은 좀 짧다. 어쩔 수 없다. 원래 내용이 없다. 다음편은 좀 길것같은 예감이 든다.

이 글은 http://raonlife.com/navilera/blog/view/76/ 에 동시 연재 됩니다.

댓글

timburton9의 이미지

제목과는 다르게 쉽지 않은것 같아요.
리플 달기 두려워요.-_-;

---------------------

Spread your wings.


---------------------

Spread your wings.

나빌레라의 이미지

그래도..

달아주세요..ㅠ.ㅠ
----
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

cronex의 이미지

그래도 밥 로스 아저씨보단 더 친절하게 설명해주시는군요.... -ㅅ-;

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

jachin의 이미지

키보드로... 타닥타닥타닥... 자, 어때요? 참 쉽죠?

라고 하셨더라면... 엄청나게 화났을지도...;;;
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

upc119의 이미지

디게 어렵군요 -ㅁ-;; ㅎㅎ

책같아서 조아효~

hazemuse의 이미지

땀나는 맛이 있기에 세상은 살맛나는 것이지

땀나는 맛이 있기에 세상은 살맛나는 것이지

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.