운영체제 만들기는 노가다...

dopesoul의 이미지

안녕하세요. 저는 Embedded System 쪽을 열심히 공부하고있는 학생입니다.
이곳에서 심심찮게 윈도우에 필적하는 OS 개발 등의 이야기가 나오고 있는데...
그 본질에 대해서 나름대로 다루어 볼까 합니다.

저도 98년도부터 Linux 를 써왔고 Desktop 까지 쓰는 수준은 아니지만
이런 저런 개발환경을 갖추는데에 종종 이용해 왔습니다.
(사실 리눅스는 개발환경을 갖추는데 그 매력이 있다고 해도 과언이 아닌듯 싶습니다.
돈없는 개발자들에게 인기있는 운영체제죠 ^^;)
운영체제 개발은 어떤것일까 하는 막연한 동경? 비슷한것을 해오다가 최근에야
나름대로의 작업들을 해오고 있습니다.

솔직히 말해서 운영체제를 제작하는 일 자체는 그리 어려운일은 아닙니다.
컴퓨터공학부나 정보통신쪽 학부를 졸업하신 분이라면 OS 에 관련된 수업은 1개이상씩
수강하셨을 겁니다. 걔중에는 실습으로 하신분들도 있고 (최근에는 Linux Kernel 로 수업
하는 교수님들이 많이 계시더라구요) 그냥 이론으로만 배우신 분도 계실겁니다.
세마포어,데드락,스케쥴링 알고리즘구현,컴파일러 옵션관련 조정,메모리맵 구성
RAW 디바이스 드라이버 구성,인터럽트 리소스 관리 등등...
그 이론의 내용을 코드화 하는게 제작의 대부분이라 하겠습니다.
나머지는 디버깅입니다. 그리고 운영체제 제작은 하드웨어를 굉장히 잘 알고 있어야 가능합니다.
(운영체제를 제작하신다고 올리신 분을 포함해서 제작예정인 분들까지 x86 데이터시트를
얼마나 보셨는지 모르겠습니다. 운영체제는 하드웨어 base 를 굉장히 잘 닦아 놓아야 가능한
일입니다.)

Enduser 를 위한 Desktop 용 운영체제를 제작하여도 Windows 보다 인기를 끌지 못하는
것은 물론 편의성에 있다해도 과언이 아닙니다. 뛰어난 프로그래머가 Windows 에 필적
하는 환경을 갖춘 OS 를 제작한다하여도 기득권층의 실행파일 산출물들을 수용하지 못한다면
분명 대중화에는 실패할 것이고 어두운 길을 걷게 될 것입니다.
많은 개발자 분들이 의도하는 Windows Compatable 한 운영체제는 Windows API
의 재 제작을 필요로 하고, 수많은 디바이스 드라이버를 가상매핑 해줘야 하는 수고스러움이
따르겠지요. 이는 분명 OS 제작의 본질은 아닙니다...
게다가 운영체제를 제작하기 시작했으면 device driver 도 꾸준히 업데이트 해야합니다.

가끔 홈페이지를 돌아다니면서 운영체제에 관심을 가지고 몇가지 Prototype 들을 개발하신
분들을 보면 전부다 x86 용... 에 DOS 와 비슷한 Console 운영체제를 개발하시려는
분들을 많이 봅니다. (제가 본것이 작은 부분일수도 있을 것입니다) 그이상도 그 이하도
아니더군요.

먼 미래에 운영체제 개발을 목표로 하시는 분들에게 한마디 하고 싶은 말이 있습니다.

좁은 시장에 눈독들이지 말라.

앞으로는 Embedded OS 가 필요하게 됩니다. 물론 지금도 진행되고 있습니다만...
앞으로는 더 필요하게 될 것입니다.

임베디드라는 개념에 대해서 여기 계시는 분들이라면 잘 알고 계실겁니다.
이론적인 면보다 현실적인 면에서 비유하자면

"휴대폰,PDA,Play Station..."

등이 임베디드 기기에 속합니다. Windows 의 총 판매랑보다 이 임베디드 기기들로 인해
발생하는 매출이 훨씬 많습니다. 사용자가 컴퓨터 앞에 앉아 Windows 를 이용하는 시간보다
MP3 플레이어를 만지작거리고 휴대폰으로 통화를하고 PDA 로 E-book 을 보고, Play Station
을 하는 시간이 많습니다. (몇몇 분들은 컴퓨터 앞에 앉아 Windows 를 이용하는 시간이 많겠지만^^)

OS 를 제작하시려면 앞으로는 Embedded OS 에 투자를 하셨으면 하는 바램이 있습니다.
현재 국내에서 제작한 Embedded OS 는 거의 전무하다고 할 수 있습니다. 특히나 이러한 Open Source
형태로 진행되는 경우는 국내에 없다고 생각합니다.
VxWorks, Velos 등등 이미 국내 RTOS 시장도 해외 메이져사들이 점령해 가다 시피 하고 있습니다.

