ANSI 표준에 의한 시스템 프로그래밍

geekforum의 이미지

안녕하세요. 저는 C/C++ 언어에 무척이나 관심이 많은 학생입니다. 다름이 아니라, 저는 현재 C++의 기초를 겨우 마스터 하고, 비쥬얼 C++ 내지는 리눅스 프로그래밍을 공부하려고 준비 중입니다. 그리고 무엇보다 시스템 프로그래밍에도 관심이 있어 공부를 하려고 하는데, 문제는 시스템 프로그래밍을 위한 자료가 의외로 부족하고, 그러한 자료를 찾게 되더라도, 그 자료에 대한 신용이 가지 않는 다는 것입니다.

예를 들어, 윈도우 쪽에서 시스템 프로그래밍을 하려고 자료를 찾았더니, dos.h , bios.h 헤더 파일을 이용하여 하드웨어를 직접적으로 다루는 내용이 나오던데, 이것은 아시다시피, 윈도우와는 상관없는 이젠 퇴물이 되어버린, MS-DOS 와 관련된 자료라 현제로서 배우기엔 가치성이 떨어진다고 생각됩니다.

그리고, ANSI 표준과도 너무나도 동떨어진것 같구요. 일단은 비주얼 C 책을 이리저리 뒤졌지만, 거기서 나오는건 MFC 나 SDI를 이용한 간접적 접근방식이었습니다.

리눅스 역시 이부분에 자료 구하기가 초보자인 저에겐 어렵더군요. 서적을 구해보려 했지만, 그것은 기초적인 GCC 사용법 정도로 끝났고, KLDP에 있는 것들도 고작해야 I/O 접근 방식만 대략 설명 해놨더군요. 물론, 실용성 있는 라이브러리도 많았지만, 제가 바라는 것은 그러한 것들이 아니거든요.

간단하게 말하자면, ANSI 표준에 준하되(될 수 있으면....) 시스템 프로그래밍을 공부할수 있는 방안에 대해 묻고자 합니다. C 언어의 테두리 내에서, 여타 라이브러리를 이용한 간접적 접근방식이 아닌 직접적으로 시스템에 접근 하려면 어떻게 해야 하나요?

댓글

익명 사용자의 이미지

요즘 운영체제들은 프로그램이 하드웨어에 직접 접근해서 제어하는 길을 막고 있기 때문에, 하드웨어를 직접 제어하는 길을 찾아보아야 합니다. 이 방법은 운영체제마다 다릅니다.

도스는 여기에 관해서는 사실 편리한 점이 있습니다. 도스는 사용자 프로그램이 하드웨어에 직접 접근하는 것을 막지 않기 때문입니다. 따라서 어셈블리만 알고 있으면 얼마든지 맘대로 하드웨어를 건드릴 수 있기 때문입니다. (물론 잘못 건드리면 하드웨어가 망가질 위험도 있음)

그리고 리눅스에서는 ioperm()등의 시스템 콜을 이용해서 하드웨어에 직접 접근할 수 있는 권한을 준다고 하더군요. 그리고 리눅스의 엑스서버는 비디오 카드에 직접 접근해서 제어한다고 합니다. 리눅스에서 하신다면 이것들의 소스를 보면서 공부하는 것도 좋을 것 같네요. 양이 많아서 문제가 될 수도 있지만.

그리고 시스템 프로그래밍은 ANSI표준만 가지고는 안될 겁니다. 시스템의 민감한 부분을 건드려야 하기 때문에, 특정 운영체제의 고유한 부분을 이용해야 하는 경우가 많이 발생합니다. 그리고 시스템 프로그래밍을 할 때에는 어셈블리는 필수로 알아 두어야 합니다.

익명 사용자의 이미지

