copy_from_user() 궁금점

choboja의 이미지


안녕하세요 ??

copy_from_user() 함수에 대해 궁금한점이 있습니다.

위 함수가 user 영역의 데이터를 kernel영역으로 옮기는 것으로 알고있습니다.

제가 궁금한건 system call 추가시 위 함수를 사용할 필요가 있는지 궁금하네요.

예를 들어

* system call부분

struct int_list{
        unsigned int    nr;
};
 
 
asmlinkage long sys_enter_critical(int nr_list, struct int_list* list )
{
     kernel_data.nr = list[i].nr;
}

* application

struct int_list{
        unsigned int    nr;
};
 
 struct int_list  list = (struct int_list*)malloc(sizeof(struct int_list)*nr_pid);
 syscall(__NR_enter_critical , nr_pid, list );

위에처럼 그냥 pid_list 포인터를 넘겨주고 받은 데이터를 원하는 kernel data부분에 대입해주면 되지 않나요?

위 같은 경우는 list의 값을 하나하나 원하는 곳에 대입해주어야하는데,
kernel에서 똑같은 데이터 구조가 있고 해당 부분을 통째 복사를 하기 위해 사용하는것인가요?

음.. 헷갈리네요. 답변 부탁드립니다.

tsgates의 이미지

1. controlled page fault: mapping되지 않은 VA를 arg로 줬을때
2. range check: kernel space의 VA를 arg로 줬을때
3. race condition: kernel에서 user space를 엑세스 하고 있을때 다른 cpu에서 돌고 있는 thread가 엑세스 해서, TOCTOU를 막으려고
4. architecture: kernel에서 userspace를 마구 엑세스 할 수 없는 아키텍쳐도 많아요

대략 이렇게 생각해볼 수 있겠군요 - 제가 글쓰는걸 워낙 싫어해서 .. :)