시스템 호출을 수행하는 커널 코드를 찾았습니다. 그런데 그건 허용되지 않는 것 같은데요?

시스템 호출을 수행하는 커널 코드를 찾았습니다. 그런데 그건 허용되지 않는 것 같은데요?

문맥:linux-5.0/Documentation/process/adding-syscalls.rst#do-not-call-system-calls-in-the-kernel

첫째, 커널 코드는 호출 규칙이 잘못되었기 때문에 "sys_xyzzy()"와 같은 함수를 더 이상 호출할 수 없습니다.

그러나 둘째, "데이터에 액세스하는 방식은 커널 데이터와 사용자 데이터 간에 다를 수 있습니다."

이제 이전 "sys_xyzzy()" 호출을 직접 대체하는 함수가 있습니다. 예: ksys_mount().

ksys_mount() __usersys_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)"를 호출하세요., 사용자 공간 프로그램을 실행하기 전에.

관련 정보