2005. 11. 9. 02:40

C Standard Lib.

OldPapers/linux 2005. 11. 9. 02:40
머 리눅스에서 man 치면 더 잘 나오지만..그래도..

1. 데이터 변환 함수
2. 디렉토리 조작 함수
3. 버퍼 조작 함수
4. 파일 조작 함수
5. stream 입출력 함수
6. Low level 입출력 함수
7. Mathematics
8. 메모리 조작 함수
9. 탐색과 정렬 함수
10. 문자열 조작 함수
11. 시간 함수
12. 문자 분류 및 변환 함수
13. 기타 함수


1. 데이터 변환 함수

문자나 문자열을 수치 값으로 변환시키거나 대문자를 소문자로 소문자를 대문자로 변환하는 함수로 stdlib.h에 정의되어 있다.

헤더 파일 : #include

atof
형식 : double atof(char *string)
설명 : 문자열을 부동소수점 값으로 변환하는 함수 부동소수점으로 변환할 수 없는 문자열인 경우 0을 반환한다.

atoi
형식 : int atoi(char *string)
설명 : 문자열을 정수 값으로 변환하는 함수, 변환할 수 없는 경우에는 0을 반환한다.

atol
형식 : int atol(char *string)
설명 : 문자열을 long integer값으로 변환하는 함수, 변환할 수 없는 경우에는 0을 반환한다.

itoa
형식 : char *itoa(int value, char *string, int radix)
설명 : 정수형 숫자를 문자열로 변환하는 함수

ltoa
형식 : char *ltoa(long value, char *string, int radix)
설명 ; long integer형 숫자를 문자열로 변환하는 함수

strtod
형식 : double strtod(char *string, char *endptr)
설명 : 문자열을 부동소수점 값으로 변환하는 함수, 실패한 경우 0을 반환한다. 변환할 수 없는 문자를 만난 경우, 읽기를 중단한다.

strtol
형식 : long strtol(char *string, char *endptr, int radix)
설명 : 문자열을 long integer형 숫자로 변환하는 함수, 변환할 수 없는 문자열인 경우 0을 반환한다.

strtoul
형식 : unsigned long strtoul(char *string, char *endptr, int radix)
설명 : 문자열을 unsigned long형의 숫자로 변환하는 함수, 변환할 수 없는 문자열인 경우 0을 반환한다.


2. 디렉토리 조작 함수

헤더 파일 : #include

chdir
형식 : int chdir(char *path)
설명 : 현재 디렉토리를 주어진 경로로 바꾸는 함수

getcwd
형식 : char *getcwd(char *path, int numchars)
설명 : 현재의 작업 디렉토리의 이름을 반환하는 함수

mkdir
형식 : int mkdir(char *path)
설명 ; 주어진 경로를 사용하여 디렉토리를 만드는 함수

rmdir
형식 : int rmdir(char *path)
설명 : 주어진 경로의 디렉토리를 삭제하는 함수


3. 버퍼 조작 함수

헤더 파일 : #include

memchr
형식 : void *memchr(void *s, int c, size_t n)
설명 : 버퍼에 문자를 찾는 함수

memcmp
형식 : int memcmp(void *s1, void s2, size_t n)
설명 : 두 버퍼를 비교하는 함수

memcpy
형식 : void *memcpy(void *dest, void *src, size_t n)
설명 : 버퍼의 내용을 복사하는 함수

memmove
형식 : void *memmove(void *dest, void *src, size_t n)
설명 : 바이트 수만큼 src버퍼에서 dest버퍼로 이동시키는 함수

memset
형식 : void *memset(void *s, int c, size_t n)
설명 : 주어진 문자로 버퍼로 채우는 함수


4. 파일 조작 함수

헤더 파일 : #include

chmod
형식 : int chmod(char *path, int pmode)
설명 : 파일의 permission을 바꾸는 함수

fstat
형식 : int fstat(int handle, struct stat *buffer)
설명 : 파일의 상태 정보를 가져오는 함수

remove
형식 : int remove(char *path)
설명 : 파일을 삭제하는 함수

rename
형식 : int rename(char *oldname, char *newname)
설명 : 파일의 이름을 바꾸는 함수

stat
형식 : int stat(char *path, struct stat *buffer)
설명 : 파일의 상태 정보를 가져오는 함수

umask
형식 : unsigned umask(unsigned pmode)
설명 : 파일의ㅣ permission을 mask시키는 함수

5. Stream 입출력 함수

헤더 파일 : #include

clearerr
형식 : void clearerr(FILE *file_pointer)
설명 : stream의 에러 지시자를 지우는 함수

fclose
형식 : int fclose(FILE *file_pointer)
설명 : 파일을 닫는 함수, 정상적으로 수행되면 0을 에러가 발생되면 EOF을 반환한다.

feof
형식 : int feof(FILE *file_pointer)
설명 : 파일의 끝을 검사하는 함수, 지정된 파일이 EOF이면 0이외의 값을 반환한다.

ferror
형식 : int ferror(FILE *file_pointer)
설명 : 파일의 입출력 동안 에러가 발생되었는지를 검사하는 함수, 에러가 있으면 0이외의 값을 반환한다.

fflush
형식 : int fflush(FILE *file_pointer)
설명 : 버퍼의 내용을 파일에 쓰는 함수, 정상적으로 수행이 끝나면 0을 반환하고 그 이외에는 EOF를 반환한다.

fgetc
형식 : int fgetc(FILE *file_pointer)
설명 : stream으로부터 한 문자를 가져오는 함수, 에러 발생이나 파일의 끝인 경우에는 EOF를 반환한다.

fgetpos
형식 : int fgetpos(FILE *file_pointer, fpos_t current_pos)
설명 : stream에서 현재 위치를 가져오는 함수

fgets
형식 : char *fgets(char *string, int maxchar, FILE *file_pointer)
설명 : 파일에서 문자열을 읽는 함수, 읽어들이는 단위는 EOF나 \n을 만나거나 n-1개의 문자 길이 만큼이다. 실패한 경우 NULL을 반환한다.

fopen
형식 : FILE *fopen(char *filename, char *access_mode)
설명 : 파일을 열기 위한 함수, 에러가 발생되면 NULL을 반환한다.

fprintf
형식 : int fprintf(FILE *file_pointer, char *format_string, args)
설명 : 파일에 주어진 형식으로 데이터를 쓰기 위한 함수, 정상적으로 수행이 되면 출력한 문자의 수를 반환한다. 만약 에러가 발생되면 EOF를 반환한다.