구글에서 rtos 를 검색해 보시면 아시겠지만 외국에서는 이미 RTOS 개발이 많이 이루어지고 있습니다.
걔중에 상업화에 성공했다고 할수있는 micro c-os(uCOS) 는 Open source 는 아니지만 개인의 취미로
시작해서 교재 및 상업 system 에 채택되고 있을만큼 완성도를 지니고 있습니다.
그외에 Sf.net 에서도 많은 rtos 프로젝트들이 진행되고 있습니다.

임베디드라는 개념을 접하려면 하드웨어가 필수적이라 사실 습득하기가 쉽지 않습니다.
프로그램만 짜는게 아니라 하드웨어에 관해서 완벽히 알아야 하니까요.
물론 x86 용 운영체제를 제작할때는 더더욱 힘듭니다.(워낙 광범위 하므로)

저같은 경우에는 AVR 이나 8051, MSP430, ARM 등의 컨트롤러에 포팅할 OS 를 나름대로 제작중입니다.

우리나라가 OS 강국이 되기 위해서는 RTOS 그중에서도 Embedded RTOS 에 투자해야하고 또 능력있는
개발자 분들도 꼭 그쪽으로 (취미이더라도) 하셨으면 좋겠습니다.

아직 확실히 정착되지 않은 분야인만큼, 파고들만한 여지가 많습니다.

다음의 키워드만 알아두셔도 도움이 될것같군요.

RTOS, 실시간운영체제, 임베디드

국내에도 RTOS 다운 RTOS 탄생이 이루어지길 바라면서...

==========
내용정정합니다.
==========

운영체제 연구실의 논문을 검색해보았더니, 'Velos 실시간 운영체제 개발에 대한 소고' 라는 것을 발견했습니다.
Velos 는 1999년 12월 서울대학교 실시간 운영체제 연구실에서 개발하고 있던 Arx 를 기반으로
제작되었습니다. 2001년 Velos 운영체제 기술이 MDS 테크놀러지 사로 이전되었습니다.
Velos 는 "The Velocity of Light Operating System" 의 뜻을 가지고 있습니다.
리눅스 커널 기반이 아니라 일부 기술을 리눅스에서 가져왔습니다.

Linux 네트워크 프로토콜 스택,
Microwindows 기반 윈도우 매니져

사실로 확인된 내용은 여기까지 입니다. 잘못된 정보로 인하여 개발자 당사자 분들에게 폐를 끼쳤다면
사과의 말씀 드립니다.

imone의 이미지

dopesoul wrote:
구글에서 rtos 를 검색해 보시면 아시겠지만 외국에서는 이미 RTOS 개발이 많이 이루어지고 있습니다.
걔중에 상업화에 성공했다고 할수있는 micro c-os(uCOS) 는 Open source 는 아니지만 개인의 취미로
시작해서 교재 및 상업 system 에 채택되고 있을만큼 완성도를 지니고 있습니다.
그외에 Sf.net 에서도 많은 rtos 프로젝트들이 진행되고 있습니다.

Micro C/OS는 Open Source 아닌가요 ?
예전에 운영체제 수업들을때 uCOS-II 커널 소스 뒤지면서 이것저것 봤던 기억이 나는데.. 아닌가 ??

naisr00t의 이미지

imone wrote:

Micro C/OS는 Open Source 아닌가요 ?
예전에 운영체제 수업들을때 uCOS-II 커널 소스 뒤지면서 이것저것 봤던 기억이 나는데.. 아닌가 ??

무조건적인 Open source는 아닙니다.
라이센스가 분명히 존재하고, 상용화하기 위해서는
fee를 지불해야 되는 것으로 알고 있습니다.

아울러 uCos 는 산업용제어쪽에서 많이 사용하고 있습니다.

naisr00t의 이미지

dopesoul wrote:

국내에도 RTOS 다운 RTOS 탄생이 이루어지길 바라면서...

국내에서 RTOS 개발한 업체가 꽤(?) 있습니다.
survey를 좀 더 해야 될 것 같네요.

운영체제가 원천 기술이기에 아울러 원천기술을 가진 업체가
또한 꽤 있습니다. 원천 기술 예를 들자면 Virtual Machine 등이
되겠지요.

제 주관적인 생각입니다만, 하드웨어를 빠삭하게 아는 것 보다, 하드웨어의 회로도는 좀 볼줄 아는게 낫고, 하드웨어관련된 데이터 시트를 달달 외우는게 개발하기가 더 빠르죠(?) 아님 편하던가. 특히, 메모리맵, 레지스터 등등... -_-

ed.netdiver의 이미지

imone wrote:

Micro C/OS는 Open Source 아닌가요 ?
예전에 운영체제 수업들을때 uCOS-II 커널 소스 뒤지면서 이것저것 봤던 기억이 나는데.. 아닌가 ??

source가 open되어있지만 상업적인 용도로 사용할 경우는
별도로 license fee가 있었던것같군요.

dopesoul wrote:

