PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2011/04/06 01:12:28
Name RealWorlD
Subject C언어 질문입니다 :D
#include "print_string.h"

void print_it();

int main()
{
   print_it();  
}

void print_it()
{
   char *str1 = "This is user1";
   char *str2=".I'm runnig now.";

    while(1)
    {
       print_string(5,10,str1);
       print_string(5,11,str2);
       str2[0]++;
    }
}

--------------------------user_program1.c--------------------------------------
현재 'OS 커널의 구조와 원리' 라는 책을 보며 OS 만들기를 따라하는 중인데 마지막 C언어로 만든 커널이 자꾸 재부팅되면서 실행이안되네요;;
그래서 이것저것 보다가 문득 의문이든게
질문 1. 저 소스같은경우 while문을 어떻게 빠져나오죠?
보통 while(1) 같은 무한루프 경우 if ~ break; 등 조건으로 빠져나오게끔 길이 있어야되는데 저것은 아무리봐도 빠져나오는 길이 없어보이는데.. 모르겠네요;;

책에는 이렇게 설명이 되어있더군요
유저 프로그램은 한번 실행 되면 while문을 사용하여 계속 동작하게 됩니다. 두 줄의 print_string() 함수를 사용하여 문자를 출력하고, 두번째 줄의 첫 문자를 1씩 더하여 문자가 계속 변하게 합니다. 여기에서 사용한 print_string()함수는 print_string.c 에 지정되어 있습니다.
print_string.c는 말하자면 유저 프로그램의 라이브러리 입니다. 이 라이브러리는 소프트웨어 인터럽트를 걸어 커널 모드로 들어가서 문자를 출력하고 나오는 일을 합니다.

흠.. 도통 이해가 안가네요 문자출력을 다하면 인터럽트를 걸어서 빠져나온다는건가.. 그런데 그런 소스코드는 없는데..내가 무식한건지 ㅠ_ㅠ 으흉.. 도와주세용..

질문2. 메인함수가 int 형인것은 print_it()을 받기 때문인가요? (return 0; 이 없어도 0에러가 없길래..)

p.s print_string(int a, int b, char *r); 같은경우 a번째줄 b번째행에 r 문자열을 출력하는 것입니다. 어셈블리를 이용해서..아래참조

------------------------------------------print_string.c ---------------------
#include "print_string.h"

void print_string(int x,int y,char* str)
{
__asm__ __volatile__(
"push %%eax                \n\t"
"push %%ebx                \n\t"
"push %%ecx                \n\t"
"mov %0, %%eax                \n\t"
"mov %1, %%ebx                \n\t"
"mov %2, %%ecx                \n\t"
"int $0x80                \n\t"
"pop %%ecx                \n\t"
"pop %%ebx                \n\t"
"pop %%eax                \n\t"
:
:"m"(x),"m"(y),"m"(str));
}

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
11/04/06 03:02
수정 아이콘
저도 아직 프로그래밍을 공부하는 중이라 정확하게 답변을 달 수 없지만 참고가 되셨으면 합니다.

1. 프로그램이 나타내고자 하는 것이
5열 10행 : This is user1 (무한표기)
5열 11행 : .I'm runnig now. (맨앞의 '.' 글자만 계속해서 바뀜)
의 출력을 통해서 "커널이 동작중입니다." 라는 의미를 알려주기 위한 코드인 것 같습니다.
그런데 str2[0]++; 코드만 있으면 ascii 값이 계속해서 1이 더해지면서 무한으로 바뀌기 때문에 어느순간 overflow가 생기면서
컴퓨터에 오류가 생기는 것 같습니다.
str2[0]++; 코드 다음에 if(str2[0] == '9') str[2] = '.'; 를 추가해주시면 5열 11행에 출력되는 맨앞의 글자가
./0123456789./0123456789./01234..... 이런식으로 계속해서 변할 것 같습니다.
무한반복문을 빠져나와야 하는 쪽에 초점을 두시기 보다 무한반복문이 왜 사용되었는지(단순하게 커널이 동작중임을 나타냄)에 초점을 두시면 좋겠네요. 제 생각으론 책의 앞부분에 나올 법한 예제로써 커널의 개념을 잡기 위한 예제로 보입니다.