fputc
형식 : int fputc(int c, FILE *file_pointer)
설명 : 문자를 stream에 쓰기 위한 함수, 정상적으로 수행이 되면 출력한 문자의 수를 반환한다. 에러가 발생되면 EOF를 반환한다.

fputchar
형식 : int fputchar(int c)
설명 : 문자를 stdout에 쓰기 위한 함수

fputs
형식 : int fputs(char *string, FILE *file_pointer)
설명 : 문자열을 stream에 쓰기 위한 함수, 에러가 발생되면 EOF를 반환한다.

fread
형식 : size_t fread(char *buffer, size_t size, size_t count, FILE *file_pointer)
설명 : stream으로부터 unformatted data를 buffer에 쓰기 위한 함수, 읽어들인 블록의 수를 반환한다.

freopen
형식 : FILE *freopen(char *filename, char *access mode, FILE *file_pointer)
설명 : 파일 포인터를 다른 파일에 재 할당하기 위한 함수

fscanf
형식 : int fscaf(FILE *file_pointer, char *format string, args)
설명 : stream으로부터 formatted input을 읽기 위한 함수, stream파일에서 형식대로 읽혀진 데이터 수를 반환한다. format의 형식은 scanf()와 같다.

fseek
형식 : int fseek(FILE *file_pointer, long offset, int origin)
설명 : 파일의 현재 위치에서 새로운 위치로 변경하는 함수, 정상적으로 수행했을 경우 0을 반환한다.

fsetpos
형식 : int fsetpos(FILE *file_pointer, fpos_t *current pos)
설명 : 파일의 현재 위치에서 새로운 위치로 변경하는 함수

ftell
형식 : long ftell(FILE *file_pointer)
설명 : 파일에서의 현재 위치를 가져오는 함수 에러가 발생되면 -1을 반환한다.

fwrite
형식 : size_t fwrite(char *buffer, size_t size, size_t count, FILE *file_pointer)
설명 : 버퍼에 있는 unformatted data를 stream에 쓰기 위한 함수

getc
형식 : int getc(FILE *file_pointer)
설명 : 문자를 stream으로부터 읽기 위한 함수

getchar
형식 : int getchar(void)
설명 : srdin으로부터 문자를 읽기 위한 함수

gets
형식 : char *gets(char *buffer)
설명 : srdin으로부터 라인을 버퍼로 읽는 함수

printf
형식 : int printf(int c, FILE *file_pointer)
설명 : formatted output을 stdout에 쓰는 함수

putc
형식 : int putc(int c, FILE *file_pointer)
설명 : 문자를 steam에 쓰기 위한 함수

putchar
형식 : int putchar(int c)
설명 : 문자를 stdout에 쓰기 위한 함수

puts
형식 : int puts(char *string)
설명 : 문자열을 stdout에 쓰기 위한 함수

rewind
형식 : void rewind(FILE *file_pointer)
설명 : 파일을 rewind하기 위한 함수

scanf
형식 : int scanf(char *format_string, args)
설명 : stdin으로부터 formatted input을 읽는 함수

setbuf
형식 : void setbuf(FILE *file_pointer, char *buffer)
설명 : stream을 위해 새로운 버퍼를 지정하는 함수

setvbuf
형식 : int setvbuf(FILE *file_pointer, char *buffer, int buf_type, size_t buf_size)
설명 : 새로운 버퍼를 지정하고 제어하는 함수

sprintf
형식 : int sprintf(char *string, char *format_string, args)
설명 : formatted output을 문자열로 쓰는 함수

sscanf
형식 : int sscanf(char *buffer, char *format_string, args)
설명 : 문자열로부터 formatted input을 읽는 함수

tmpfile
형식 : FILE *tmpfile(void)
설명 : temporary 파일의 이름을 가져오기 위한 함수

tmpnam
형식 : char *tmpnam(char *file_name)
설명 : temporary 파일의 이름을 가져오기 위한 함수

ungetc
형식 : int ungetc(int c, FILE *file_pointer)
설명 : 문자를 stream의 버퍼에 되돌려 주는 함수


6. Low level 입출력 함수

헤더 파일 : #include 외에 #include , #include , #include , #include

close
형식 : int close(int handle)
설명 : unbuffered I/O를 위해 열어 놓은 파일을 닫기 위한 파일, 정상적으로 수행되었을 경우 0을 반환한다. 에러가 발생되었을 경우에는 -1을 반환한다.

creat
형식 : int creat(char *filename, int pmode)
설명 : 주어진 permission을 갖는 새로운 파일을 생성하기 위한 파일, 에러가 발생되었을 경우에는 -1을 반환한다.

eof
형식 : int eof(int handle)
설명 : 파일의 끝을 검사하는 파일, 지정된 파일의 현재 위치가 파일의 끝이면 1을 반환하고 그렇지 않을 경우에는 0을 반환한다.

lseek
형식 : long lseek(int handle, long offset, int orgin)
설명 : 파일의 주어진 위치로 이동하는 함수

open
형식 : int open(char *filename, int oflag, unsigned pmode)
설명 : low-level I/O를 위해 파일을 여는 함수

read
형식 : int read(int handle, char *buffer, unsigned length)
설명 : 파일로부터 바이너리 데이터를 버퍼로 읽는 함수, 읽은 문자의 바이트 수를 반환한다. 파일의 끝일 경우에는 EOF를 반환한다. 에러가 발생되면 -1을 반환한다.

write
형식 : int write(int handle, char *buffer, unsigned count)
설명 : 버퍼에 있는 바이너리 데이터를 파일에 쓰는 함수, 정상적으로 수행되었을 경우에는 쓴 문자의 바이트 수를 반환한다. 에러가 발생되었을 경우에는 -1을 반환한다.


7. Mathematics

헤더 파일 : #intclude

abs
형식 : int abs(int n)
설명 : 정수의 절대값을 구하는 함수

acos
형식 : double acos(double x)
설명 : x의 arc cosine을 계산하는 함수

asin
형식 : double asin(double x)
설명 : x의 arc sine을 계산하는 함수

atan
형식 : double atan(double x)
설명 : x의 arc tangent를 계산하는 함수

atan2
형식 : double atan2(double y, double x)
설명 : y/x의 arc tangent를 계산하는 함수

ceil
형식 : double ceil(double x)
설명 : x를 초과하는 가장 작은 integral 값을 구하는 함수