OS 를 제작하시려면 앞으로는 Embedded OS 에 투자를 하셨으면 하는 바램이 있습니다.
현재 국내에서 제작한 Embedded OS 는 거의 전무하다고 할 수 있습니다. 특히나 이러한 Open Source
형태로 진행되는 경우는 국내에 없다고 생각합니다.
VxWorks, Velos 등등 이미 국내 RTOS 시장도 해외 메이져사들이 점령해 가다 시피 하고 있습니다.

opensource project는 없을지 모르지만, 회사별로 자체적으로
개발해서 사용하고 있는 것으로 알고 있습니다.

문제는 RTOS를 어디까지의 범주로 볼것인가겠죠.
간단 scheduler수준의 nonMMU environment하에서 통신종단단말기
형태에 올릴 stack build-up이 가능한 수준은 많이들 만들어서
쓰고 있습니다.
VxWorks예를 드셨지만, 제법 오래전 자료에 대한 기억이라
좀 그렇긴 해도, 전미 RTOS market 점유율에서 Windriver가
차지하는 비율이 3%였습니다.(pSOS던가 Vertex사들이기 전이었던듯 하군요.)
그런데 황당했던건 house-made os가 50%를 넘었다는 겁니다.
즉 각자 상황에 특화해서 만들어썼단거죠.

국내에서도 MDS같은데서 만든것도 있고, 설대에서도 몇년전인가
그런걸 만들어내기도 했었습니다. 몇군데 더 있을테죠.

범주라는 측면에서 RTOS라고 하는 것이 좀 애매한 것은,
불필요한 기능이나 확장성/범용성을 추구함이 지나쳐
괜한 resource낭비가 이루어지기 십상이라는 점입니다.
아무래도 한정된 자원에서의 최적화가 목적이다보니...

LCD도 바로 붙일수 있고, 기본적인 stack도 올라있고, file system도
그럴싸하고... 붙이기 시작하면 한도 끝도 없지만,
진짜 RT라면 차라리 uCom programming이 낫습니다.
context switching을 위한 overhead도 없고, slice관리도 필요없습니다.
driver adaption layer가 줄어드니 그만큼 clock을 아낄수도 있습니다.

auto configure로 core+stack+api 뭐 이런식의 library 딱 나와주고,
할 일이라곤 bsp porting에 자체 application을 library위에 올려만
주면 되는 속편한 시스템도 좋긴 한데, 영 찝찝한건 덩치가
커지거나 내부를 알기 쉽지 않다는 점이 있습니다.
(상용일땐 더더욱)

두개를 절충한 시스템이 좋다고 봅니다.
그래서 time critical한 문제를 수행하는데는 scheduler를 꺼버리고,
단독 procedure로 동작시키고, normal operation시에만 사용하는
식으로 걍 만들어 쓰고 있습니다.

아이러니한건, 10여년전만해도 uCom programmer들끼리는
서로 "여긴 막장이야"라며 푸념하곤 했었는데, embedded라고 해서
그럴듯하게 포장되고부터는 다들 좋아라한다는 점 같습니다.

embedded쪽, 좀 과장된면이 있는것 같아 몇자 적어봤습니다.
실력을 봐도 uCom programming쪽 한 사람보다 unix계열 programmer가
더 좋더라구요^^;
아마도 software 기반이 확실한편이 더 발전할 여지가 많아서 그런듯 합니다.
아 오해는 마시구요. embedded쪽 사람이 그렇다는 일반화가 아닙니다.
제가 그렇다구요(기본기가 없단뜻^^;)

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

vacancy의 이미지

언급하신 Velos 는 아마 국산으로 알고 있습니다.
서울대에서 연구되고 만들어지다가 회사로 나간것 같고요.

uC/OS는 코드를 보시면 아시겠지만
프로그래밍을 잘 하는 사람이 만들었다는 생각은 잘 안드실겁니다.
정말 엔지니어군-_- 하는 생각이 들지요.
사이즈가 작다는 것이 장점이지 거의 토이나 진배없습니다.

하드 리얼타임 시스템의 경우는 잘 모르겠지만
대개 임베디드 시스템들도 요즘은 하는 일들이 많다보니
Linux나 WinCE도 약진하고 있어서 뭐 ;;
데스크탑과 아주 크게 구분해버릴 필요도 적어지고 있고요.
( 센서 모듈 수준이 아닌 이상은 .. ;; )

임베디드 시스템쪽 연구라면 OS말고도 할게 많을것 같습니다.
하다못해 국내에서 쓸만한 하드웨어 시뮬레이터도 나온게 없죠 ;;

ed.netdiver의 이미지

vacancy wrote:

임베디드 시스템쪽 연구라면 OS말고도 할게 많을것 같습니다.
하다못해 국내에서 쓸만한 하드웨어 시뮬레이터도 나온게 없죠 ;;

정말이지 리눅이에서 돌아가는 debugger만 있어줘도 냉큼 window
directory 지워버리겠습니다.
emacs에서 바로 연동되는 BDM이라. 어흑.ㅠ.ㅠ;
그런 몇가지 어플들이 국산화되면 참 좋겠는데...

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