질문자체가 아직 정리가 안되어있어서....
예전의 도스시절에는 시스템 프로그램이 간단히 가능했음으로 한번에 했지만 요즘 사용하는 OS들을 사용자 프로그램이 시스템을 직접 건드리는 것을 막고 있기때문에 정상적으로 시스템 프로그램을 하려면, device driver를 설계하고 kernel 서비스를 거쳐서 test하셔야 할 것입니다. 리눅스의 경우에 디바이스 드라이버에 대해서 공부하시면 어떻게 만들고 test하는 지가 나와있구요. windows에 대해서는 device driver model이 조금씩 변해왔기때문에 사용하시려는 OS가 무엇인지에 따라서 어떻게 device driver를 만들어야 한는지를 살펴야 합니다.
그리고 자신이 만든 h/w를 쓰실 것이 아니라면 굳이 device driver를 공부하지 않으셔도 library로만 interface하셔도 무방하리라고 생각되는데요. 현재 저는 windows CE device driver를 만들고 있는데 MS의 sample들에는 이 샘플을 사용함으로 인해서 생기는 문제에는 아무런 책임이 없다는 말이 들어있네요. 믿고 짜도 되나???

익명 사용자의 이미지

제가 생각하기에 시스템을 직접 제어하시고 싶으시다면, PC쪽보다 임베디드쪽으로 알아보시는것이 좋을것입니다.
그리고 가볍게 하드웨어를 직접 제어하시고 싶으시면...레고 마인드 스톰을 추천합니다.
NQC로 프로그래밍을 하시고, 직접 돌려볼수 있습니다.
돈이 많으시면 직접 임베디드 장비를 구입하셔도 되죠.. 최소 200만원정도는 할것입니다. 학생으로선 많이 부담스럽죠.이에 비해 레고는 한50만원정도면 됩니다.
(흐~ 레고는 더이상 장난감이 아닙니다.)

PS : 하드웨어 제어는 많은 특성을 타죠. 임베디드쪽은 Intel 스트롱암 프로세서가 많이 쓰이는것 같습니다.

전 IT관련 회사에서 C++/MFC/ATL/COM 프로그래밍을 하고 있고, 대학교 2학년 2학기로 이번에 복학합니다.

익명 사용자의 이미지

mindstorm역시 레고이고, 장난감입니다. :P

최대한 간단히 조립할 수 있는 부품들, 이미 갖춰져 있는 운영체제나 프로그래밍 언어.. 궁극의 장난감임에는 분명하지만 임베디드 엔지니어로서 공부할 만한 것은 아예 없지는 않겠지만 거의 없습니다.

익명 사용자의 이미지

> 전 IT관련 회사에서 C++/MFC/ATL/COM 프로그래밍을 하고 있고, 대학교 2학년 2학기로 이번에 복학합니다.

=> 도대체 무슨 상관인지.... 그 나이에 주제 파악도 못하는 걸까..

정규현의 이미지

레고 마인드 스톰시리즈는 랭귀지와 자체 운영체제까지 가지고 있답니다.
MIT에서 개발했다고 하더군요.
( 옛날에 레고라는 언어가 생각납니다. 이게 레고 마인드 스톰시리즈와
어떤 관계인지는 정확히 모르겠지만, 상당히 비슷하다는 느낌이 듭니다. )

근디 하드웨어특성타게는 안만든 관계로
그냥 가지고 노는걸로는 모를까
이거 많이 한다고 임베디드 프로그래밍에 도움이
될지 모르겠네요...

정규현의 이미지

QT에 대한 약간의 사족을 붙이겠습니다.

QT는 본래 GUI 라이브러리입니다.
아래 어떤분이 GUI쪽을 제외하고 말씀을 하셨는데,
그건 올바른 비교가 아니라고 봅니다.

GUI쪽만 놓고 본다면 QT는 자바의 SWING이나 AWT보다도
오래됐고, 더 안정적입니다. 기능도 더 뛰어나구요.

QT를 GUI라이브러리로서 안정적으로 사용할 수 없다는
말에는 솔직히 동의할 수 없습니다.