cos
형식 : double cos(double x)
설명 : cosine을 계산하는 함수

cosh
형식 : double cosh(double x)
설명 : x의 hyperbolic cosine을 계산하는 함수

div
형식 : div_t div(int number, int denom)
설명 : nunber/denom을 계산하여 몫과 나머지로 이루어진 구조체 div_t를 반환한다.
div_t의 형식은 다음과 같다.
type struct{
      int quot;
      int rem;
} div_t;

exp
형식 : x의 exponential을 계산하는 함수

fabs
형식 : double fabs(double x)
설명 : x의 절대값을 구하는 함수

floor
형식 : double floor(double x)
설명 : x보다 작은 가장 큰 integral값을 구하는 함수

fmod
형식 : double fmod(double x, double y)
설명 : x/y의 나머지를 반환하는 함수

frexp
형식 : double frexp(double x, int *expptr)
설명 : x를 mantissa와 exponent로 분리하는 함수

labs
형식 : labs(long n)
설명 : long integer의 절대값을 찾는 함수

ldexp
형식 : double ldexp(double x, int exp)
설명 : mantissa와 exponent로 값을 계산하여 반환하는 함수

ldiv
형식 : ldiv_t ldiv(long number, long denom)
설명 : long integer를 나눗셈하는 함수

log
형식 : double log(double x)
설명 : log(x)를 계산하는 함수

log10
형식 : double log10(double x)
설명 : base 10인 x의 log을 구하는 함수

modf
형식 : double modf(double x, double *inptr)
설명 : x를 fraction부분과 integer부분으로 분리하는 함수

pow
형식 : double pow(double x, double y)
설명 : x의 y승을 구하는 함수

rand
형식 : int rand(void)
설명 : 0에서 32사이의 random 정수를 구하는 함수

random
형식 : int random(int max_num)
설명 : 0에서 max_num)사이의 random 정수를 구하는 함수

randomize
형식 : void randomize(void)
설명 : random 수를 발생시키기 위해 seed를 지정하는 함수

sin
형식 : double sin(double x)
설명 : sine을 계산하는 함수

sinh
형식 : double sinh(double x)
설명 : x의 hyperbolic sine을 계산하는 함수

sqrt
형식 : double sqrt(double x)
설명 : x의 양의 제곱근을 계산하는 함수

srand
형식 : void srand(unsigned seed)
설명 : random 수 발생을 위해 새로운 seed를 지정하는 함수

tan
형식 : double tan(double x)
설명 : x의 tangent를 계산하는 함수

tanh
형식 : double tanh(double x)
설명 : x의 hyperbloic tangent를 계산하는 함수


8. 메모리 조작 함수

헤더 파일 : #include

calloc
형식 : void *calloc(size_t num_elem, size_t elem_size)
설명 : 배열을 할당하고 모든 원소를 0으로 초기화하는 함수

free
형식 : void free(void *mem_address)
설명 : 할당된 메모리 블록을 되돌려 주는 함수

malloc
형식 : void *malloc(size_t num_bytes)
설명 : 메모리 블록을 할당하는 함수

realloc
형식 : 메모리 블록을 재 할당하는 함수


9. 탐색과 정렬 함수

헤더 파일 : #include

