본문 바로가기
코스웨어/12년 내장형하드웨어

-리눅스 시스템 호출, “NTFS 에서 커널 빌드과정중 에러 대처-

by 알 수 없는 사용자 2012. 10. 10.
728x90
반응형

-리눅스 시스템 호출-


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 코드와 어셈코드 비교-

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( )를 호출한다는 사실을 알 수 있다.




-Makefile-


위와같이 Makefile을 만들어서 make입력만으로 컴파일을 쉽게하자.

%.c%:
%(CC) %(CFLAGS) %^ -o %@   = gcc hello_c -o(컴파일등급숫자) hello.c 로 할것을 광범위하게 바꾼것으로 

책(리눅스 커널 프로그래밍 140page)에 자세한 설명이 나와있다.




-리눅스 커널 2.6 도스파티션에서 빌드 및 에러 대처-

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 로 왼쪾이 오른쪽에 링크를 건다



 

728x90