dopesoul의 이미지

Velos 는 서울대에서 나온게 맞습니다.
그런데 아쉬운점은 리눅스 커널을 기반으로 만들어졌다는것.
Windriver 사의 VxWorkx 는 MDS 테크놀러지에서 수입 및 A/S 를 담당하고 있습니다.
uC-OS 는 오픈소스가아닙니다.
물론 국내에도 RTOS 를 개발하는 업체는 많습니다.
그러나 시장에서 얼마나 채택하느냐의 문제겠죠^^;
서울대를 비롯한 몇몇 대학에 실시간운영체제 연구실이 있습니다.
전무하다는 의견 정정하겠습니다.
새벽에 글을썼더니 요지가없고 흐릿한 글이 되어버렸네요.

vacancy의 이미지

dopesoul wrote:
Velos 는 서울대에서 나온게 맞습니다.
그런데 아쉬운점은 리눅스 커널을 기반으로 만들어졌다는것.

Velos는 uC/OS나 eCOS처럼
라이브러리 형태의 커널로 알고 있는데요.
리눅스 커널을 기반으로 하고도 그런 형태가 가능한가요 ?

galien의 이미지

qed wrote:

그런데 황당했던건 house-made os가 50%를 넘었다는 겁니다.
즉 각자 상황에 특화해서 만들어썼단거죠.

실제로 대부분(통계자료가 아닌 제가 접한 좁은 subset 에 대하여) 자작품을
사용하더군요.

기기 제어등의 용도로 사용되는 심각하게 비싼 크리티컬한 분야의 실시간 운영체계는
대체로 자작을 쓰더라구요.

ed.netdiver의 이미지

vacancy wrote:

dopesoul wrote:
Velos 는 서울대에서 나온게 맞습니다.
그런데 아쉬운점은 리눅스 커널을 기반으로 만들어졌다는것.

Velos는 uC/OS나 eCOS처럼
라이브러리 형태의 커널로 알고 있는데요.
리눅스 커널을 기반으로 하고도 그런 형태가 가능한가요 ?

제가 알고 있는 os가 Velos인지는 확실하지 않은데,
서울대에서 몇년전에 만든 그 OS는 POSIX 표준에 따라
완전히 자체 개발한걸로 알고 있습니다.
cross platform이 linux였는지는 모르겠지만요...

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

mach의 이미지

dopesoul wrote:

...
운영체제를 제작하는 일 자체는 그리 어려운일은 아닙니다.
...

:twisted:

dopesoul wrote:

운영체제 만들기는 노가다...

:evil:

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

dopesoul의 이미지

라이브러리 형태의 운영체제라고 하셨는데 그건 아니구요.
사실 그런 용어는 존재하지 않습니다...
단지 리눅스나 Windows , DOS 같이, Loader 가 없을
뿐이지요. 리눅스나 Windows , DOS 는 일정 규약에 따라
바이너리를 생성하고
(생성된 바이너리는 운영체제마다 Startup Code 가 다르며
메모리 구조도 다릅니다. 힙,Stack 의 설정도 틀리지요.
이는 링커가 담당합니다)
생성된 바이너리를 적절한 공간에 로딩하는 Loader.
그리고 사용자와 Loader 간의 통신을 맡는 Shell.
이렇게 구성되어 있습니다.
uC-OS 나 Velos 등의 운영체제는 그러할 필요가 없지요.

자작운영체제라 하는것은 무한루프안에 인터럽트 벡터로의 분기
또는 상태 변수들을 감시하는 Polling 방식을 이용한
Super Loop 구조 라고 합니다. 1 Thread 의 가장 간단한 비동기
운영체제라고 할 수 있습니다.

dopesoul의 이미지

내용 정정을 참고하세요.

gurugio의 이미지

좋은 말씀 감사합니다.

알려주신 키워드들에 대해 열심히 공부하고 싶습니다.

제가 얼마전부터 매우 작고 실용성은 별로 없는

실시간/임베디드용 커널을 만들려고 노력중인데요

먼저 제가 가지고 있는 하드웨어인 x86에서 시작해보려고 합니다만

키보드처리를 위한 인터럽트 처리에서 막힙니다.

이 문제만 해결하면 다른 인터럽트나 예외들의 처리에도

많이 도움이 될것 같은데요

APIC 초기화와 설정하고 x86 머신에서의 인터럽트 처리에 관해

INTEL 매뉴얼 외에 좀더 자세한 문서가 있으면

소개해주셨으면 좋겠습니다.

원리를 모르니 공개 운영체제들의 소스를 봐도 잘 이해가 안되서요.

제가 이제 곧 졸업인데 학교 공부를 소홀히 해서

말씀하신 기술들을 잘 이해를 못하고 있어서

기초가 많이 부족합니다.

그 외에도 좋은 문서가 있으면 소개해주셨으면 좋겠습니다.

dopesoul의 이미지