bsearch
형식 : void *bsearch(void *key, void *base, size_t num, size_t width, int (*com pare)(void *elem1, void *elem2)
설명 : 이진 탐색을 수행하는 함수

qsort
형식 : void qsort(void *base, size_t num, size_t width, int (*compare)(void *elem1, void *elem2)
설명 : quick sort 알고리즘을 이용하여 정렬을 수행하는 함수


10. 문자열 조작 함수

헤더 파일 : #include

strcat
형식 : int strcat(char *string1, char *string2)
설명 : 두 문자열을 결합하여 하나의 문자열로 만드는 함수

strcmp
형식 : int strcmp(char *string1, char *string2)
설명 : 문자열을 알파벳 순서로 비교하는 함수, 두 문자열이 같으면 0을 반환한다. 만약 같지 않으면 다음과 같은 값을 반환한다.

string1 < string2 이면 음수 값을 반환
string1 > string2 이면 양수 값을 반환

strcpy
형식 : char *strcpy(char *string1, char *string2)
설명 : 문자열 string2를 string1으로 복사하는 함수

strerror
형식 : char *strerror(int errnum)
설명 : 주어진 에러 번호에 해당되는 에러 메시지를 가져오는 함수

strlen
형식 : int strlen(char *string)
설명 : 문자열의 길이를 구하는 함수 이때 NULL문자는 제외하고 길이를 구한다.

strncat
형식 : char *strncat(char *string1, char *string2, size_t n)
설명 : string2의 문자를 string1 끝에 붙이는 함수

strncmp
형식 : int strncmp(char *string1, char *string2, size_t n)
설명 : 두 문자열의 처음 n개의 문자를 비교하는 함수

strncpy
형식 : char *strncpy(char *string1, char *string2, size_t n)
설명 : string2의 처음 n개의 문자를 string1에 복사하는 함수

strnset
형식 : char *strnset(char *string, int c, size_t n)
설명 : 문자열의 처음 n개 문자를 c로 만드는 함수

strrchr
형식 : char *strrchr(char *string, int c)
설명 : 문자열에서 마지막에 나오는 문자 c를 찾는 함수 만약, 해당되는 문자가 발견되지 않은 경우에는 NULL을 반환한다.


11. 시간 함수

헤더 파일 : #include

asctime
형식 : char *asctime(struct tm *time)
설명 : struct tm 형식의 시간을 문자열로 바꾸는 함수

clock
형식 : clock_t clock(void)
설명 : clock tick으로 경과된 시간을 가져오는 함수

ctime
형식 : char *ctime(time_t *time)
설명 : 이진 시간을 문자열로 바꾸는 함수

difftime
형식 : double difftime(time_t time1, time_t time2)
설명 : 두 시간 사이의 차를 초단위로 계산하는 함수

gmtime
형식 : struct_tm *gmtime(time_t *time)
설명 : Greenwich Meam Time(GMT)을 tm structuregudtlr으로 가져오는 함수

localtime
형식 : struct tm *localtime(time_t *time)
설명 : local time을 tm structure형식으로 가져오는 함수

time
형식 : time_t time(time_t *timeptr)
설명 : GMT 1970년부터 경과된 현재 시간을 가져오는 함수


12. 문자 분류 및 변환 함수

헤더 파일 : #include

isalnum
형식 : int isalnum(int c)
설명 : c가 alphanumeric이면 참값을 반환

isalpha
형식 : int isalpha(int c)
설명 : c가 letter이면 참값을 반환

isascii
형식 : int isascii(int c)
설명 : c가 ASCII이면 참값을 반환

iscntrl
형식 : int iscntrl(int c)
설명 : c가 control 문자이면 참값을 반환

isdigit
형식 : int isdigit(int c)
설명 : c가 decimal digit이면 참값을 반환

isgraph
형식 : int isgraph(int c)
설명 : c가 graphic c문자이면 참값을 반환

islower
형식 : int islower(int c)
설명 : c가 소문자이면 참값을 반환

isprint
형식 : int isprint(int c)
설명 : c가 인쇄 가능한 문자이면 참값을 반환

ispunct
형식 : int ispunct(int c)
설명 : c가 punctuation 문자이면 참값을 반환

isspace
형식 : int isspace(int c)
설명 : c가 공백 문자이면 참값을 반환

isupper
형식 : int tsupper(int c)
설명 : c가 대문자이면 참값을 반환

isxdigit
형식 : int isxdigit(int c)
설명 : c가 hexadecimal digit이면 참값을 반환

toascii
형식 : int toascii(int c)
설명 : c를 ASCII로 변환하는 함수

tolower
형식 : tolower(int c)
설명 : c를 소문자로 변환하는 함수

toupper
형식 : int toupper(int c)
설명 : c를 대문자로 변환하는 함수


13. 기타 함수

다음은 화면 제어에 관한 라이브러리 함수들이다.

헤더 파일 : #include

clreol
형식 : void clreol(void)
설명 : 커서의 현 위치 행을 지우는 함수

clrscr
형식 : void clrscr(void)
설명 : 현재 사용 중인 윈도우를 지우고 커서를 왼쪽 상단으로 이동시키는 함수

deline
형식 : void deline(void)
설명 : 커서가 있는 행을 삭제하는 함수

gettext
형식 : int gettext(int left, int top, int right, int bottom, void *dest)
설명 : 지정된 텍스트 화면의 내용을 dest로 읽어 들이는 함수

gettextinfo
형식 : void gettextinfo(struct text_info r)
설명 : 현재의 텍스트 모드의 정보를 구조체 r로 읽어 들이는 함수, 구조체의 r의 형식은 다음과 같다.

struct text_info {
      unsigned char currmode;
      unsigned char screenheigh;
      unsigned char screenwidth;
      unsigned char normattr;
      unsigned char winleft;
      unsigned char wintop;
      unsigned char winright;
      unsigned char winbottom;
      unsigned char curx;
      unsigned char cury;
} *r;
2005. 11. 9. 02:15

ELF format

OldPapers/linux 2005. 11. 9. 02:15



The Executable and Linking Format (ELF)


 


The executable and linking format (ELF) was originally developed by Unix System Laboratories and is rapidly becoming the standard in file formats[8]. The ELF standard is growing in popularity because it has greater power and flexibility than the a.out and COFF binary formats[3]. ELF now appears as the default binary format on operating systems such as Linux, Solaris 2.x, and SVR4.  Some of the capabilities of ELF are dynamic linking, dynamic loading, imposing runtime control on a program, and an improved method for creating shared libraries[3]. The ELF representation of control data in an object file is platform independent, an additional improvement over previous binary formats. The ELF representation permits object files to be identified, parsed, and interpreted similarly, making the ELF object files compatible across multiple platforms and architectures of different size.

The three main types of ELF files are executable, relocatable, and shared object files. These file types hold the code, data, and information about the program that the operating system and/or link editor need to perform the appropriate actions on these files. The three types of files are summarized as follows:




  • An executable file supplies information necessary for the operating system to create a process image suitable for executing the code and accessing the data contained within the file.


  • A relocatable file describes how it should be linked with other object files to create an executable file or shared library.


  • A shared object file contains information needed in both static and dynamic linking.


In the next section we overview the ELF file format including a detailed description of each of the five section types that an ELF file might include. These five types are (1) the ELF header, (2) the program header table, (3) the section header table, (4) the ELF sections, and (5) the ELF segments. In Section 2.4.2, we describe the representation of data in an ELF file. The interested reader may consult reference [8] for additional information about the ELF format.



 

2005. 11. 3. 17:58
출장나온지...한달째...아니 넘었따....

추석때 잠깐 들어갔다 나온걸 빼면..

두달이 넘었다...

집에 가고프다...ㅠ.ㅠ

집에 보내줘....ㅠ.ㅠ..

이번 출장은 여러가지 우여곡절도..많고.

기억하기 싫은 것도 있고..

여러가지 많은 일들이..일어난다...

집으로 가고 싶다..............
2005. 10. 26. 07:37
지친다...

요즘은 정말 재미도 없고.. 즐거움도 없다..

그나마 재밌게 이야기할 사람도..없고...

일정은 길어지고...문제는 많아지고..

그로기한 하루들...

졸립다...

잠이나 자야지..
2005. 10. 20. 03:43
살아가다 보면 여러 사람들을 만난다..

정말 이상한 사람들도 만나고...정말 좋은 사람들도 만나고..

좋은 사람을 보면.. 보는 것으로도 정말 즐겁다..

이번 출장에서도...

한명을 봤다.. 그 사람을 잘 아는 건 아니지만..

그래도 느낌이 굿!....좋아보였다..

수많은 사람들 중에.. 이렇게 볼 수 있는 건

어쩌면 행운이지 싶다...

다시 만날수 있을까......
2005. 10. 12. 07:12

OldPapers/ordinary_life 2005. 10. 12. 07:12
이제 조금 진정되는 듯..싶다..
뭘 먹었는지...
탈이 나서... 밑으로만 좌르르륵...ㅠ.ㅠ
밥도 못먹고... 단지 죽으로만....

이제 좀 나아지는 듯 싶다..

타지에서 병원에 갈수도 없고 참 난감하다...
2005. 10. 9. 19:32
나는 여러개의 Nick을 사용한다.

예전엔 eph(ephorn)을 사용하였고...
그보다 더 전엔 milkywood를 사용하였다..

그리고 지금은 Airen이다.

나는 여러개라고 내가 특별하다거나..

각각의 Nick을 특별히 구분짓지는 않는다.

내 느낌이 가는 대로..

내 생각이 이끌리는데로..

사람은 때때로 우리가 항상 해왔던 것.
우리가 항상 하던것에
익숙해진 것에 갖혀 잊는 것들이.. 있다.

나는 그 속에서 다른 것들을 뒤져보고 있다.

그것이 바로 나의 identity이다..
2005. 9. 26. 11:35
Inline함수는 간단한 함수를 inline으로 정의하여 사용한다.
이것은 컴파일 단계에서 인라인 함수 안의 코드로
치환되어 사용되어진다.

그러므로 일반 함수 call시의 overhead( funtion call stack, funciton local variable)가 없다.그러므로 실행속도의 향상 효과를 얻을 수 있다.

그러나 inline함수 사용시 자주 사용되면서 그 코드가 클 경우
일반 함수를 사용하는 것보다 비효율적이고 코드의 크기가 너무 커질 우려가 있다.
2005. 9. 26. 11:29

Gvim Ctags

OldPapers/linux 2005. 9. 26. 11:29
GVIM 및 CTAG 활용



Download files

http://vim.sourceforge.net        ->   gvim63.exe    

http://ctags.sourceforge.net    ->   ec554w32.zip



윈도우용 VI(GVIM)

1. gvim63.exe(Ver. 6.3)를 설치합니다. (native language를 지원해서 한글로 메뉴가 나옵니다)



2. ctags.exe(Ver. 5.5.4)를 gvim이 설치된 곳인 C:\Program Files\Vim\vim63\에 복사합니다.



3. 환경변수 PATH 설정

[내 컴퓨터 -> 속성 -> 고급 -> 환경변수 -> 시스템 변수 -> Path - 편집]에서 맨 끝에 gvim을 설치한 곳을 추가합니다.

    예) ;C:\Program Files\Vim\vim63\

4. gvim 환경 설정


C:\Program Files\Vim\_vimrc 파일을 수정하면 기본 설정을 변경할 수 있습니다.

파일의 맨 앞줄을 "로 시작하면 주석 줄로 인식합니다. (C/C++ 의 '//' 혹은 기타 쉘의 '#')



다음의 라인을 추가합니다.

set nocp "오리지널 VI와의 호환성을 없애고, VIM 만의 기능들을 쓸 수 있게 함. (compatible)

syntax on "언어에 따른 자동 문법, 구문의 색을 다르게 표시.

filetype on "파일의 종류를 자동으로 인식.
colorscheme torte "컬러스킴을 변경.

set ru "화면 우측 하단에 현재 커서의 위치(줄, 칸)를 표시. (ruler)

set sc "완성중인 명령을 표시.

set nu "라인 번호를 표시.

set vb "키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍임. (visualbell)
set hls "검색된 스트링의 하이라이트. (hlsearch)

set ci "C 형태의 들여쓰기. (cindent)
set ai "자동 들여쓰기. (autoindent)
set si "좀더 똑똑한 들여쓰기. (smartindent)

set sw=4 "자동들여쓰기를 4칸으로 설정. (shift width)

set ts=4 "tab 간격을 4칸으로 설정. (tab stop)



다음의 라인은 필요시에만 추가합니다.

set backupdir=C:\Backup "백업 파일을 저장할 디렉토리를 설정.

set bs=indent,eol,start "백스페이스 사용.

set sol "여러가지 이동 동작시 줄의 시작으로 자동 이동.

set ch=1 "맨 아래 보이는 명령줄의 높이를 설정, 기본 값은 1
set km=startsel,stopsel "SHIFT 키로 선택 영역을 만드는 것을 허용.

set sel=exclusive "비주얼 모드에서의 동작 설정.

set scs "똑똑한 대소문자 구별 기능 사용.

set hi=50 "명령어 기록을 남길 개수 지정. (history)

set sts=0

set nows "검색시 파일 끝에서 처음으로 되돌리기 안함.
set noet "탭 -> 공백 변환 기능 사용안함.

set sm "가로 닫기 괄호를 사용할 때 일치하는 가로 열기 괄호를 보여줌.

set nobackup "백업 파일을 만들지 않음.
set encoding=cp949 "인코딩을 설정

set fenc=utf-8

set fenc=unicode



"GUI 이면, 시작시 크기 설정

if has("gui_running")

    set lines=89

    set co=114

endif



5. 분석할 소스의 tags 파일 생성

분석할 소스 트리의 루트로 이동합니다.

예) test_src 소스를 c:\test_src>에 풀어 놨다고 가정합니다.