이미 리눅스 KDE가 QT기반으로 돌아가고 있습니다.
글고, 실패하긴 했지만, 맥의 기막힌 GUI를 리눅스로
옮기려 했던 노틸러스도 QT기반입니다.

익명 사용자의 이미지

헉, 노틸러스는 GNOME 프로젝트의 일부인데 언제 KDE/Qt로
옮겼나요??? 꽈당~

정규현의 이미지

헉 그렇습니까?
제가 잘못 본 모양이네요.
죄송합니다~~~(-_-;;)

정규현의 이미지

QT를 사용한 프로그램이 돌려면 QT가 있어야죠...(^^;;)

저희가 너무나 당연히 생각하는 미려한 윈도우의
GUI도 MFC가 있기때문에 가능한 검다.

정규현의 이미지

윈2000과 XP도 기본적으로 NT4와 하위호환성을 가지고
있기때문에 posix를 지원합니다. 2000의 경우
winnt/system32안에 보시면 posix.exe가 있습니다.

XP의 경우, 확인은 못해봤지만, posix 라이브러리는
가지고 있는걸로 알고있습니다.

정규현의 이미지

토론개설하신 분의 발제문을 이제야 봤네요.(죄송)

정확히 말해 크로스-플랫폼에 대한 것은 아닌것 같습니다.
시스템에 직접 접근하는 방식에 대한 질문같은데,
C의 범위내에서 시스템 직접 접근이라고 하면
C + ASM이 첫번째 해답입니다.
웬만한 부분들은 C차원에서 시스템 접근이 이루어지지만,
부분적으로 어셈블러가 상용됩니다. 여기에서 ASM이 이용됩니다.

그리고 공부하시는 학생이라고 하셨는데,
커널이 제공하는 서비스나 기타 시스템 라이브러리 ( GCC )
말고 그냥 시스템을 다이렉트로 하시기에는 너무 장애물이
많을겁니다.

일단 하드웨어 스펙이 파악되어야 하고, 해당 CPU 어셈블러와
시스템 제어를 위한 어드레스맵등에 대한 정보들이 필요합니다.

kernelkorea.org에 가시면 기초적인 자료들은 파악이 가능합니다. 아직 국내에서 이 단계의 개발이 별로 이루어지지
않은 관계로 국내자료 참조하시기에는 상당히 어려우실거라
보입니다.

제가 발제자의 의도를 정확히 파악했다면
임베디드 시스템쪽의 해외자료를 참조하시는게
가장 좋을듯 싶습니다.

참고로 임베디드 시스템은 학부과정에서 소화하기에는
상당히 어렵습니다. 실무에서도 최소 3년이상 전문적인
경험을 쌓아야 어느정도 작업을 할 수 있는 엔지니어가
나옵니다.

국내에서 관련업체라고 하면 PDA하는 업체들
(HNT, JTel 등 )과 팜팜테크,
미지리눅스같은 임베디드 리눅스 업체가 있습니다.

가전제품의 인텔리전트화가 가속화되고 있는 관계로
전자제품을 만드는 거의 모든 곳들이 임베디드 시스템과
관련을 맺고 있습니다.

가장 큰곳은 삼성전자입니다. 가장 전문적으로
임베디드 엔지니어들을 양성하는 곳입니다.

익명 사용자의 이미지

위의 답변들은 유닉스 게열의 답변들같은데..

윈도우 시스템 프로그래밍은 전혀 틀린 방향으로 가더군요..

서점에 가면 원서들이 몇 개 있던데..

지금은 그런 원서들을 봐야 될겄같더라구요..

지금 저두 하나 보구 있는데..

programing the windows driver model 군요..

출판사는 microsoft인가..

정규현의 이미지

