안녕하세요? 허니데이즈입니다. 오랜만에 포스팅 합니다. 그동안 회사에서 바쁜일이 있어서.ㅠㅠ 오늘은 핸들(Handles)에 대해서 이야기 해 보고자 합니다.
개념
Handles은 사용자 모드에서 프로그램이 커널 객체를 참조할 수있게 해주는 커널 구조이다. Handle은 특정 커널 객체에 대한 세션이나 연결로 생각할 수 있다. 여러 프로세스가 서로 다른 Handle을 통해 동일한 객체에 동시에 접근하는 경우가 있다. 하지만 단일 Handle은 단일 프로세스에 바인딩되거나 커널에만 바인딩될 수 있다. 커널에 바인딩될 때 'in-transit'로 표현된다. 사용자 모드에서 Handle은 단순히 일부 시스템 호출에 의해 반환된 특정 번호이다. 전송 중이 아닌 핸들만 사용자 모드에서 볼 수 있다. Handle을 나타내는 정수는 해당 프로세스에 대해서만 의미가 있다. 다른 프로세스의 동일한 번호가 Handle에 맵핑되지 않거나 완전히 다른 커널 오브젝트를 가리키는 Handle에 맵핑 될 수 있다. Handle의 정수 값은 ZX_HANDLE_INVALID에 해당하는 값을 제외한 32비트인 숫자이다. 커널 모드의 경우 Handle은 세 개의 논리 필드를 포함하는 C++ 객체이다.
- A reference to a kernel object: 커널 객체에 대한 참조
- The rights to the kernel object: 커널 객체에 대한 권한
- The process it is bound to (or if it's bound to kernel): 바인딩된 프로세스
'rights'은 커널 객체의 어떤 작업이 허용되는지를 명시한다. 단일 프로세스가 다른 권한을 가진 동일한 커널 오브젝트에 대해 두 개의 서로 다른 Handle을 가질 수 있다.
Handle 사용하기
새로운 커널 객체를 생성하고 Handle을 반환하는 많은 syscall이 존재한다. 몇 가지 예를 들면 다음과 같다.
zx_event_create
zx_process_create
zx_thread_create
위 호출은 커널 객체와 이를 가리키는 첫 번째 Handle을 생성하게 된다. Handle은 syscall을 발행한 프로세스에 바인드되며 권한은 해당 유형의 커널 오브젝트에 대한 기본 권한이다. 같은 커널 객체를 가리키고 syscall을 실행한 동일한 프로세스에 바인딩된 Handle 사본을 만들 수있는 시스템 콜은 오직 하나뿐이다.
zx_handle_duplicate
상응하는 Handle을 만들 수 있는 한 개의 시스템콜이 있다(권한이 적을 수 있음). 원래 Handle을 무효화 한다.
zx_handle_replace
Handle을 파괴하는 시스템 호출이 있다.
zx_handle_close
호출 프로세스에 바인딩 핸들을 받아 커널에 바인딩하는 두 개의 시스템 콜이 있다.(Handle을 전송 중입니다).
zx_channel_write
zx_socket_share
in-transit Handle을 사용하여 호출 프로세스에 바인딩하는 세 개의 syscall이 있다.
zx_channel_read
zx_channel_call
zx_socket_accept
위의 채널과 소켓 syscalls는 한 프로세스에서 다른 프로세스로 Handle을 전송하는데 사용된다. 예를 들어 채널과 함께 두 개의 프로세스를 연결할 수 있다. 핸들을 전송하기 위해 타겟 프로세스는 zx_channel_write 또는 zx_channel_call을 호출하고 대상 프로세스는 동일한 채널에서 zx_channel_read를 호출한다. 마지막으로, 새 프로세스에 부트스트랩 Handle을 제공하는 단일 시스템콜이 있다. 즉, 다른 Handle을 요청하는데 사용할 수 있는 Handle이다.
zx_process_start
부트 스트래핑 Handle은 전송 가능한 커널 객체일 수 있지만 가장 합리적인 경우는 채널의 한쪽 끝을 가리키는 것이므로 초기에 채널을 사용하여 새로운 프로세스에 추가 Handle을 보낼 수 있다.
Garbage Collection
Handle이 유효하면 이를 가리키는 커널 오브젝트가 유효함을 보장한다. 이는 커널 객체가 참조 카운트되고 각 Handle이 커널 객체에 대한 참조를 보유하기 때문에 보장된다. 그 반대는 Handle이 종료되면 그 Handle이 종료된다는 의미가 아니다. 객체를 가리키는 다른 Handle이 있거나 커널 자체가 커널 객체에 대한 참조를 보유하고 있을 수 있다. 예를 들어 스레드에 대한 Handle로 스레드에 대한 마지막 Handle이 종료된다면 스레드가 종료되었음을 의미하지는 않는다. 커널 객체에 대한 마지막 참조가 해제되면 커널 객체가 파괴되거나 커널이 객체에 Garbage Collection을 표시한다. 객체는 현재 대기중인 작업 세트가 완료될 때 나중에 폐기된다.
Special Cases
Handle이 전송 중이고 쓰여진 채널이나 소켓이 종료되면 Handle이 닫히게 된다. 디버깅 세션에는 Handle에 대한 접근 권한을 얻기 위한 특별한 syscalls가 있을 수 있다.
출처: https://fuchsia.googlesource.com/zircon/+/master/docs/handles.md
지르콘 커널에 대해 더 알고 싶으시다면 아래 목차에서 클릭!
Zircon | |
Getting Started | |
Contributing Patches | |
Concepts Overview | |
Kernel Objects | |
Process Objects | |
Thread Objects | |
Handles | |
System Calls | |
Driver Development Kit | |
Testing | |
Hacking notes | |
Memory usage analysis tools | |
Relationship with LK | |
Micro-benchmarks |
'Past Material' 카테고리의 다른 글
[Zircon Kernel] 지르콘 커널에서 시스템콜의 종류 - Fuchsia OS (0) | 2018.08.24 |
---|---|
구글은 어떻게 안드로이드 생태계에서 퓨시아(Fuchsia) 생태계로 전환시킬 수 있을까? (0) | 2018.08.21 |
[Zircon Kernel] 지르콘 커널에서 사용되는 쓰레드(Thread)란? - Fuchsia OS (0) | 2018.08.08 |
[Zircon Kernel] 지르콘 커널의 구성요소(Objects)는 무엇이 있나요? - Fuchsia OS (0) | 2018.08.08 |
[Zircon Kernel] 지르콘 커널에서 사용되는 프로세스(Process)란? - Fuchsia OS (0) | 2018.08.08 |