시스템 콜 추가할 때여...
KLDP 로 부터 많은 도움을 받고 있는 리눅스 초보자 입니다~
얼마 전에 시스템 콜 에 관한 글이 올라 와 있어서 그것보면서 차근차근 공부를
해 나가고 있었는데...ㅡㅡ;; 책을 찾아봐도 모르겠고, 몇 번 다시 설치해서 했는
데도 안되길래...주말 내내 삽질하다가 이렇게 질문을 올리게 됬어여~
먼저 올라온 글하고, 교학사 책, 박장수의 커널 분석이라는 책 보면서 했는데요..
커널 컴파일도 잘 되고, 사용자 파일 컴파일도 잘 되는데.. ㅡㅡ;;결과가 안나오
네요... dmesg했는데도...암것도 안떠요..
그래서 i=newsyscall() 호출하는 부분 앞뒤로 printf("before: %d,i) ,printf
("after: %d, i) 찍어서 해봤는데... 호출하기 전은 무지 큰 수가 나오고(이건 이
해가 가는데..), 호출 한 후는 -1 이 나오네요.....정상적인 종료일 때, 0으로 리
턴하게 했는데..
시스템 호출에 무슨 문제가 있는 것 같은데..도대체 그게 몬질 모르겠어요..
그래서 다른 시스템 호출(printk)이라도 시도해 볼라고 했는데...
이것을 똑같이 _syscall0(int, printk); ??인가여?? 아무래도 아닌 것 같아서
요... 안되기도 하고..ㅡㅡ;;
제가 지금까지 수정사항은 이렇습니다.
1. 우선 시스템콜 번호 등록할려고 usr/src/linux/include/asm-i386/unistd.h 하고 usr/include/asm/unistd.h 의 화일에
#define __NR_newsyscall 253번 추가하고
2. arch/i386/kernel/entry.S에서 253번째에 맞춰서
.long SYMBOL_NAME(sys_newsyscall)을 추가했습니다..
(혹시 마지막줄
.rept NR_syscall-(./sys_call_table)/4
.long SYMBOL_NAME(sys_newsyscall)
에 문제가 있나해서...NR_syscall-253으로도 고쳐봤습니다..
ㅡㅡ;;안되더군여...)
3. usr/src/linux/kernel/ 디렉토리에 아래와 같이 newfile.c 추가하고.. Makefile 에도 추가했습니다..
(근데 여기서 추가하는 부분이 export? 인가 하는 부분이랑...그 밑
에...y ? 인가 하는 부분이랑 두군데 있는것 같아 헷갈렸습니다...컴파일해서 실행해보니..별로 차이는 없는 것 같았는데..)
newfile.c 는 똑같이 만들었습니다.. 아래에 질문으로 나와있는 파일과...
그리고 make bzImage하고 나서...재 부팅하고...
/home 에 사용자응용파일 만들었습니다.
아래에 질문으로 나와있는 파일과 동일한 test_newsyscall.c...
다만 <errno.h>를 추가해서..
그래서 gcc test_newsyscall.c 하면 실행파일나오고...실행하고 나서..
dmesg치면...ㅡㅡ;;아무것도 안나옵니다..
다른 사람들은 마지막에 모두 나온다던데..
혹시 설치된 리눅스가 무언가 잘못 설정되 있나 싶어..
포맷하고 다시 깔았습니다...그래도 결과는 똑같습니다..
리눅스 7.1을 쓰고 있는데...ㅡㅡ;;이게 문제인가 싶어...
(하다보니..별 생각 다듭니다..) 리눅스를 7.3으로 바꿔볼까 하고 시디로 구워놓
기까지 했습니다..헌데..아무래도 이건 아닌 듯 싶어...ㅡㅡ;; 잠시 보류하고..
결국 KLDP를 찾게 됬습니다..
제발 도와주세요~ㅜㅠ 정말 막막합니다..해보는 데까지 다 해본 것 같은데..
그리고 newfile.c
^^
흠 기본적이긴 한건데... 혹시 커널 컴파일시에 이미지 제작한걸 부트 디렉토리에 카피 하고.. 릴로 설정을 해주셨는지요?
커널 이미지를 만들기만 하면 소용 없습니다.. :twisted:
모든 OS를 사용해보자~!!
-놀고먹는백수가 되고 싶은 사람-
아마도
컴파일이 잘 되는 거 보니 오류는 없는 것 같고요
그래픽 모드에서 하면 안되는 거 같더군요..
init 3을 터미널에서 실행시키시고 조금만 기다리시면
그래픽 모드가 닫히고 다시 로그인 화면 하는 게 나오거든요
하고 나서 ./a.out 실행 파일을 실행시키시면 아마 될 꺼에요..^^
다시 그래픽 모드로 가려면 init 5
^^ 답변 고맙습니다..
^^ 어렵게 문제점을 알아냈어요...
이상하게 시스템 콜 번호를 240 번호로 하면 되는데...
ㅡㅡ;; 그 밖에는 안되더군여...왜그런건지..이유는 몰겠는데..
35번, 222번, 241번, 245번,253번,259번...정도를 돌려봤는데..
딱 240번이 되던군여...그러니까 리턴값이 0이 되던데...
그러니까 dmesg에서 정보도 나오고요...
이유는 몰겠습니다...ㅡㅡ;;
댓글 달기