저는 올해 학부 1학년을 마치고 이제 2학년이 됩니다.
졸업을 앞두신분께 조언할만큼 실력자도 아니구요.^^;
저는 8bit RISC 프로세서나 ARM 등에 포팅하는것을 목적으로 하고있는터라
x86 같은 방대한 코어에 대한 문서는 가지고 있지 않네요.
그러나 제가 말씀드릴수 있는것은
x86 의 코어적인 인터럽트 루틴은 직접 건드리실수 없을겁니다.
왜냐면 BIOS 가 중간에 있기 때문이죠. 아마 BIOS 에서 마련해준
Software Interrupt Vector 를 이용하셔야 할 겁니다.
OS 제작의 정석이라는 책이 있는데, 제가 얼핏 보기로는 x86 에서
간단한 운영체제 제작에 대한 기록들을 담고있는것처럼 보였습니다.
먼저 BIOS 에 대해서 공부하시는게 우선이라 생각됩니다.
저희 학교 학부교과에 어셈블리어가 있는데, 형들이 배우는 것을 보니
gurugio 님께서 말씀하신 키보드 인터럽트 처리나, 화면갱신 등의
작업들을 하는것 같더군요. 도서관에서 어셈블리어 관련 책을 찾아보시면
아마 산더미같이 나올듯 하네요. 조금 옛날 책이라도 상관 없을겁니다.

x86 용 운영체제를 제작하시려면 일단 디버깅 툴들을 마련하시는게 좋을것
같습니다. 보기쉽게 메모리 내용을 덤프해주는 라이브러리나.
source 코드의 내용을 디버깅시 assert 할수 있는 방법
(COF binary 를 이용하는법등)
printf 함수의 제작. 등... 그리고 컴파일러는 무엇으로 하실것인지...

만약에 임베디드 시스템에 RAW 디바이스로 붙이시려면, PS/2 프로토콜을
분석하시면 될듯 하네요. 그런데 이럴려면 오실로스코프 같은 장비가 필요
할것 같네요. 개인적으로 하시려면 이건 아무래도 무리일듯.

vacancy의 이미지

dopesoul wrote:
라이브러리 형태의 운영체제라고 하셨는데 그건 아니구요.
사실 그런 용어는 존재하지 않습니다...
단지 리눅스나 Windows , DOS 같이, Loader 가 없을
뿐이지요. 리눅스나 Windows , DOS 는 일정 규약에 따라
바이너리를 생성하고
(생성된 바이너리는 운영체제마다 Startup Code 가 다르며
메모리 구조도 다릅니다. 힙,Stack 의 설정도 틀리지요.
이는 링커가 담당합니다)
생성된 바이너리를 적절한 공간에 로딩하는 Loader.
그리고 사용자와 Loader 간의 통신을 맡는 Shell.
이렇게 구성되어 있습니다.
uC-OS 나 Velos 등의 운영체제는 그러할 필요가 없지요.

자작운영체제라 하는것은 무한루프안에 인터럽트 벡터로의 분기
또는 상태 변수들을 감시하는 Polling 방식을 이용한
Super Loop 구조 라고 합니다. 1 Thread 의 가장 간단한 비동기
운영체제라고 할 수 있습니다.

혹시 uC/OS-II 포팅을 해보셨는지요 ?
Linux나 Windows 같은 형태의 커널과는 다릅니다.
라이브러리 형태의 운영체제라는 [용어]는 없겠지만
형태는 분명 라이브러리나 진배없죠.
커널과 유저 프로그램이 레이어로 나눠져있지 않거든요.
유저 프로그램[?]이 커널에 바로 링크되어 올라갑니다.
System Call 같은 것도 그냥 함수 호출이죠.

그리고 Shell 을 유저와 Loader 간의 통신을 담당하는 거라고
정의해버리기는 좀 애매한 감이 있습니다.
Shell 자체도 Load된 application이니까요.
Shell 스스로도 처리할 수 있는 것들이 많고요.

또 소위 자작운영체제도 사실 종류가 많겠죠.

vacancy의 이미지

dopesoul wrote:
그러나 제가 말씀드릴수 있는것은
x86 의 코어적인 인터럽트 루틴은 직접 건드리실수 없을겁니다.
왜냐면 BIOS 가 중간에 있기 때문이죠. 아마 BIOS 에서 마련해준
Software Interrupt Vector 를 이용하셔야 할 겁니다.

(중략..)

만약에 임베디드 시스템에 RAW 디바이스로 붙이시려면, PS/2 프로토콜을
분석하시면 될듯 하네요. 그런데 이럴려면 오실로스코프 같은 장비가 필요
할것 같네요. 개인적으로 하시려면 이건 아무래도 무리일듯.

BIOS에서 제공하는 루틴들을 사용하는 것은
real mode에서만 가능합니다.
protected mode에서는 바로 BIOS의 루틴들을 쓰지 못하죠.
( vm86 mode에서 제한적으로 사용이 가능할 것입니다. )
대개는 port에 직접 in/out하는 루틴들로
BIOS 없이도 접근할 수 있게 만들어야 할겁니다.

