-리눅스 시스템 호출-
IDT의 총용량은 1KByte이고 함수하나당 4Byte 니깐 즉 호출함수를 가질수 있는 갯수는 256개이다.
버전이 올라가면서 시스템에서 불러오는 갯수가 많아지니 따로 사용자가 인터럽터 주소를 만들수있도록 한곳에 모은다 이곳을
0x80번에 배정해서 여기 있는이름을 리눅스에선 system_call 이라고 부른다.
<174페이지 그림 3-9 리눅스 시스템 호출>
<System.map>
-fork()를 호출할경우 예-
<fork() 시스템 호출의 흐름>
fork()는 자신을 하나더 분리하는 함수이다 fork()가 발생하면 라이브러리에서
eax에 시스템호출번호 2를 넣고 INT 0x80 실행하고 인터럽트 0x80발생(IDT에 80번째인 system_call() )
system_call() 안에 sys_call_table을 확인해서 2번인 sys_fork를 호출한다
<entry.S 에 sys_call_table>
-sys_call_table-
[그림 1]
아까 위에서 설명한대로 각 함수들의 번호가 지정되어 있다. read( ) 함수가 실제론 sys_read가 호출되는 것도 보인다.
C언어로 작성된 hello_c.c 라는 파일을 보자.
Write( )함수를 이용해 “Hello, Kernel” 이라는 단어를 출력하는 코드이다. 이 코드가 아까 위에서 본 system_call( ) 함수를 호출할 때, 정말로 함수에 해당
하는 값을 넘겨주면 write( ) 함수를 사용하는지 어셈블리로 만들어보자.
다른 거 제외하고 핵심만 보자면, 위에 [그림 1]을 보면 write 함수는 4번이다.
_start 에서 mov eax, 4 로 레지스터에 4를 넣는다. 즉 write( )함수를 쓰는 것이고, 아까 hello_c.c 의 write( )함수의 인자를 보면 레지스터에 넣고 있는 값이랑 일치한다는 것을 알 수 있다.
Write( 1 , “Hello, Kernel\n” , 14 );
*mov eax, 4 => write( ) 함수
*mov ebx, 1 => 1 (stdout)
*mov ecx, hello => “Hello, Kernel\n” (출력할 문자열)
*mov edx, helloLen => 14 (문자열 길이)
결국 레지스터에 사용할 함수의 번호를 넣고, system_call( )를 호출한다는 사실을 알 수 있다.
2.4버젼과 같은 방법으로 공유폴더에 커널을 옮겨준다
make proper하면 에러가 날것이다.
그래서 vi 편집기로 Makefile 을 수정하자 .
865번을 주석처리한후 866번과같이 적는다.
1292 번에 있는 rm –f 라고 되어있는 것을 rm –rf로 바꾼다
위와 같이 수정하고
make clen -> make mrproper -> make menuconfig 를 진행하자
그리고 make를 하면 에러가나는데
2.6커널에선 make중에 asm-i386 에 헤더파일이 몇개생성되는데 기존에 링크된 asm은 파일갯수가 맡지않아서
다시 링크가걸린 기존에 asm을 지우고 asm-i386을 다시 asm으로 카피시켜줘서 다시 make를 걸면 된다.
-심볼릭링크 거는 방법-
명령어는 ln -s 로 왼쪾이 오른쪽에 링크를 건다
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
Visual Studio 에서 사용 팁. 나름 유용하니 애용하시오. (4) | 2012.10.11 |
---|---|
[RFID] - 정철 (0) | 2012.10.11 |
10월 10일 - 리눅스 커널 프로그래밍 chater[3] -(4), 공유폴더에 kernel 옮기기 (8) | 2012.10.11 |
[리눅스 커널]linux 2.4 & linux 2.6 소스인사이드 설정 (10) | 2012.10.10 |
2010.10.10 오전[리눅스 시스템호출, 예제소스] (14) | 2012.10.10 |
리눅스 커널 2.4 분석하기(소스인사이트에 커널소스추가) (4) | 2012.10.10 |
리눅스 커널 2.4 분석하기(vmware를 통해 윈도우에 리눅스커널 빌드) (4) | 2012.10.10 |
MS Word에서 글을 작성하고 블로그로 보내기. (4) | 2012.10.10 |