MS는 분명히 Windows NT 4까지는 POSIX를 지원했습니다.
사실상 MFC가 실질적인 Win플랫폼의 라이브러리가 된 상황에서
Win플랫폼에서 POSIX를 지원한다는건 그다지 큰 의미가 없습니다.
유닉스계열에서도 돌아가야 하는 특수한 어플리케이션이 아닌 다음에야
( 시뮬레이션이나 수학/화학/공학쪽 프로그램들. 왜냐 이 프로그램 쓰는 사람들은
주로 유닉스 유저니까! )
굳이 POSIX까지 고려할 필요가 없죠.

윈도우가 POSIX호환성보다는 독자적인 플랫폼으로 나간다는 말씀은
분명 맞습니다. POSIX는 급격하게 발전된 오늘날의 개발환경에는
분명 뒤져있습니다. 사실상 표준으로서 의미가 많이 퇴색된게 사실입니다.

익명 사용자의 이미지

그러면 윈도우 2000나 XP는 POSIX가 지원되지 않으신다는 말씀인가요?

그리고, NT의 POSIX 지원에 관한 자료가 있는 곳을 알고 싶습니다.

익명 사용자의 이미지

linear algebra
topology
graph theory
number theory
code theory
set theory
discrete mathmatics

and so on...

익명 사용자의 이미지

헥.. 다 영어로 적어놓으션네...

보통의 커리큘럼 --;;

1학년 : 이산수학
2학년 : 자료구조/알고리즘, 선형대수
3학년 : 컴퓨터 구조

이런식으로 하시면 상당히 도움이 될 것 같습니다. :p

익명 사용자의 이미지

죄송..
집의 모질라에선 이상하게시리 아미가 안붙어서요..
지금은 익스플로러..

신주호의 이미지

그런 경우에 저는 편집기(아무거나 한글입력 가능한걸로)
에서 글을 쓴뒤 복사, 붙여넣기로 합니다.
약간 불편하지만 한글을 많이 입력할 경우가
아니라면 다시 윈도부팅 하는 것보다는 낫죠..
토론에 관계없는 글이라서 지우셔도 관계없습니다.
이만.. 총총..

익명 사용자의 이미지

이 이래도 되는지 모르겠습니다...

제가 이 토론을 열었구....음...

기왕 이렇게 된것, 궁금한것을 여러모로 많이 묻고 싶은 욕구가 갑자기 *_*

이 토론과 관계 없는 질문을 하고자 합니다..
이점 양해까지는 안바라지만.... 저로선 무지무지 궁금한걸 지금아니면 기회가 좀처럼 없을것 같아서요..
너무 이기적인거 사죄드리구... 질문 드릴게요...

. 프로그래밍을 하다 보면, 수학적 알고리즘이 적용된다고 들었습니다..-_-;;; 그래서 고등학교때도 안해본 수학을 공부하고 따로 공부하고 있거든요.... 수학의 주로 어떤 부분들이 실제로 적용되는지 알고 싶네요...

글구, 리눅스 프로그래머가 국내에서, 프로그래머로서 자신의 기량을 마음껏 발휘할수 있는 좋은 직업이 될수 있는지도 알고 싶네요...

>>>>>프로그래머로써 죽고싶은 용훈이<<<<<

익명 사용자의 이미지

수학공부를 따로 하실 필요는 없을것 같은데요.....
새로운 알고리즘을 만들어 내는 사람이 되고 싶으시다면 말리지는않습니다 -_-
하지만 현재 만들어진 알고리즘을 배우고 싶으시다면 고등수학+이산수학
정도만 해도 되고요.... 알고리즘에서 난해한 수학이 쓰이는 경우는 알고리즘
증명에 필요하기 때문입니다.
알고리즘 잘 배우기 위해선 '수학적사고력' 만 있으면 된다고 생각합니다.

익명 사용자의 이미지