소스의 루트 디렉토리에 vi.bat 파일을 만들고 메모장으로 열어서 다음과 같이 입력합니다.



ctags -R . ------------------------- ① -R과 .(dot)를 사이에 스페이스가 있습니다.
gvim -S Session.vim ---------------- ②



① 소스의 루트 디렉토리에 tags 라는 파일이 생성됩니다.

    1. vi.bat를 실행할 때마다 매번 tags 파일이 갱신됩니다.

    2. 소스의 내용이 변경되지 않는다면  ① 번 라인을 제거합니다.

    3. 소스의 내용이 방대할 경우 tags 파일을 만드는 데 오랜 시간이 걸리므로 ① 번 라인을 제거하고

         tags 파일을 갱신하고자 할 때 gvim에서 [도구 - 꼬리표 만들기]로 tags 파일을 만들어 줍니다.
② 소스의 루트 디렉토리에 Session.vim 파일이 존재할 경우 읽어옵니다.

    1. Session.vim 파일은 vi의 분할된 화면 상태를 저장합니다.

    2. gvim에서 [창 - 파일 익스플러로 나누기], [창 - #으로 나누기], [창 - 세로로 나누기] 등으로 화면을 분할한 후

        세션을 저장하면 Session.vim 파일이 생성됩니다.



VI에서 ctags 활용

^](ctrl + ]) 또는 g^] 다른 파일에 속한 단어의 정의 부분으로 찾아갑니다.
^T(ctrl + t) 다른 파일에서 다시 돌아옵니다.

[i 함수 프로토타입 확인합니다.



찾고 싶은 keyword를 현재 cursor 위치에 놓을 수 없는 경우

:tj keyword

:ta keyword




같은 keyword에 대해 여러곳에서 선언된 경우에는

tag 1 of 2 or more 과 같은 메시지가 뜨는 것을볼 수 있습니다.

이것은 해당 keyword에 대한 tag가 여러개 있다는 의미입니다.

그 keyword 위에서 g]를 입력하면 VIM은 tag list를 나열한 후 선택할 수 있도록 해 줍니다.