임베디드 시스템에 디바이스를 붙이는 경우에도
인터페이스 종류가 다양합니다.
ps/2 같은 경우는 키보드/마우스의 경우에 pc에서 쓰지만,
( ARM社의 evaluation board 중에도 있긴하더군요. )
다른 장비를 위해서 쓰이는 경우는 못봤고요.
다른 인터페이스들이 많이 쓰입니다.
ARM 계열의 경우라면 GPIO 같은 것도 있고요.
흔히 USB나 IEEE1394 같은것도 있지만, 다루기 좀 어려운듯요.
PC에서는 직렬/병렬포트도 다루기 쉬워서 많이 쓰는듯합니다.

dopesoul의 이미지

uC OS (마이크로 씨 오에스)
에서는 함수 하나가 하나의 쓰레드를 담당합니다.
그래서 라이브러리 형식의 운영체제라고 표현하신것 같네요.^^;
포팅해보셨으니 잘 아실듯...
완성된 임베디드 시스템에는 윈도우즈나, 리눅스와 같이 별도의 어플리케이션을
삽입할 필요가 없기때문에 그렇습니다.
왠만한 임베디드 RTOS 는 다 그런 방식을 채택하고 있습니다.
조금 발전된 형태로, 손쉬운 빌더를 제공하는 놈도 있습니다.
제가 얼마전에 작업했던 ETRI 에서 만든 Visual ESTO 는 2.4 커널기반에
선점형 스케쥴링 방식을 도입했던 임베디드 리눅스 빌더였는데요
포팅하기가 굉장히 쉬웠습니다.
RT Linux 나 Embedded XP 나 CE 같은 경우는 GPS, 유무선 공유기등
Application 에 치중한쪽에 잘 쓰이는 시스템이구요, 그외 항공. 군사무기
지능제어 시스템에는 주로 uCOS 같은 형태로 제공되는 놈들을 씁니다.

dopesoul의 이미지

usb 나 ieee1394 등은 장비간 통신을 위해서 쓰지는 않습니다.
호스트와 통신을 위해 주로쓰지요.
장비간 통신은 주로 RS232 나 485... SPI 통신등을 씁니다.

RedPain의 이미지

dopesoul wrote:
솔직히 말해서 운영체제를 제작하는 일 자체는 그리 어려운일은 아닙니다..

꽤 오랫동안 운영체제를 만들려고 했던 제가 듣기에는 참...좀 그렇군요.
운영체제 만드는 게 그리 어려운 일이 아니면 만들기 어려운 프로그램이 어디 있겠습니까.
그리고 운영체제 수강했다고 운영체제 만들 수 있으면 운영체제가 여기 저기 널려 있을 껍니다.
운영체제는 그 어떤 프로그램보다 최악의 디버깅 환경 속에서 프로그램을 만드는 일입니다.
아무리 원격으로 디버깅하고 에뮬레이터를 써도 그냥 재부팅 되는 경우도 많고 에뮬레이터에도 버그가 존재하는 데 디버깅이 정말 만만한 일이 아닙니다.

dopesoul wrote:
먼 미래에 운영체제 개발을 목표로 하시는 분들에게 한마디 하고 싶은 말이 있습니다.

좁은 시장에 눈독들이지 말라.


대부분 운영체제 만들려고 하시는 분들이 "시장"에는 별로 관심이 없으시더군요.
저도 마찬가지구요.
돈 벌려고 만드는 것이 아니니까요.
돈 벌려고 운영체제 만드시려는 분들은 금방 그만 두시더군요.
운영체제 만들어서 돈 번다는 게 쉬운 일이 아니니까요.
그래서 대부분 x86에서 만드시는 겁니다.
그냥 자기 PC에 돌아가는 운영체제를 만들어야지 따로 하드웨어 사는 돈 안들어 가니까요.

제가 하고 싶은 말의 요지는 그분들이 좁은 시장에 눈독을 들이고 있는 게 아니라 겁니다.

운영체제 만드는 것이 노가다나 쉬운 일이라는 표현에 좀 흥분한 것 같군요.
저도 빨리 운영체제를 만들고 싶은 데 군인이라 제한사항이 많은 것이 참 안타깝습니다.

RedPain의 이미지

dopesoul wrote:
x86 의 코어적인 인터럽트 루틴은 직접 건드리실수 없을겁니다.
왜냐면 BIOS 가 중간에 있기 때문이죠. 아마 BIOS 에서 마련해준
Software Interrupt Vector 를 이용하셔야 할 겁니다.
OS 제작의 정석이라는 책이 있는데, 제가 얼핏 보기로는 x86 에서
간단한 운영체제 제작에 대한 기록들을 담고있는것처럼 보였습니다.
먼저 BIOS 에 대해서 공부하시는게 우선이라 생각됩니다.
저희 학교 학부교과에 어셈블리어가 있는데, 형들이 배우는 것을 보니
gurugio 님께서 말씀하신 키보드 인터럽트 처리나, 화면갱신 등의
작업들을 하는것 같더군요. 도서관에서 어셈블리어 관련 책을 찾아보시면
아마 산더미같이 나올듯 하네요. 조금 옛날 책이라도 상관 없을겁니다.

