강좌 & 팁
글 수 2,412
2012.09.02 11:45:46 (*.52.177.29)
43750
커널 산책 - 함수와 시스템 콜 (2)
짧게 쓰는 글은 부담이 없어서 좋습니다.
자 오늘도 아주 짧게 ..
제 정신적 스트레스도 풀겸 커널 산책을 시작합니다.
시스템 콜이 무엇인지 왜 만들어 졌는지를 오늘은 생각해 봅시다.
지금 같은 컴퓨터의 형태가 존재하던 이전 시절 부터 프로그램은 있었습니다.
아주 작은 마이컴이라고 하는 것부터 말입니다.
마이크로컨트롤러라고도 하지요
전자공학과 계열이나 제어 계열의 학생들이 쉽게 접근해 가는 계열의 컴퓨터들입니다.
예를 들면 AVR , ATMEGA128, PIC 이런것..
이쪽은 어셈블러와 C 들의 세계죠..
그리고 프로세서에 대한 이해가 있어야 다룰 수 있습니다. .
자 이분들이 작성한 프로그램은
뭐 꼭 이분들 뿐만이 아니고 여러분이 작성하는 모든 프로그램은
컴퓨터에서 동작하려면 숫자로 된 형태의 명령어와 데이터로 이루어집니다.
아주 태고적에 .. 제가 처음 프로그램을 할 때는 숫자로 코딩했습니다.
다음과 같은 코드 같은 거죠..
# hexdump -C led.bin
00000000 07 02 a0 e3 13 00 80 e3 92 0f 0f ee 14 00 9f e5 |................|
00000010 14 10 9f e5 00 00 81 e5 14 00 a0 e3 0c 10 9f e5 |................|
00000020 00 00 81 e5 fe ff ff ea 5a a9 02 00 80 81 00 7f |........Z.......|
00000030 84 81 00 7f 00 00 00 00 00 00 00 00 00 00 00 00 |................|
이게 뭐하는 프로그램인지 아시겠습니까?
이런건 매트릭스 영화에 나오는 코드들이죠
이건 컴퓨터에 있는 CPU 들만이 이해하겠죠..
아니면 기계어 코드를 외우고 있는 괴짜 분들...
전 괴짜는 아닌데 아주 태고적에는 저 숫자의 의미들을 알고 있고
그걸로 프로그램 했습니다.
16 숫자 키보드가 존재하던 시절... 쩝
아.. 향수에 젓는 군요..
정신 차리고 ...
일반인이라면 제 정신으로 위 코드 처럼 기계어로 프로그램하기 힘듭니다.
그래서 어셈블러라는 컴파일러가 등장합니다.
위 코드의 어셈블러 소스 일부는 다음과 같습니다.
ldr r0, =0x0002A95A
ldr r1, =0x7F008180
str r0, [r1]
mov r0, #((1<<2)|(0<<3)|(1<<4))
ldr r1, =0x7F008184
str r0, [r1]
b .
하하.. 여전히 모르시겠죠?
뭘하는지?
이걸 좀 바꾸어 볼까요?
#define LED_GPIO_CONFIG_REG 0x7F008180
#define LED_GPIO_CONFIG_VALUE 0x0002A95A
#define LED_GPIO_OUT_REG 0x7F008184
#define LED_GPIO_OUT_DATA ((1<<2)|(0<<3)|(1<<4))
ldr r0, =LED_GPIO_CONFIG_VALUE
ldr r1, =LED_GPIO_CONFIG_REG
str r0, [r1]
mov r0, #LED_GPIO_OUT_DATA
ldr r1, =LED_GPIO_OUT_REG
str r0, [r1]
b .
하.. 뭔가 감이 잡히나요?
LED 란 단어도 나오고. CONFIG 라는 단어도 나오고..
조금 더 알아보기 쉬워졌는데 이게 한글까지 지원하면 이런식으로 표현하면 더 쉽게 될텐데요
저를 세계 대통령에 추천하고 제가 세계 대통령이 되면 반드시 한글을 전세계 공통어화
할거구요 반드시 프로그램 언어는 한글로 쓰도록 할겁니다.
독재는 기본이지요.. 세계적 반발을 무마하려면요 ㅋㅋ
일단 한글로 썼을때 느낌을 받아 보십시오 ㅎㅎ
단 문자열_정의라는 키워드가 #define 문처럼 동작한다고 가정한 경우 입니다.
#문자열_정의 LED_환경설정_레지스터_주소 0x7F008180
#문자열_정의 LED_환경설정_레지스터_값_출력으로_정함 0x0002A95A
#문자열_정의 LED_출력_제어_레지스터 0x7F008184
#문자열_정의 LED_불_키는_데이터 ((1<<2)|(0<<3)|(1<<4))
#문자열_정의 레지스터에_값_대입 ldr
#문자열_정의 레지스터에_값_대입 ldr
#문자열_정의 레지스터값_메모리에_대입 str
#문자열_정의 레지스터에_상수값_대입 mov
#문자열_정의 이동 b
레지스터에_값_대입 r0, =LED_환경설정_레지스터_값_출력으로_정함
레지스터에_값_대입 r1, =LED_환경설정_레지스터_주소
레지스터값_메모리에_대입 r0, [r1]
레지스터에_상수값_대입 r0, #LED_불_키는_데이터
레지스터에_값_대입 r1, =LED_출력_제어_레지스터
레지스터값_메모리에_대입 r0, [r1]
이동 .
오호.. 뭐하는지 알아보시겠죠..
미국인들은 좋겠습니다. 소스만 봐도 무슨 뜻인지 아니까 ...
제가 요즘 V8 엔진에 자바스크립트에 심취해 있습니다.
더구나 한글 변수명과 한글 함수명을 쓸수 있죠..
그래서 한글로 프로그램을 재 작성하고 있습니다.
제가 짠 플랫폼이 유명해져서 쓰고 싶으면 전세계 사람들은 한글을 공부해야 할겁니다.
아.. 그날이 꼭! 와야 할텐데..
자 기계어를 어셈블러로 만들어 버림으로써 프로그래머들은 좀더 쉽게 코딩이 가능합니다.
하지만 ...
여전히 어셈블러는 어렵죠...
그래서 C 라는 언어가 만들어졌습니다.
물론 다른 언어도 목적에 따라서 만들어져 있습니다.
FORTRAN , COBOL ...
이런거 ..
하지만 운영체계에는 혜성같이 등장한 C 는 엄청난 것이죠..
프로그래머들에게 쉽게 생각하도록 했으니까요..
위 어셈블러는 다음과 같은 C 형태로 변형이 가능합니다.
#define LED_GPIO_CONFIG_REG 0x7F008180
#define LED_GPIO_CONFIG_VALUE 0x0002A95A
#define LED_GPIO_OUT_REG 0x7F008184
#define LED_GPIO_OUT_DATA ((1<<2)|(0<<3)|(1<<4))
void led_on( void )
{
volatile unsinged long *led_config;
volatile unsinged long *led_data;
led_config = (volatile unsinged long *) LED_GPIO_CONFIG_REG;
led_data = (volatile unsinged long *) LED_GPIO_OUT_REG;
*led_config = LED_GPIO_CONFIG_VALUE;
*led_data = LED_GPIO_OUT_DATA;
}
자 우리는 이렇게 함수명을 사용하고 변수를 사용하는데 기계적인 냄새가 아직은 나도
대부분 우리가 알고 있는 언어로 사용할 수 있습니다.
함수명이 led_on 이라는 것을 보면 당근 이건 led를 키라는 것을
구현한 부분이라고 추측이 가능하죠..
즉 코드가 무척 읽기 쉬어졌고 인간적인 생각을 할 수 있는 여유가 생긴거죠..
그러면서 무척 기계 친화적인 겁니다.
아..
이것이 C 언어가 운영체제 기술언어로 주로 사용되는 이유이기도 합니다.
아.. 시스템 콜 산책길은 길군요...
여기서 잠깐 벤치에서 쉬려고 합니다.
제가 저질 체력이라서.. ㅠㅠ
----------------------------------------------------------------------------------
왜 내 글에는 이렇게 오타가 많은가?
기자 : 한빛미디어에 계신 분이 그러던데
"오타대왕" 이라는 별명을 가지고 계시다던데요..
사실인가요?
유영창 : 아니 누가 그런 XXX을 .
기자 : 쓰신 책이나 글에 수 많은 오타가 있는건 사실이잖아요..
유영창 : 고의로 쓴겁니다.
오타를 일부러 쓴거죠..
기자 : 정말요? 그걸 어떻게 증명하죠?
유영창 : 제 글에 틀린 것을 한번 편집기를 통해서
고쳐보세요..
한번에 전체가 다 고쳐 집니다.
이건 증명 되었다고요...
만약 이글을 읽고 있는 분이 이 대화를 검증하기 위해서
편집기에 컨트롤 키와 알 키를 조합하고 계시다면
정말 미워 할거다...(내 글 읽지 마쇼 ㅠㅠ)
-----------------------------------------------------------------------------