arch/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 로 시스템콜을 호출한다.






블로그 이미지

pringlee

하드코어보단 캐주얼!

,