:tn Next tag search

:tp Previous tag search




태그파일 위치지정

여러 tag 파일들을 동시에 참조를 할 수 있으며 keyword를 아래 tags 파일에서 순서대로 search합니다.



set tags=./tags,../tags,../include/tags,/usr/include/tags


작업할 directory에 _vimrc 파일을 만들어 위의 line을 넣고 vim을 실행시키면 home의 _vimrc를 읽은 후에 현재 directory의 _vimrc를 읽게 됩니다. 만약 vim이 현재 directory의 _vimrc를 읽지 않는것 같다면 :set all 하셔서 noexrc가 설정되어 있는 지 확인해 보시기 바랍니다. exrc이어야 local디렉토리의 _vimrc를 읽습니다. 만일 noexrc라면 C:\Vim/_vimrc에 set exrc 를 넣어놓으면됩니다.



좀더 자세한 사항을 알고 싶으면?

:help tags
:help g]
:help :tjump
:help :sts
:help :tn

반드시 :help tags를 해서 대충이라도 읽어보시기 바랍니다. 많은 유용한 명령들이 있습니다.



같은 단어 반복 찾기

커서위에 있는 같은 단어를 찾아 이동합니다.
* 아래로 갈 때

# 위로 갈 때는



gd를 누르면 열려있는 file에서 커서위의 단어가 정의되어 있는지 확인하여 있으면 가고 없으면 현재 자리에서 선택된 대로 있습니다. 그 상태에서 n을 누르면 아래로 이동하고 N을 누르면 위로 이동합니다. 그리고 gd를 눌러서 해당 단어의 선언이나 정의만 보고 다시 제자리로 오고 싶으면 '(엔터옆 따옴표)를 두 번 누르면됩니다.



파일이 탭으로 작성되었는지 확인 하기

:set list





중복된 여러개 선언이 있을때 예를 들어서 i386/arm/mips/alpha 등 플랫폼에서 모두가 선언하였을때 tag이동은 올바로 가는 경우가 거의 없죠. 그럴때는 g + ctrl + ] 로 리스트를 뽑아서 이동하세요.





Usage: ctags [options] [file(s)]

-f <name> Write tags to specified file. Value of "-" writes tags to stdout ["tags"; or "TAGS" when -e supplied].

-h <list> Specify list of file extensions to be treated as include files. [".h.H.hh.hpp.hxx.h++"]

-R Equivalent to --recurse.



Usage: vim [arguments] [file ..]

2005. 9. 26. 11:27

RTOS

OldPapers/linux 2005. 9. 26. 11:27
이번에는 RTOS에 대하여 개괄적으로 정리해보려 하였습니다.

그런데 너무 무모한 도전이었던 것 같아 조금 후회되네요.. ^^ 워낙 방대하고 전문적인 내용도 많아 소화가 잘 안되는군요 ^^ 일단 나름대로 정리해보고, 다음 기회에 좀더 보충해볼 생각입니다.





RTOS( Real-Time Operating System)


RTOS란?
RTOS(Real-Time Operating System)는 Real-Time (Embedded) System을 위한 운영체계이다. 따라서 먼저 Embedded System과 Real-time System의 정의를 이해할 필요가 있다.

Embedded System
정의
마이크로프로세서 혹은 마이크로 컨트롤러를 내장하여(embedded)  미리 정해진 기능만을 수행하는 장치

cf) PC처럼 사용자가 프로그램을 바꿔가며, 여러 가지 용도로 활용할 수 있다면 그 시스템은 embedded system으로 분류하지 않는다.

응용분야
정보가전, 정보단말, 통신장비, 항공/군용, 물류/금융, 차량/교통, 사무, 산업/제어, 의료, 게임

Real-Time System
정의
“예고 없이 불시에” 발생하는 이벤트에 대하여 “정해진 시간” 내에 “정확한 결과”를 제공하되, 그 응답시간이 “예측가능”하고 일정해야 하는 시스템

즉 시간 상의 제약(Time Correctness, 시간적 정확성)이 중요시되는 시스템이다.

종류
Hard Real-Time System : deadline을 넘기면 처리가 의미 없음

Soft Real-Time System : deadline을 넘기더라도 여전히 처리는 의미 있음, 그 가치는 떨어짐

Real-Time Embedded System
정의
Real-Time 요건을 충족하여야 하는 Embedded System.

범위
대부분의 컨트롤 시스템은 Real-Time Embedded System.

ex) ID 체크 보안시스템, 공장 로봇, ATM(Automated Teller Machine)

RTOS
정의
Real-Time 성격의 어플리케이션을 개발/수행하기 위한 OS.

cf) 많은 RTOS는 Real-Time Embedded System을 위해 설계되고 사용되고 있다.

왜 RTOS가 필요한가?
Real-Time Embedded System을 개발하기 위해, 멀티태스킹과 같은 기능이 중요해지고 있는데, 기존 범용 멀티태스킹 OS는 시간적 정확성을 보장해주지 못해, 이를 지원해주는 RTOS가 필요하다.

멀티태스킹의 필요성
Real-Time Embedded System의 기능이 점점 복잡해져,  S/W 개발과 유지보수가 점점 어려워지고,  더 많은 시간과 비용이 필요해지고 있다. 이를 해결하기 위해,  시스템의 기능을 “순차적으로 실행되는 하나의” 프로그램으로 구현하는 대신, 여러 개의 task(multi-task)로 분할하여 개발할 필요가 있다.

멀티태스킹의 형태로 개발하면 다음과 같은 잇점이 있다.

1) 코드의 개발, 수정, 유지, 보수가 보다 용이하다.

2) 이벤트에 대해 보다 신속하게 응답할 수 있다.

( interrupt가 발생하면, 진행 중인 task 대신 interrupt를 처리할 task를 우선적으로 실행할 수 있다. )

3) 시스템의 신뢰도와 성능을 높일 수 있다.



cf) Real-Time Embedded System에서의 멀티태스킹:

범용 시스템의 경우, 멀티태스킹은 서로 무관한 여러 작업( ex. word, email, media-player)을 동시에 수행하는 것을 말한다. 그러나 Embedded System의 경우는 하나의 임무를 수행하기 위해, 동시에 수행되어야 하는 여러 task를 수행하는 것을 말한다. 즉 이들 task들은 하나의 어플리케이션을 구성하는 모듈(부품)이 된다.