real mode에서 돌아가는 운영체제 만드실 것이 아니면 BIOS는 그리 잘 몰라도 상관없습니다.
처음에 운영체제 이미지 올리는 부분에서만 쓰시면 됩니다.
아에 몰라도 가능하기는 할 것 같습니다.
바로 Protected Mode로 바꾸고 8259 세팅하고 in / out 명령으로 디스크를 읽으면 정말 열심히 하면 가능은 할 것 같군요.
아니면 Real Mode에서 바로 in / out 명령어로 해도 되겠군요.
근데 Boot Sector가 512 byte 밖에 안 되서 만만한 문제는 아닐 껍니다.
그냥 Boot Sector에서는 운영체제 이미지 올리고 Protect Mode로 변환하는 게 편합니다.
키보드 처리 인터럽트도 도서관에서 자료 찾기는 쉽지 않습니다.
어셈블리어 책에 있는 산더미 같은 자료는 전부 Real Mode용이라서...
그리고 화면 갱신은 텍스트 모드에서는 그냥 메모리 0xB8000에 쓰시면 됩니다.
한 바이트는 깜빡임, 바탕생, 글자색등 속성이고 또한 바이트는 ASCII 코드 값입니다.
그리고 인터럽트 루틴 손 안 되면 그건 운영체제라고 보기 힘들 것 같군요.

dopesoul wrote:
x86 용 운영체제를 제작하시려면 일단 디버깅 툴들을 마련하시는게 좋을것
같습니다. 보기쉽게 메모리 내용을 덤프해주는 라이브러리나.
source 코드의 내용을 디버깅시 assert 할수 있는 방법
(COF binary 를 이용하는법등)
printf 함수의 제작. 등... 그리고 컴파일러는 무엇으로 하실것인지...

http://redpain.cafe24.com/kernel-mania/home/moin.cgi/KernelDebug
많이 부족한 설명이지만 Bochs를 이용할 때 디버깅하는 방법을 제가 간단하게 설명해 놓았습니다.

dopesoul wrote:
만약에 임베디드 시스템에 RAW 디바이스로 붙이시려면, PS/2 프로토콜을
분석하시면 될듯 하네요. 그런데 이럴려면 오실로스코프 같은 장비가 필요
할것 같네요. 개인적으로 하시려면 이건 아무래도 무리일듯.

전 디바이스 드라이버 만들 때 오실로스코프는 한 번도 안 써 봤는 데 머 할 때 쓰는 거죠?
디바이스에 문제없고 연결 상태가 양호하면 그냥 in / out 할 때 디바이스가 어떻게 움직이는 지 알면 만들 수 있을 텐 데요.. ㅡ.ㅡㅋ
디바이스가 문제가 있거나 연결상태가 양호한 지 볼 때 쓰는 건가요?
gurugio의 이미지

제가 평생의 숙원 사업으로 여기는

임베디드 커널 제작을 이렇게 쉽게 이야기하시는 분이

계시네요..

정말 세상은 넓고 사람은 많습니다.

dopesoul님 제 홈페이지에 한번 놀러오세요.

http//www.asmlove.co.kr 입니다.

RedPain의 이미지

헉 어디서 많이 본 아이디다 했더니 어셈러브 주인장님이셨군요.
x86에서 운영체제 만들 때 제일 삽질 많이 하는 부분이 처음 부트로더 만들 때랑 처음 인터럽트 잡을 때 입니다.
정말 암흑같죠.
실행해 보면 컴퓨터는 그냥 반응없고... -_-;;
코드는 아무리 봐도 문제없어 보이고... -_-;;
디버거로 알 수 있는 것은 극히 제한되어 있고... -_-;;
일단 인터럽트가 먹히는 지 안 먹히는 지 확인하고 싶으시면 그냥 코드 중에 int 명령어로 확인해 보세요.
전 옛날에 이 간단한 디버깅 방법을 몰라서 한 달은 고생했습니다. -_-;;
간단하게 설명 드리면 8259 세팅하고 인터럽트 벡터 만들고 idtr에 인터럽트 벡터 주소 넣어 주시면 됩니다.
어디서 어떻게 막히셨는 지는 잘 모르겠지만 8259 관련 문서 한 번 보시구요.
http://kernel-mania.org/kernel-mania/home/moin.cgi/GeekOS_2fsetup_2easm
여기 코드 한 번 참조해서 보세요. :)

dopesoul의 이미지

평생의 숙원사업이 될만한 거리를 비하한 것은 아닙니다.
gurugio 님께서 그렇게 느끼셨다면 제가 써내려간 글에도 어느정도
문제점은 있다고 저도 생각합니다.

