시스템콜에서 유저모드공간에 접근이 가능한가.




이거 사발..... 사발사발사발사발.....



리눅스 0.11에서는 fs 세그먼트디스크립터로 주소를 명시해서


어셈블리단계에서, fs:%0 뭐 이런식으로 주소공간을 "사용자 공간 들어가겠습니다~" 라고 했었거든??


애초에 리눅스 0.11은, 사용자공간은 task_nr * 0x400000 만큼의 베이스주소 위에 쌓여있고

커널공간은 베이스주소가 0이라서 그거 보정해주려면 fs라는 세그먼트 디스크립터가 필요했음



근데, 현대식 운영체제는 유저스페이스 안에다가, 커널공간을 매핑해버리는 형태라서

리눅스 0.11과 달리, 커널 공간과 유저공간이 분리가 안되어있음.


각 프로세스의 유저공간 안에 커널공간이 포함되고 공유됨.



이러다보니까,


어 뭐야 그냥 접근하면 되는거 아니야?? 라는 생각이 생기고



찾아보니까


copy_to_user

copy_from_user 라는걸 이용해서,


유저공간의 데이터를 커널공간으로 복사해오는 함수를 사용해서 코드짜는거 같더라?


그래서 내가 코드 까봤지.


보안이 어느부분에 적용되었을까...


근데,


이거 사발 그냥 맘만먹으면 copy 하지 않고


그냥 직접 유저공간에 접근할수있겠던데??



즉,


커널모드랑 사용자모드를 넘나드는 와중에

주소공간의 변경이 없는거 같던데?


뭐 사용자모드에서 커널공간 주소에 접근이 막히긴 하겠지. 이건 세그먼트 혹은 페이지테이블엔트리에 있는 정보를 토대로 막힐거고


근데 커널모드에서 사용자모드를 접근할때는 보안이란게 없는거같았단 말이지.



그래서 실험해볼거임.



실험방식은


자작 시스템콜을 만들고, 그 시스템콜은 인자로 유저모드 주소공간을 받을거고

그 유저모드 주소공간에 있는 데이터를 printk("섹스섹스이부분로그를봐주세요! 데이터 = %d\n", *address);

하는 코드를 만들거임.



그리고 유저모드 코드를 만들어서


int a = 100;

mySyscall(&a);

a = 69;

mySyscall(&a);

a = 74;

mySyscall(&a);


해볼거임.


어때? 완벽하지?


자 그럼 시스템콜을 어떻게 등록하는지 검색해볼까?


서울대 운체수업은 시스템콜 등록이 첫번째 과제인데, 내가 보는 커널 책은 시스템콜 등록에 대한 내용이 빠져있음. 디버깅위주라서