알고리즘 쪽에 관해서라면 뭐니뭐니해도 집합과 수열이 제일 많이 쓰이지 않나 싶네요.
그래프나 트리쪽의 알고리즘에서 집합이 많이 사용되구요, 컴퓨터의 기본적인 이론들에서도 많이 사용됩니다.
알고리즘 성능 해석에서는 수열이 많이 사용되죠. Big Oh notation 같은게 전형적인 얘일 것이구요.

그 밖에 어떤 응용 분야의 프로그래밍을 하느냐에 따라 여러 수학이 쓰일 수도 있습니다.
그래픽 쪽의 프로그래밍이라면 벡터가 많이 쓰이는 등 말이죠.

익명 사용자의 이미지

김용훈 wrote...
>
> . 프로그래밍을 하다 보면, 수학적 알고리즘이 적용된다고 들었습니다..-_-;;; 그래서 고등학교때도 안해본 수학을 공부하고 따로 공부하고 있거든요.... 수학의 주로 어떤 부분들이 실제로 적용되는지 알고 싶네요...

대답이 안될지도 모르겠지만 이렇게 설명해보죠.
님께서 아는 응용범위가 많을수록 프로그래밍 할 수 있는 범위도 넓어질겁니다.

컴퓨터에 국한되어서라면 별 필요가 없을수도 있겠지만,
결국은 어플리케이션의 범위가 굳이 컴퓨터에 국한될 필요가 없다고볼때,
다른 분야를 아는만큼 님의 직업군도 넓어질 겁니다.

수학을 잘 한다면 수학쪽 어플리케이션 작성이 그만큼 쉬워질테고,
생물을 잘 안다면 생물쪽 어플리케이션 작성이 그만큼 쉬워지겠죠.

정규현의 이미지

윈도우에서 POSIX 개발은 특별한 걸 사용하는건 아닙니다.
Visual C++가지고도 MFC안쓰고 POSIX 라이브러리 사용하면
POSIX표준에 따라서 개발하는 겁니다.

단 POSIX에는 GUI규정이 없습니다.
따라서 이 부분 보강이 필요한데,
MFC사용하면 POSIX준수가 아니니까 안되구,
(준수가 아니라기 보다는 다른데로 포팅이 안되니깐...)

TK나 QT같은 걸 사용해서 보강할 수 있습니다.
특히 QT는 굉장히 미려한 인터페이스에 완전 객체지향으로
구성되어 있기때문에 Visual C++로 프로그래밍 하기에
용이합니다. 속도도 괜찮구요.

다른데 포팅도 용이하고
(QT는 윈도우, 리눅스, 유닉스 등등 웬만한
플랫폼에서 다 돕니다.)

익명 사용자의 이미지

잘 몰랐었지만 QT가 VC++에서 작성이 가능하다면...

QT가 완전한 개체지향이라고 하셨는데 그렇다면 QT라이브러리로

윈32프로그래밍도 가능하다는 것이겠죠?

만약 개체지향을 공부한다고 하면 QT소스를 분석하는것이 도움될까요?

익명 사용자의 이미지

저는 지금 학부 3년생으로 어떤 벤처회사에서 알바중입니다

qt라는 걸로 windows환경에 network부분을 구현하고 있습니다.

network부분만 하다 보니 GUI쪽으로는 모릅니다.

그런데 쓰다 보니 qt가 아직 널리 쓰라고 권하기에는 좋지 않을 듯 해서

글을 씁니다.

아직 버전이 2.3.1 이고 ( 3.0 beta 2 가 발표 되었습니다만...)

지원 안 되는 것 등이 너무 많습니다. 게다라 reference 등도

java 에 비하면 너무 부실하더군요.....

(qt 에 관련되어선 www.trolltech.com 으로 가보세요...)

그리고 관련 책들도 거의 없습니다.

몇 권 있긴 한데 그렇게 볼 만하다고 생각하지는 않습니다.

정규현의 이미지

QT라이브러리로 윈32프로그래밍 가능합니다.
MFC안쓰시고 윈32 API에 QT써서 개발하시면 됩니다.
GUI가 QT로 뜨죠.