2. main() 이 정상완료가 되면 0을 반환하는 것으로 알고 있습니다. 비정상완료시 0이 아닌 값(ex: 1, -12312, 23231)을 반환하기 때문에 return 0; 을 써주는 것은 main() 이 정상적으로 종료되었다고 알려주기 위함일 뿐 필수는 아닙니다. 따라서 void main(), int main(void), int main() 등의 main함수를 작성하실 때 return 0; 을 쓰나 안쓰나 프로그램에 큰 영향을 주지 않으며 warning이나 error검출이 되지 않습니다.
하지만 OS구축에 관심이 계시다면 커널들의 상태나 리소스 관리시 실행되고 있거나 실행완료된 프로그램들이 제대로 동작하였는가를 OS가 리턴 값을 통해서 판별하는 경우가 있으므로 int를 반환하는 main함수를 작성하신다면 return 0;을 써주는 습관을 들이는 것이 좋을 것 같습니다.
지구사랑
11/04/06 16:58
수정 아이콘
소프트웨어 인터럽트는 하드웨어 인터럽트와 다릅니다. (OS가 제공하는) 일종의 function call 로 보시면 됩니다. print_string() 내부의 int 0x80 이 해당 코드입니다.

str2[0]++ 가 계속 수행되면 결국 0 이 될 텐데, null string 을 전달받은 int 0x80 이 무슨 동작을 하는지는 해당 문서를 찾아보아야 합니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
102369 웹툰좀 추천해주세요 [14] 베일2192 11/04/06 2192
102367 다이어트할때 원래 많이 피곤한가요? [7] 웰빙소고기2203 11/04/06 2203
102366 헐 엄재경 해설 공중파 언제부터나왔나요? [3] 하나2693 11/04/06 2693
102365 한달 기름값 얼마 정도 쓰시나요??? [8] 고등어3마리4509 11/04/06 4509
102363 장하준 교수님의 책을 논파하는 책이 있으면 추천 부탁드립니다. [3] cure2096 11/04/06 2096
102362 영어공부질문입니다... [2] CrazyOsoRi1807 11/04/06 1807
102361 제가 편입을 알아보고 있는데 질문좀 드릴께요. [11] DDcryst2195 11/04/06 2195
102360 C언어 질문입니다 :D [2] RealWorlD1902 11/04/06 1902
102359 타임머신을 타고 90년대 말로 돌아간다면,, 스1 어떤 종족을 선택하시겠습니까? [12] 또치2188 11/04/06 2188
102358 조금 있을 열릴 맨유경기 중계어디서 하나요? [5] Suiteman2160 11/04/06 2160
102357 아이팟터치 2세대 중고가격 얼마가 적절할까요? [2] 엄은영1859 11/04/06 1859
102356 은행 통장 재발급... [1] 아스날2456 11/04/06 2456
102355 피지알 회원분들중에 혹시 권투 배워보신분 있으신가요? [11] 바티골2116 11/04/05 2116
102354 얼굴보습제는 언제 바르는 거죠? [5] 눈물이 추적추적2375 11/04/05 2375
102352 윈도우7 식별되지 않는 네트워크 [4] 레몬커피4138 11/04/05 4138
102350 영단어 외우는 어플 있을까요?? (깜빡이 영어 대체) [6] 쪼씨2246 11/04/05 2246
102349 저도 예비군 질문드립니다. [7] 비야레알2263 11/04/05 2263
102347 북한산 산행코스 추천 부탁드립니다. [3] 드라군길들이기1600 11/04/05 1600
102346 예비군 1년차입니다. [9] EzMura2330 11/04/05 2330
102345 식목일의 공휴일 지정이 다시 필요하지않을까요? [4] Kaga2125 11/04/05 2125
102344 윈도우xp에 테마를 사용하면 속도가 느려질까요? [1] 정시레1662 11/04/05 1662
102343 인터넷상의 플짤(xxx.swf) 영상이 끊깁니다. [3] 구라타1631 11/04/05 1631
102342 신타6 같은 헬스보충제를 식사대용이나 영양제처럼 먹어도 될까요..? [4] nexon5140 11/04/05 5140
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로