혹시 제가 도움이 될수 있다면 저에게 메일을 보내주시면 임베디드
커널 제작에 도움을 드릴수 있을것 같군요.
간단한 8bit,16 Core MCU 들의 하드웨어 설계방법이나 회로도
등을 드리겠습니다. 임베디드 웹서버 관련 자료라던지, Time Slice 기반
운영체제들에 대한 소개등...

nowready@naver.com

입니다. 예전에도 제가 운영체제를 공부하면서 몇번 글을 올렸던 적이
있었는데...

아무래도 임베디드쪽은 하드웨어가 어려워서 시작하지 못하는 분들이 많이
계시니까, 제가 도움이 될수 있다면 도와드리겠습니다.

shs0917의 이미지

여기서 어셈러브 주인장님을 뵙게 되는군요.. 영광입니다. 저는 간간히 OS쪽을 조금씩 곁눈질하는 정도이지만.. asmlove 꽤나 많이 기웃거리죠.. :D

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

gurugio의 이미지

dopesoul님 감사합니다.

비하하셨다는게 아니라 실력이 좋으시고

좋은 말씀을 해주셨다고 쓴거랍니다... oops

그쪽에 관련된 자료가 필요해지면 부탁드리겠습니다.

그렇지않아도 곧 모토로라 MPU로 프로젝트를 할것 같아서요..

여러분~~ 어셈러브 많이 놀러오세용~~~ lol

neu의 이미지

i386호환 운영체제 제작과 리눅스 커널 분석에 필요한 자료를 몇가지 적어보겠습니다.
i386호환 프로세서 메뉴얼은,
www.intel.com/design/pentium4/manuals에서
1. IA-32 Intel

최후의 최후까지 바짝 잡고 있어라!

dopesoul의 이미지

1번 데이터 시트가 파란책 맞나요?
저희 동아리방에도 있는데... 볼 엄두가 안나더군요.
제가봤던건 Intel x86 어쩌고였는데요, Numeric System 부터
체계적으로 가르쳐주더군요. 간단한 어셈블리까지.
그리고 매크로 어셈블러를 만드는것으로 끝났던것으로 기억합니다.

그리고 제가 x86 용 운영체제는 제작을 시도해본적도 없고, 자료를
찾아본적도 없는터라 실언을 했을수도 있습니다. ^^;

서두에서 말했듯이 저는 8bit 혹은 16bit 용 운영체제밖에 모릅니다.
그것도 아주 작은 마이크로 컨트롤러 용...

gurugio 님 모토로라 MPU 로 프로젝트를 시작하신다고 하셨는데
성공하세요~!

jenix의 이미지

dopesoul wrote:

자작운영체제라 하는것은 무한루프안에 인터럽트 벡터로의 분기
또는 상태 변수들을 감시하는 Polling 방식을 이용한
Super Loop 구조 라고 합니다. 1 Thread 의 가장 간단한 비동기
운영체제라고 할 수 있습니다.

말씀하신건 TinyOS 와 매우 흡사한데요.
센서네트웍 노드에 올려서 사용하고 있습니다.
지금 공부하고 있는건데 :oops:
참고하시라고..

www.tinyos.net

---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D

honeamis의 이미지

RedPain wrote:

x86에서 운영체제 만들 때 제일 삽질 많이 하는 부분이 처음 부트로더 만들 때랑 처음 인터럽트 잡을 때 입니다.
정말 암흑같죠.
실행해 보면 컴퓨터는 그냥 반응없고... -_-;;
코드는 아무리 봐도 문제없어 보이고... -_-;;
디버거로 알 수 있는 것은 극히 제한되어 있고... -_-;;

RedPain wrote:

전 디바이스 드라이버 만들 때 오실로스코프는 한 번도 안 써 봤는 데 머 할 때 쓰는 거죠?
디바이스에 문제없고 연결 상태가 양호하면 그냥 in / out 할 때 디바이스가 어떻게 움직이는 지 알면 만들 수 있을 텐 데요.. ㅡ.ㅡㅋ
디바이스가 문제가 있거나 연결상태가 양호한 지 볼 때 쓰는 건가요?

uP가 들어간 칩을 만들자마자 보드에 납땜해서 던져주고는 당장 어플리케이션을 돌리라고 위에서 지X하는데 정작 MDS 모니터는 멀뚱멀뚱 조용할 때....
할 수 없이 오실로스코프로 오실레이터부터 찍어봅니다.

민법 제 2 조 제 2 항 - 권리는 남용하지 못한다.

gurugio의 이미지

인터럽트 초기화를 만들고나니

긴 터널을 뚫고 나온 기분이네요..

일단 인터럽트 핸들러로 넘어오는걸 확인했으니

이제 슬슬 핸들러를 만들어야 할텐데...

인터럽트를 잘~ 처리하는 것도 정말 큰 일이네요.

인터럽트 처리랑 장치 관리에 대해서도 한참 공부좀 해야겠습니다.

커널이라는게 도대체가 쉽게 넘어가는게 없네요.

dopesoul의 이미지

다들 열심히 하시는것 같네요.^^;

MasterQ의 이미지

공부 열심히 하십시다.