객체지향 공부정도가 어느정도인지 잘 몰라서 정확히 말씀을 못드리겠는데,
QT는 디자인 패턴이 적용된 대단히 잘 설계된 객체지향 ToolKit입니다.

소스를 분석해서 습득하실 수 있다면 대단한 실력가 되실겁니다.
단 분석자체가 쉽지 않을겁니다.

분석하시려면 객체지향과 C++, 디자인 패턴에 대한 이해가 필요합니다.

익명 사용자의 이미지

한가지만 여쭤 보겠습니다.

qt를 사용해서 win32 프로그래밍을 할 경우, 해당 라이브러리가 없는 타 PC에서도 동등하게 작동하나요? (같은 ms계열)

qt의 작동방식이 상당히 궁금하네요...

만일 엔드유저의 입장에서도 별도의 라이브러리나 자바의 jre 같이 별도의 설치없이 이용 가능하다면, 상당히 유용할 것 같은데요. :-)

익명 사용자의 이미지

밑에 많은 분들이 언급하신 것들이지만..
자료를 원하신다면.. :)

K&R, FAQ, ABC
unix system programming
advanced programming in the unix environment
unix network programming
POSIX 4
POSIX Programmer's guide (절판된 것 같습니다. -_-)
Unix System Programming for SVR4
Linux device drivers

익명 사용자의 이미지

아 .. 물론 Linux/Unix 에 관한 책들입니다. :p

저도 윈도우즈에서 플밍은 "전혀" 모릅니다.. 헥헥..

익명 사용자의 이미지

안녕하세요...^^
어느새.. 저의 의견이 올라졌내요..^^

일딴, 저의 질문에 답변해주시는 분들께 감사하다구 말하고 싶네요..^^

그럼, 많은 답변 감사 하구요...음..

밑에 POSIX 표준은 또 뭐에요...-_-a
흠냐...
워낙~ 아는게 없었어... T_T

일딴, 저도 님들의 말씀대로.. 커널에 대해서 공부 해보려고 해요..

시스템 프로그래밍이 되는데로, X - 윈도우 내지는 비주얼 C++ 을 해 볼생각이구요.. 잎딴, 프로잭트를(?) 를 하나 계획해서 만들어 볼 생각입니다...^^

틈나는데로, 다른 언어에도 관심을 가지고 열띠미 공부해야 겠네요...^^

그럼, 여러분께 감사하며..^^

ihavnoid의 이미지

아주아주 유명한 책 Advanced Programming in the UNIX Environment 에 의하면...

POSIX 라는 놈은 IEEE에 의하여 만들어진 표준 체계 중 하나이다. POSIX는 Portable Operating System Interface를 줄인 말이다. 이는 원래 IEEE 표준 1003.1-1988만을 말하였으나, 현재(1993년) IEEE는 다른 관련 표준들 까지 POSIX로 집어넣으려 하고 있다.

머 암튼 이런 식으로 한 1페이지가 넘게 나가는데요...
그냥 쉽게 말해서 'IEEE에서 제정한 표준 API' 정도라고 서술하면 될까염.... ㅡ.ㅡ

암튼... 요즘의 거의 모든(아니... 모든...인가?) Unix들이 POSIX 지원이 되니... POSIX 함수들로 프로그래밍을 할 수 있겠죵..?? (물론 Linux도 지원이 되구...)

음... 무식이 탄로나는 게 아닐 지 모르겠군요....

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

white23의 이미지

^^

저같은 경우엔 그런 자료들이 아주 많이 보이던데...
예를 들어 "The C Programming Languange"나 ABC(A Book on C)", APUE, 그리고 Linux Kernel Internals, 그리고 여러 커널 소스들과 기타등등...
아주 무쟈가 많은 책과 자료들이 인터넷에 떠있네요...
그리고 책방에도...

