티스토리 뷰
일단 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
이 블로그 참고할때 한가지 주의해야할거는
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
여기나와있는거 그대로 하니까 문제해결이됐다
버전문제....구글링해도 아무것도안나오더만
매개변수 없이 그냥 시스템콜 등록후 호출하는것은 제대로 됐다
위의 블로그에서 하라는대로하면
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학년화이팅!!
해결됐다면 좋아요 한 번~
'오류' 카테고리의 다른 글
프로그래머스 복사 안될때 (0) | 2022.06.01 |
---|---|
윈도우 11 와이파이 아이콘 사라짐 오류 (1) | 2022.05.19 |
리눅스 커널빌드 오류 (2) | 2022.05.10 |
리눅스 #include gelf.h오류 (0) | 2022.05.10 |
우분투 package 'kernel-package' has no installation candidate 오류 (0) | 2022.05.10 |
- Total
- Today
- Yesterday
- 2024인프콘
- 우분투
- 인프콘2024
- git commit 수정
- DDL
- CSS
- 데이터베이스
- infcon 2024
- 클로아
- 데이터 3법
- 로스트아크 캐릭터
- oauth2.0
- html #웹 #웹사이트 #플레이리스트
- 리눅스
- 데이터3법
- 오픈소스
- javascript
- SpringBoot
- DML
- bfs
- oauth
- kloa
- html
- git
- 프로그래머스
- git 예전 커밋 수정
- Android Studio
- authorization code
- authorization_code
- SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |