문맥:linux-5.0/Documentation/process/adding-syscalls.rst#do-not-call-system-calls-in-the-kernel
첫째, 커널 코드는 호출 규칙이 잘못되었기 때문에 "sys_xyzzy()"와 같은 함수를 더 이상 호출할 수 없습니다.
그러나 둘째, "데이터에 액세스하는 방식은 커널 데이터와 사용자 데이터 간에 다를 수 있습니다."
이제 이전 "sys_xyzzy()" 호출을 직접 대체하는 함수가 있습니다. 예: ksys_mount().
ksys_mount() __user
sys_mount()를 호출하는 것과 마찬가지로 메모리에 대한 포인터를 가져옵니다. 따라서 커널 메모리에 대한 포인터를 전달하면 실패해야 합니다. 특히, copy_from_user() 호출 시 실패합니다.게임을 하기 위해 set_fs()를 사용하지 않는 한.
그렇다면... 커널의 다른 위치에서 ksys_mount()를 여러 번 호출하는 이유는 무엇입니까? 이 중 어떤 것이 어떻게 작동할 수 있습니까? set_fs()에 대한 호출은 포함되어 있지 않습니다.
https://elixir.bootlin.com/linux/v5.0/ident/ksys_mount
- 드라이버/베이스/devtmpfs.c
- 초기화/do_mounts.c
- ...
답변1
devtmpfs
현재 커널 스레드에서 실행 중입니다. 커널 스레드에서는 addr_limit
효과적으로 비활성화됩니다. 적어도 x86의 경우에는 그렇습니다. 이는 아키텍처별 코드입니다.
init/do_mounts.c
굉장히 유사한. 커널 초기화 프로세스는 커널 스레드처럼 시작되어야 하며 addr_limit
효과적으로 비활성화되어야 합니다. 이어서, do_execve()
사용자 공간 초기화 프로그램을 호출하여 실행을 시작합니다. 핵심반드시 "set_fs(USER_DS)"를 호출하세요., 사용자 공간 프로그램을 실행하기 전에.