혹시 이런 자료 필요하시면 제게 메일 주세요...^^
그리고 어떤 분야를 원하시는지 말씀을 주시면 자료들에 관해 말씀을 드리겠습니다...

그럼... 좋은 주말 되시길...^^

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

어떠한 역경에도 굴하지 않는 '하양 지훈' - It's Now or Never!!!

익명 사용자의 이미지

안녕 하세요..^^
자료란~ 자료는 전부 제게로... 뭐든지 좋으니깐 다 보내 주세요...-_-a

소스도 좋구, 매뉴얼도 좋구...

글구, 일딴 전 음...-_-;;; 커널에 대해서 공부 해볼꺼구요...

3D 프로그래밍, 내지는 멀티미디어, 및 네트워크 관리에 관심이 많아요.... 게임제작엔 특히 관심이 많구요...-_-;;

그래서 무엇보다 시스템 프로그래밍에 매달리는 거구요...
옛날 도스 시절에 그랬듯... 다이랙트 X 같은 변변찮은 라이브러리 없이도 게임을 제작하던시절엔 전부, 시스템 프로그래밍을 이용 했더라구요...T-T
제가 생각해도 꼭 게임이 아니더라도, 시스템 프로그래밍 쪽에서 기초가 튼튼해야 뭐든 잘할수 있을것 같아서요....

모든 알고리즘, 모든 라이브러리를 파고들면 결국 공통점은 결국, 하드웨어(시스템)를 어떻게 다루었느냐 잖아요...^^
남이 만든 프로그램 또는 라이브러리의 사용법만 알고, 어떻게 짜여졌는지도 모른체 사용한다는게 저로선 다소.....

흠냐... 서론이 길었네요...-_-;;;

제 이메일 주소는뇨... greenxk@intizen.com 입니다..
자료를 보내 주신다니 넘 고맙내요...T_T
이은혜는 이담에 제가 만들어낼 프로그램의 오픈소스로서 사회에 공헌할께요...T_T, 그게 안되면, 메뉴얼을 하나 만들어서 KLDP에 올릴게요...T_T

익명 사용자의 이미지

하드웨어를 직접 제어한다면, 하드웨어마다 다 코딩해야 합니다. 예를 들어 Graphic 이면면 Riva TNT용, Boodoo용, 등등, 각 카드별로 다 직접 만들어야 한다는 것입니다. 그래서 예전 DOS에서는 각 게임별로 setup프로그램이 있고, 거기서 Graphic/Sound 를 선택해야 했었죠.

안그래도 되도록 해놓은 것이 바로 Direct-X 입니다. 하드웨어를 직접 제어하지 않고, 좀더 고 수준의 함수를 써도 각 하드웨어에 맞게 돌아가도록 해주죠.

현재는, 프로그래밍할때 하드웨어를 직접 다루지 않습니다. 아니, 요샌 직접 하드웨어에서 접근해서는 안되고요, OS에서 제공하는 것을 써야 합니다.

익명 사용자의 이미지

시스템 프로그래밍도 어떻게 보면 그 시스템에 종속적이라고 할수 있습니다.

즉 시스템에 대한 학습이 이루어지더라도 코드로 표현하는것이 결론이죠.

그전에 자료구조와 알고리즘부터 공부하시길 바랍니다.

시스템을 안다는것은 좀더 최적화된 코드를 생성하기 위한것이며,

그것의 뿌리는 결국 자료구조와 알고리즘이란것을 생각하십시오.

즉 C언어 문법안다고 C프로그래밍 잘하는것은 아니란거죠.

익명 사용자의 이미지

덧붙여서 ANSI C/C++ 에서 시스템 종속적인 것은 없습니다.
그래픽의 예를 들어서도 같은 운영체제라도 컴파일러에 따라 다릅니다.
다른 운영체제라면 말할것도 없겠죠.

