다가오는 리눅스 6.13 릴리스는 RISC-V 사용자 공간 포인터 마스킹을 지원하여 아키텍처에 중요한 발전을 가져옵니다. RISC-V는 서로 다른 권한 수준에서 작동하는 포인터 마스킹을 위한 세 가지 확장인 Smmpm, Snpm, Ssnpm을 정의합니다. 새로운 구현은 커널의 권한 모드에 따라 Smnpm 또는 Ssnpm을 구성할 수 있게 하여 사용자 공간(VU 또는 U 모드)에서 포인터 마스킹을 가능하게 합니다. 이 기능은 arm64의 기존 PR_SET_TAGGED_ADDR_CTRL API를 확장하지만, arm64의 태그 버퍼 인덱싱(Tagged Buffer Indexing, TBI)과는 달리 RISC-V에서는 기본적으로 사용자 공간 포인터 마스킹이 활성화되어 있지 않습니다.
이 구현은 PMLEN이라고 불리는 가변 태그 너비를 도입하며, 사용자 공간 애플리케이션은 이를 커널에 요청해야 합니다. 이 너비는 사용 가능한 태그 비트 수의 하한으로 작용합니다. 또한 arm64 및 x86과 유사한 태그 주소 ABI가 포함되어 있어, 커널이 사용자 포인터를 역참조하기 전에 소프트웨어에서 언태그해야 합니다. 커널의 포인터 마스킹 구성은 커널에서 사용자 메모리로의 접근에 사용되며, 이는 구현의 복잡성을 더합니다.
사용자 공간에서의 포인터 마스킹은 PR_SET_TAGGED_ADDR_CTRL 및 PR_GET_TAGGED_ADDR_CTRL prctl() 작업을 통해 제어됩니다. 기본적으로 포인터 마스킹은 비활성화되어 있으며, 사용자 공간은 원하는 마스크/태그 비트 수를 사용하여 PR_SET_TAGGED_ADDR_CTRL를 호출함으로써 이를 명시적으로 활성화해야 합니다. 커널이 요청을 수용할 수 없는 경우, 작업은 실패하게 됩니다. 실제 태그 비트 수는 PR_GET_TAGGED_ADDR_CTRL 작업을 통해 사용자 공간으로 전달됩니다. 이 개발은 RISC-V 시스템의 보안 및 메모리 관리 기능을 향상시키는 중요한 단계로 평가됩니다.
* 이 글은
phoronix.com의 기사를 요약한 것입니다. 전체 기사의 내용은
이곳에서 확인하실 수 있습니다.