멀티태스킹 OS의 필요성
멀티태스킹은 다음과 같은 까다로운 문제를 일으킨다. 이들 문제는 직접 해결하기 보다는 OS를 도입하는 것이 훨씬 효과적이다.

1) task간 경쟁의 관리

2) 데드락

3) 우선순위 역전( priority inversion )

4) 재진입 문제( Reentrancy )

5) task간 통신



ex) ADSL Router

ADSL Router의 경우에, PPP, IP, TCP/UDP 프로토콜을 처리하면서, 동시에 라우터 간의 동기화를 위해 RIP 메시지를 주고받아야 하고, 시스템 관리 정보를 주고받기 위해 SNMP 메시지도 발송하는 등의 여러 task들을 동시에 수행하고 있다. 이것을 multitasking을 지원하는 OS의 도움 없이 “하나의 프로그램”으로 작성할 경우, 이 프로그램은 심각하게 복잡해진다.

RTOS의 필요성
기존의 범용 멀티태스킹 OS의 경우,  상대적으로 시간에 엄격하지 않아, Real-Time 요건을 만족시키기엔 부적합하다.

범용(상용) OS와의 차이점
범용 OS는 하드웨어 자원을 효율적으로 사용하고, 얼마나 공평하게 분배할 것인가에 초점을 맞추는데 비해, RTOS는 우선순위가 높은 Task가 보다 많은 자원을 할당하고, 하드웨어 자원의 낭비를 감수하더라도, 작업의 시간제한에 맞추는 것에 초점을 둔다.

RTOS 역할의 확대
지금은 멀티태스킹 뿐 아니라, Network, File System, GUI와 같은 다른 OS 서비스에 대한 필요성도 강조되고 있다.



RTOS는 뭘 갖추어야 하는가?
RTOS는 real-time을 보장해주는 것 뿐 아니라, embedded system환경에 맞는 특성을 갖추어야 한다.

시간적 정확성을 보장하는 멀티태스킹
멀티태스킹 환경에서 모든 OS 서비스 호출과 interrupt에 대한 반응시간의 최대값(WCET, worst case execution time)을 보장할 수 있고,  실행시간의 편차가 작아야 한다. 즉 작업 소요시간을 예측할 수 있어야 한다.

또한 최적화된 성능을 제공하되, 우선순위가 높은 일이 우선적으로 자원을 분배하여, 시간 제한 내에 끝날 수 있도록 해야 한다.

높은 신뢰도와 가용성
Embedded system은 범용 시스템에 비하여, 오작동하거나, 중지되었을 때, 치명적인 경우가 많아 높은 신뢰도와 가용성이 필요하다. 따라서, RTOS 역시 기능은 다소 적더라도 신뢰도와 가용성 확보가 중요하다.

ex. 의료용 X선 장비의 오작동으로 환자 사망.  화성탐사선 제어시스템의 오작동 혹은 중단으로 탐사선 분실.
원자력 발전소 냉각장치 컨트롤러의 중단 등…



작고 유연한 구조
Embedded System의 H/W는( CPU, 메모리 등) 그 사양이 일반적인 컴퓨터 시스템에 비해 열악하다. 따라서 RTOS가 Embedded System 을 지원하기 위해서는 최소의 자원(이를테면 2KB에서 10KB정도의 메모리공간)만을 활용하여 작동할 수 있어야 한다.

또한 각 시스템에 적합한 OS 서비스를 선별적으로 설치하여, 작은 크기를 유지하면서도 다양한 요건에 대응할 수 있어야 한다.



이식성
일반적인 컴퓨터 시스템에 비해 Embedded System은 그 H/W 구성이 훨씬 다양하다. 범용컴퓨터의 CPU는 Intel x86, PowerPC , Sparc 등 몇 가지 유형 중 하나를 사용하지만, Embedded System의 경우, Intel x86, Motorola 6800계열, ARM, StorngARM, MIPS, PowerPC 등 훨씬 다양하다.

RTOS는 이러한 다양한 환경 위에서 작동할 수 있는 이식성을 갖추어야 한다.

ex. VxWorks RTOS의 경우에는 20가지 이상의 CPU지원

RTOS의 기술 요소
RTOS로서 갖추어야 할 요건을 제대로 갖추기 위하여 RTOS에는 다음과 같은 기술들이 적용된다. ( 그러나 이들 기술이 항상 모두 사용되는 것은 아니고 경우에 따라 선택적으로 사용된다. )

우선순위 기반 스케쥴링
시간적 정확성을 보장하는 멀티태스킹

실행 중에 task에 자원을 공평하게 배분하기 보다는, 임무를 완수하는데 보다 중요한 task를 시간 내에 수행하는 것이 중요하므로, task간의 우선순위를 부여한 후, 그에 맞춰 자원을 배분한다.

우선순위 기반 스케쥴링에는 다음과 같은 알고리즘이 있다.

1) 주기단조분석( Rate Monotonic Analysis, RMA )

: 실행 주기가 짧을수록(자주 실행될수록?) 높은 우선순위를 고정적으로 부여

2) Earliest Deadline First( EDF )

: Dead line까지 남아있는 시간이 짧을수록 높은 우선순위를 동적으로 부여

선점형 스케쥴링
시간적 정확성을 보장하는 멀티태스킹

선점형 스케쥴링은 현재 실행 중인 task가 “양보”를 하지 않더라도, 스케쥴러가 컨트롤을 다른 task로 넘겨줄 수 있도록 하는 것이다.

RTOS는 선점형 스케쥴러를 선호하는데, 그 이유는 다음과 같다.

1) 선점형 스케쥴러를 사용하여야, 제대로 우선순위 기반의 스케쥴링을 할수 있다.

만약 실행 중인 task가 “양보”를 한 후에야 다른 task로 컨트롤을 넘길 수 있다면( 비선점형 스케쥴링), 우선 순위가 낮은 task가 제 때 양보를 하지 않아, 높은 우선순위의 task가 무작정 기다리는 일이 발생할 수 있다. 즉 반응 시간의 최대값을 보장하고 예측하기가 곤란해진다.

2) interrupt에 대한 반응시간을 줄이고 그 최대값을 예측가능하게 할 수 있다.

비선점형 스케쥴러에서는 interrupt가 발생했을 때, ISR이 interrupt를 처리한 후, 컨트롤이 현재 실행 중이던 task로 다시 돌아가, 그 태스크가 양보할 때까지 기다린 후, interrupt를 실제 처리한 task가 실행된다. 즉 interrupt에 대한 반응시간이 그 만큼 지연되고, 그 최대값을 보장하거나 예측하기 곤란해진다.