너무 세부적인 구현을 생각하신다면 어셈블러와 전자공학을 보시는것이 도움될듯합니다.
아마 대부분의 C/C++ 프로그래머가 원하는 것은 운영체제에서 지원하는 저수준 라이브러리를 사용하여 시스템 프로그래밍을 하는 것입니다.

즉 OS에 대한 자료를 보는것이 더욱 도움이 된다는 생각입니다.

// 만약 플랫폼에 중립적인것이 필요하다면 자바밖에 없죠.
// 자바는 언어와 플랫폼을 동시에 포함하는것이니...

정규현의 이미지

POSIX 표준에 따라서 개발하는게 가장 근사한 답이
될것 같습니다. 실제 그렇게 많이 하구 있구요.
정확하게 POSIX표준에 따라서 개발된 프로그램은
Windows NT, OS/2, POSIX 라이브러리를 가지고 있는
유닉스계열에서 약간의 수정만으로 잘 동작합니다.

익명 사용자의 이미지

저도 POSIX표준에 대해서 알고 싶습니다.
POSIX표준에 대한 책이 한국어판으로 나온 것이 있다면, 누구 알려주십시오.
또는, 한글로 번역된 자료나, 홈페이지 등등...
정 없다면 영문 문서라도...

익명 사용자의 이미지

POSIX.4 책 사서 보십시오
real world programming 어쩌고 하면서 설명 무쟈게 나오더군요

익명 사용자의 이미지

하드웨어 제어쪽의 시스템 프로그래밍을 원하시는거 같은데... 그쪽으로 하시려면 리눅스나 유닉스 계열에서는 무조건 커널을 공부하셔야 될거 같군요...

유닉스(리눅스도 비슷하죠....) 계열에서는 시스템 하드웨어 제어쪽은 모두 커널쪽에서 담당합니다. 물론. X windows 의 그래픽 드라이버는 X서버안에서 어셈이나 C로 제어하기는 하지만 그 외의 디바이스들은 커널안에 포함된 디바이스 드라이버를 이용해서 유저들은 그냥 함수를 호출하는 식으로 프로그래밍을 합니다.

하드웨어 제어에 대한 시스템 프로그래밍을 하시려면 커널 프로그래밍과 디바이스 드라이버 제작에 대한 공부를 하심이...

그리고, 리눅스에서의 시스템 프로그래밍은 디바이스 제어쪽 보다는 커널안에 마련된 system call을 이용한 프로그래밍을 말한다고 하는게 더 알맞을 것 같습니다.

요즘은 시대가 좀 좋아져서 Embedded Linux쪽의 소스들과 솔루션이 많이 나와 있는 상태이니, 하드웨어 제어쪽을 하시고 싶으면 Evaluation board를 하나사서 그걸 제어하는 것을 공부하시는게 어떨지...

익명 사용자의 이미지

아... 표준 문제도 말씀하셨군요... 꼭 ANSI 말고도 POSIX 등과 같은 여러 표준이 있는데, 문서를 잘 읽어보시고 사용 가능한 함수인지 판단한뒤, 호환성이 떨어지는 경우 다른 플렛폼에서 대용품으로 쓰일 수 있는 걸 고려해보면 될 것 같습니다. 그렇게 하자면, 일단 여러 플렛폼에서 호환성있는 프로그램을 작성하는 데 시간을 투자해서 꾸준히 연습하는 게 필요하다고 생각합니다.

익명 사용자의 이미지

음... 제 접근 방법을 말씀 드리면, 일단 기본적 지식을 갖춘 상태에서,

1. 내가 구현하려는 기능과 유사한 기능을 하는 라이브러리나 어플리케이션을 찾는다.
2. 소스를 구해서 핵심 코드를 알아낸다. ( GPL 의 강점 )
3. 내것으로 소화한다.

다들 아시는 걸 그냥 적어놓은 것 같지만... --
꼭 시스템 프로그래밍 뿐 아니라, 모든 응용 프로그램을 그렇게 할 수 있는 것 같습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.