티스토리 뷰

오류

리눅스 시스템콜 추가 오류

상어악어 2022. 5. 11. 13:50
반응형

일단 vmware나 virtualbox 용량 40기가 이상으로하고

메모리 8기가로 하고

코어 4개이상으로 설정하는거 추천드립니다

그래야 컴파일할때 용량오류안나고

make -j4 이런 옵션 줘서 훨씬 빨리 컴파일 됩니다

-j옵션안주면 코어 하나로 돌아가서 10시간걸립니다

 

 

 

시스템콜 추가해서

컴파일했는데 이런 오류가떴다

 

 

 

 

 

 

다른 블로그를 참고하면

syscall_64.tbl에 맨 오른쪽 __나 __x64가 붙어있는데

위에건 다 안붙어있었다

근데 위에 오류를 보면

undefine reference to '__x64_mySyscall_sangwoo'라는걸보면

__x64를 안붙여줘서 저렇게 됐나 의심이 된다

다시 __x64를 붙이고 저장한후 컴파일해보았다

 

다시오류가났다

 

 

이번엔 앞에 sys_를붙이고 다시 컴파일해보았다

 

컴파일할때 revision은 계속 올려주었다

 

 

 

 

 

그리고 syscalls 헤더파일로 가서

(linux)/include/linux/syscalls.h

 

여기도 함수앞에 sys_를붙여주었다

 

 

 

 

컴파일이 됐는데

 

test파일 컴파일 후에

./a.out을 하니까

-1이리턴된다..

 

 

 

 

dmsg하니까 

Hello world가 뜨지않는다...

쥐엔장 컴파일 뭔가 잘못된듯

 

 

 

 

이 블로그 참고해서 다시 도전

https://medium.com/anubhav-shrimal/adding-a-hello-world-system-call-to-linux-kernel-dad32875872

 

Adding a Hello World System Call to Linux Kernel

In this blog, I’m going to tell you how to add a system call to the Linux kernel. It is like a Hello World program for System calls. :P

medium.com

이 블로그 참고할때 한가지 주의해야할거는

sudo make menuconfig 하기 전에

sudo cp /boot/config-현재커널명 ./.config


sudo cp /boot/config-3.8.0-19-generic ./.config

이걸 해주고 해야한다는 것

저 3.8.0-19 라는 숫자는 예시이고

각자 환경에서 할때는

uname -r  했을때 나오는거 적어주면 된다

 

그리고 sudo make menuconfig 할때 창 최대크기로 하고

어떤 화면이 나올텐데

Load눌렀을떄

./.config가 떠야한다

그러면 확인누르고

Exit누를때 확인누르고

그 후에 sudo make menuconfig해주면 된다

이 명령어는 /usr/src/linux-4.xx 여기서 해주어야한다

안그럼 실행안됨

 

 

 

 

 

multiple definition of sys_hello

기존의 것을 안지워서 오류난듯..

 

다 지우고 재컴파일 도전..

이번이 몇번짼가

 

 

 

 

 

 

문제 원인을 찾아냈다

원인은 버전이었따..

나는 ubuntu 18.04, kernel 5.17.6이었는데

이 사람의 버전대로 ubuntu 16.04, kernel 4.17.4로 다운받고

https://medium.com/anubhav-shrimal/adding-a-hello-world-system-call-to-linux-kernel-dad32875872

 

Adding a Hello World System Call to Linux Kernel

In this blog, I’m going to tell you how to add a system call to the Linux kernel. It is like a Hello World program for System calls. :P

medium.com

여기나와있는거 그대로 하니까 문제해결이됐다

버전문제....구글링해도 아무것도안나오더만

매개변수 없이 그냥 시스템콜 등록후 호출하는것은 제대로 됐다

위의 블로그에서 하라는대로하면

Hello world가 dmesg했을때 잘 나온다

 

 

 

 

 

 

 

 

그런데 나는 매개변수 1개를 전달받는 시스템콜을 만들어야 한다

c - How to pass parameters to Linux system call? - Stack Overflow

이건 밑의 블로그를 참고해서 하면된다

아마 구글에서 가장 친절하게 설명해준 글이 이거일거다

이걸로도 안되면 접어야됨..

 

 

 

 

 

 

버전 문제 해결 후 

커널로 매개변수 전달 및 받는거 하는중인데

SYSCALL_DEFINE1()하면서 뭔가 인자 개수에서 문제가 생긴듯하다

 

 

 

 

 

문제 해결을 했다

안됐던 이유는

아까 맨 처음 hello world 시스템 호출했던 블로그를 참고해서

ubuntu 16.04, kernel 4.17.4버전으로

매개변수 1개 받는 시스템콜을 만들어서 했는데

컴파일은 잘되는데

테스트파일 산출결과를 실행하면Killed라고 뜬다

이건 아무리 구글링해도 오류원인을 찾을 수 없었고,참고 블로그를 똑같이 따라했는데도 안됐다

그래서 아 혹시 이것도 버전문제인가?ubuntu랑 kernel버전이 다른데

아예 똑같이 버전을 맞추고

그냥 그대로 복붙해서 실행을 해봐야겠다그랬더니 됐다

 

이것도 아까와 마찬가지로 그냥 버전문제였던것이다

아니 무슨 버전이 달라진다고 시스템호출등록이 안되는건가..

이런걸 설명해주는게 구글에 아무리 뒤져도 없었다

그냥 내가 계속 부딪혀보고 직접경험해보면서

우분투와, 리눅스 커널의 버전상에서 뭔가 문제가 있다는걸직감하고 스스로 떠올렸다..

 

 

그 결과

이게 테스트코드다8이라는 숫자를 건네주었을때문구출력 및 현재시간,날짜를 출력한다

 

gcc로 컴파일하고

a.out을 실행하니 정상적으로 0을 리턴받는다

그리고 시스템호출 결과는 dmesg를 통해 확인한다

 

정상적으로 문구와

현재시간이 출력되는걸 확인할 수 있다

 

 

 

이건 내 시스템콜 코드이다

kernel/my_syscall.c로 있다

 

 

 

 

 

 

include/linux/syscalls.h

스크롤 쭉내리다보면 마지막 줄 #endif 바로 위에 추가해줌

 

 

 

arch/x86/entry/syscalls/syscall_64.tbl

시스템콜 테이블에 이런식으로 추가

 

 

kernel/Makefile에

obj-y my_syscall.o 추가

 

 

 

 

 

 

 

이거하느라고

월화수목금 점심먹고 잘때까지

10시간이상씩 한거같은데

원인은 버전문제였다니

참 고된 과정이었다

컴파일도 오래걸려서

컴파일 돌려놓고

1시간 자고 일어나서 확인하고

이 짓거리 몇번을 해서 정말 힘들었다

그리고 vmware, ubuntu 삭제는 진짜 15번이상은한거같다

중간에 c드라이브 꽉차서 포맷할 위기까지 왔었다

 

 

혹시 운영체제에서 이런 과제를 하게 되는분이있다면

제가 올린 블로그 참고해서 해보시고

제 코드도 참고해보시고

그래도 안되면 댓글달아주세요 답변드리겠습니다

다 까먹어서 답변못할듯요~ 충북대 소웨3학년화이팅!!

해결됐다면 좋아요 한 번~

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함