System call in Linux kernel - (1)시스템콜 수정,추가해보기
Operating System & Computer Architecture/Linux 2017. 12. 29. 15:40arch/x86/kernel/syscall_table_32.S로가면
시스템콜 함수들이 나열되어있다.
1.sys_write 변경해보기
유저모드에서는 어떤곳에 출력(write)하고 싶다면 항상 커널에게 요청해야한다.
-> write()로 시스템콜을 요청하여 sys_write함수를 이용하여 모니터에찍음
커널모드로 진입한 커널내에서 모니터에 간단히 찍고싶을때
printk이용
-> printk는 커널함수이기 때문에 시스템콜을 요청하는것이아니라 그냥 함수를 실행하여 출력해줌.
쉘에서 printk되는것을 보고싶다면 명령어로
echo 8 > /proc/sys/kernel/printk 를 이용하여 printk 를 모니터에 출력되게 해야함.
무언가 write될때마다 계속 모니터에 찍힘
2.시스템콜 추가해보기
sys_ni_syscall은 현재 사용되지않는 시스템콜이다.
이를 적절히 수정하여 시스템콜을 변경해보자.
(1).시스템콜 테이블에 등록하기
sys_ni_syscall 이름을 내가만들 함수의 이름으로 바꿔준다. 17번에 만들어줌
(2)
커널 컴파일시 이용되는 .c 파일중 아무데나 똑같은 이름으로 만들어준다.
(3)시스템콜 확인
별 쓸모없어 보이는데 다음문제를 생각해보자.
만약 커널내의 전역변수로 할당된 어떤 변수에 접근하고싶다면 어떻게 해야할까?
유저모드에서는 당연히 커널내의 함수는 물론이고 변수접근 할수없음.
적절한 시스템콜함수를 만들어서 시스템콜을 호출해주어야함 .
만약 시스템콜을 이용하여 커널내의 전역변수의 주소값 리턴하여 가져왔다면?
아마 런타임에러가날것임. 유저모드에서는 커널내의 전역변수(특정 로컬 주소값을 지님)접근이 불가함.
이처럼 유저영역과 커널영역은 나누어져있고 유저레벨에서 커널레벨로 접근하려면 꼭 시스템콜을 이용하도록 설계되어있다.
어느곳에 write하고싶으면 항상 write함수를 이용할수밖에없는것이다.
라이브러리로 제작된 printf,scanf 나 파일입출력 라이브러리나 안에 들여다보면 모두 write,read 로 시스템콜을 호출한다.
'Operating System & Computer Architecture > Linux' 카테고리의 다른 글
Interrupt in Linux kernel - (2) 키보드입력,kernel_init 변경 (0) | 2017.12.28 |
---|---|
Interrupt in Linux kernel - (1) atkbd.c 변경실험 (0) | 2017.12.28 |
' Interrupt & system call ' in Linux kernel (0) | 2017.12.28 |
Interrupt -(2) 커널영역,인터럽트 종류 (0) | 2017.12.27 |
Interrupt -(1) 인터럽트 (0) | 2017.12.27 |