선점형 스케쥴러는 ISR 수행 후, interrupt를 실제 처리할 task로 컨트롤을 넘길 수 있으므로, 현재 실행 중인 task가 양보하기를 기다릴 필요가 없다.

선점형 커널(Preemptible Kernel) – 재진입 가능한(Reentrant) 커널 서비스
시간적 정확성을 보장하는 멀티태스킹

커널 서비스(system call)를 재진입가능하게 작성하여 시간적 정확성을 높일 수 있다.

“재진입가능”하는 것은 어떤 함수를 수행하던 도중 잠시 멈추고 다른 일을 수행하다가 다시 돌아오더라도 아무 문제없이 다시 진행할 수 있다는 뜻이다. 만약 커널 서비스가 재진입 가능하지 않게 작성되어 있다면, 그 서비스가 완결되기전에는 다른 task를 수행할 수 없다. 즉 시간적 정확성이 그만큼 떨어지게 된다.

커널 서비스가 재진입가능하게 작성되었을 때,  즉 system call 이 수행 도중에 잠시 멈추고 다른 task를 수행할 수 있을 때, 그 커널을 선점형 커널이라 부른다.

Semaphore ( Mutual Exclusion / Synchronization)
시간적 정확성을 보장하는 멀티태스킹

멀티태스크 환경에서 task간의 충돌을 방지하기 위해서, 하나의 task가 사용하고 있는 자원을 다른 task가 사용하지 못하도록 막거나( Mutual Exclusion ), 서로 다른 task사이에 실행속도를 맞출( Synchronization) 필요가 있는데, 이를 구현하는 여러 방법 중 세마포어가 시간적 정확성을 가장 잘 보장해 준다.

Mutual Exclusion를 구현하기 위해 다음과 같은 방법을 사용할 수 있다.

1) 공유자원을 사용하는 동안 interrupt 금지

2) 공유자원을 사용하는 동안 스케쥴링 금지

3) 세마포어 사용

interrupt를 금지하는 방법은 interrupt를 놓칠 우려가 있고, 스케쥴링을 금지하는 방법은 우선순위가 낮은 task가 많은 자원을 점유할 우려가 있다. 세마포어는 그럴 우려가 없어 시간적 정확성을 저해하지 않는다.

우선순위 역전( Priority Inversion ) 방지
시간적 정확성을 보장하는 멀티태스킹

우선 순위가 높은 task가 우선 순위가 낮은 task와 semaphore를 공유할 때, 낮은 task가 semaphore를 풀어주기를 “무작정” 기다리느라 같이 늦어지고 중간수준의 task만 실행되는 문제가 발생할 수 있다.  이를 “우선순위 역전 현상”이라 하며 이것을 방지하기 위해, 다음과 같은 기법을 사용할 수 있다.

우선순위 상속( Priority Inheritance Protocol)
높은 task를 기다리게 만드는 낮은 task의 우선순위를  높은 task와 같은 레벨로 (임시로) 올려, semaphore를 빨리 풀어줄 수 있도록 하는 방법

우선순위 한도 제한( Priority Ceiling Protocol)
당장 사용하지 않는 semaphore라 하더라도, 보다 높은 task가 그것을 사용할 가능성이 있으면 낮은 우선순위의 task를 기다리게 하는 방법

è 사실은 명확하게 이해하지 못했음 ^^;;;

Micro Kernel
작고 유연한 구조

OS 커널을 설계할 때, micro kernel과 monolithic kernel의 2가지 접근방법이 있는데, micro kernel이 embedded system에 보다 적합하다.

monolithic kernel 방식은 모든 OS 서비스를 하나의 커널 내에서 구현하는 방법이며, micro kernel은 최소한의 필수 기능만을 kernel에 구현하고, 나머지 OS 서비스들은 선택적으로 설치/수정/제거될 수 있는 모듈 형태로 kernel에 추가할 수 있도록 하는 방법이다.

micro kernel은 OS 서비스 간의 통신 부하나 컨텍스트 스위칭 부하로 인하여 전체적인 성능이 떨어지는 문제가 있지만, 필요한 OS 서비스 만을 선택적으로 설치할 수 있다는 점에서 H/W 환경이 열악한 embedded system에 보다 적합하다. 따라서 RTOS 전용 kernel의 경우에는 micro kernel 방식을 선호한다.



RTOS의 종류
RTOS 전용 커널( small, fast, proprietary kernels )
크기와 성능에 최적화된 커널

상용 OS에 비해, 추가적인 OS 서비스와 소프트웨어 개발 환경이 상대적으로 약하다.


eCos, QNX, PDOS, pSOS, VCOS, VRTX32, VxWorks



범용 OS 커널 ( real-time extensions to commercial operating systems )
상용(범용) OS에 실시간 지원기능 추가

뛰어난 기능과 소프트웨어 개발 환경

성능과 시간적 정확성에서 다소 미흡


RT-Linux, KURT Linux, RTE-Linux, RT-UNIX, RT-POSIX, RT-MACH, CHORUS



차세대 커널( research operating systems )
“시간적 정확성”을 직접적으로 관리하고자 시도(?)


ARX, MARS, SPRING, MARUTI, ARTS, CHAOS, HARTOS



RTOS 의 표준화
POSIX( Portable Operating System Interface )
IEEE의 OS 표준인 POSIX에 real-time 관련 내용을 추가

TRON ( The Real-time Operating system Nucleus )
일본 주도의 표준화

Reference
http://artoa.hanbat.ac.kr/lecture_data/embedded_sw/01.pdf

http://sjlee.sch.ac.kr/arch/arch-grad/발표-18-RTOS.ppt

http://www.ida.liu.se/~TDDB47/lectures/RTOS.pdf

http://cs.chungnam.ac.kr/~ykim/courses/grad-rts2000/notes/rtos-overview.pdf

http://www.netmanias.com/contents/whitepaper/20000318-cmyoo-rtos/rtos1.pdf

http://sinsi.cs.pusan.ac.kr/~idjung/list/hn/devel_es_rtos_for_IA.ppt

http://www.securitytechnet.com/resource/rsc-center/gartner/56450-1.pdf

http://www.dioiz.com/download/an1004.pdf

http://www.china-core.com/data/discourse/WuhanSeminar10.ppt