Line 1: |
Line 1: |
− | [[Category:Kernel objects]] | + | [[Category:Kernel synchronization objects]] |
− | class [[KProcess]] extends [[KSynchronizationObject]]; | + | [[Category:Kernel interrupt events]] |
| + | class [[KProcess]] extends [[KSynchronizationObject]] and [[KSendableInterruptEvent]]; |
| | | |
− | Size : 0x260 bytes | + | Size : 0x270 (N3DS) / 0x268 bytes (O3DS post 8.x) / 0x260 bytes (O3DS pre 8.x). 0x4D8 bytes on ARM9. |
| + | The only field that changed is the [[KProcessHwInfo]] member instance. The definition of KProcess remain identical in all cases. |
| + | |
| + | The listed offsets are N3DS-only. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 11: |
Line 15: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | u32 | + | | void** |
| | Pointer to vtable | | | Pointer to vtable |
| |- | | |- |
Line 29: |
Line 33: |
| | KLinkedListNode* | | | KLinkedListNode* |
| | Pointer to last KLinkedListNode in node list of KThreads that sync with this object | | | Pointer to last KLinkedListNode in node list of KThreads that sync with this object |
| + | |- |
| + | | 0x14 |
| + | | [[KSendableInterruptEvent]] |
| + | | Interrupt event (*this) sent to terminate the process |
| |- | | |- |
| | 0x1C | | | 0x1C |
− | | volatile KThread* | + | | [[KProcessHwInfo]] |
− | | 0 or pointer to the thread the currently does something with the process object. | + | | Process hardware/context info. Used to manage segmentation, etc. |
| |- | | |- |
− | | 0x20 | + | | 0x68 |
− | | s16
| |
− | | ?
| |
− | |-
| |
− | | 0x30
| |
− | | KLinkedListNode*
| |
− | | Pointer to first KLinkedListNode in list of KMemoryBlocks used by the process
| |
− | |-
| |
− | | 0x34
| |
− | | KLinkedListNode*
| |
− | | Pointer to last KLinkedListNode in list of KMemoryBlocks used by the process
| |
− | |-
| |
− | | 0x40
| |
| | u32 | | | u32 |
− | | Translation table base | + | | Total size of all [[Memory_layout#0xFF4XX000|Thread Context]] pages owned by threads that belong to this process |
| |- | | |- |
− | | 0x44 | + | | 0x6C |
− | | u8
| |
− | | Context ID
| |
− | |-
| |
− | | 0x50
| |
− | | u32
| |
− | | Size of the MMU table
| |
− | |-
| |
− | | 0x54
| |
− | | u32
| |
− | | Virtual address of the MMU table for this process
| |
− | |-
| |
− | | 0x58
| |
| | u32 | | | u32 |
− | | Total size of all thread context pages (0xFF4xxxxx) owned by threads that belong to this process | + | | Number of [[KThreadLocalPage|KThreadLocalPages]] used by this KProcess |
| |- | | |- |
− | | 0x5C | + | | 0x70 |
− | | u32
| |
− | | Number of KThreadLocalPages used by this KProcess
| |
− | |-
| |
− | | 0x60
| |
| | KLinkedListNode* | | | KLinkedListNode* |
| | Pointer to first KLinkedListNode in the list of KThreadLocalPages | | | Pointer to first KLinkedListNode in the list of KThreadLocalPages |
| |- | | |- |
− | | 0x64 | + | | 0x74 |
| | KLinkedListNode* | | | KLinkedListNode* |
| | Pointer to last KLinkedListNode in the list of KThreadLocalPages | | | Pointer to last KLinkedListNode in the list of KThreadLocalPages |
| |- | | |- |
− | | 0x6C | + | | 0x78 |
− | | s32
| |
− | | Ideal processor
| |
− | |-
| |
− | | 0x74
| |
| | u32 | | | u32 |
− | | Pointer to resource limits for process. | + | | Unknown |
− | |-
| |
− | | 0x79
| |
− | | u8
| |
− | | Proc affinity mask
| |
| |- | | |- |
| | 0x7C | | | 0x7C |
− | | u32 | + | | s32 |
− | | Number of threads which belong to this process. | + | | Ideal processor for this process |
| |- | | |- |
| | 0x80 | | | 0x80 |
− | | 0x10-bytes | + | | KDebug* |
− | | SVC access control mask from the exheader kernel descriptors. | + | | KDebug object created from [[SVC|svc 0x60]] to debug the process |
| |- | | |- |
− | | 0x90 | + | | 0x84 |
− | | 0x10-bytes | + | | KResourceLimit* |
− | | Interrupt flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words | + | | Pointer to resource limits for process. |
| |- | | |- |
− | | 0xA0 | + | | 0x88 |
− | | u32 | + | | u8 |
− | | Kernel flags from the exheader kernel descriptors. | + | | Normally 1 to indicate process is open/available. Set to 2 to indicate process is exiting/closing and 3 to indicate exited/closed. |
| |- | | |- |
− | | 0xA4 | + | | 0x89 |
− | | u16 | + | | u8 |
− | | Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM. | + | | Process affinity mask |
| |- | | |- |
− | | 0xA6 | + | | 0x8A |
| | u16 | | | u16 |
− | | Kernel release version field, from the exheader kernel descriptors. | + | | Unused, alignment |
| |- | | |- |
− | | 0xA8 | + | | 0x8C |
− | | u32 | + | | s16 |
− | | Pointer to [[KCodeSet]] instance | + | | Number of threads which belong to this process. |
| |- | | |- |
− | | 0xAC | + | | 0x8E |
− | | u32 | + | | s16 |
− | | Process id, this always begins at 0x0 for the first process. | + | | Max number of threads which can belong to this process. This is always 0. |
| |- | | |- |
− | | 0xB0 | + | | 0x90 |
− | | u32
| |
− | | Kernel flags from the exheader kernel descriptors.
| |
− | |-
| |
− | | 0xB8
| |
− | | KThread*
| |
− | | Pointer to the process's main (?) thread.
| |
− | |-
| |
− | | 0xCC
| |
− | | KProcessHandleTable
| |
− | | Pointer to the process's handle table. until 0x1C4 or longer
| |
− | |-
| |
− | | 0x224
| |
− | | u32
| |
− | | ?
| |
− | |}
| |
− | | |
− | | |
− | Structure starting with [[8.0.0-18]] NATIVE_FIRM:
| |
− | | |
− | Size : 0x268 bytes
| |
− | | |
− | {| class="wikitable" border="1"
| |
− | |-
| |
− | ! Offset
| |
− | ! Type
| |
− | ! Description
| |
− | |-
| |
− | | 0x0
| |
− | | u32
| |
− | | Pointer to vtable
| |
− | |-
| |
− | | 0x4
| |
− | | u32
| |
− | | Reference count
| |
− | |-
| |
− | | 0x8
| |
− | | u32
| |
− | | Count of KThreads that sync with this object - number of nodes in the linked list below
| |
− | |-
| |
− | | 0xC
| |
− | | KLinkedListNode*
| |
− | | Pointer to first KLinkedListNode in node list of KThreads that sync with this object
| |
− | |-
| |
− | | 0x10
| |
− | | KLinkedListNode*
| |
− | | Pointer to last KLinkedListNode in node list of KThreads that sync with this object
| |
− | |-
| |
− | | 0x2C
| |
− | | u32
| |
− | | Count of KMemoryBlocks owned by the process
| |
− | |-
| |
− | | 0x30
| |
− | | KLinkedListNode*
| |
− | | Pointer to first KLinkedListNode in list of KMemoryBlocks used by the process
| |
− | |-
| |
− | | 0x34
| |
− | | KLinkedListNode*
| |
− | | Pointer to last KLinkedListNode in list of KMemoryBlocks used by the process
| |
− | |-
| |
− | | 0x40
| |
− | | u32
| |
− | | Translation table base
| |
− | |-
| |
− | | 0x44
| |
− | | u8
| |
− | | Context ID
| |
− | |-
| |
− | | 0x4C
| |
− | | u32
| |
− | | End of userland virtual memory for the process
| |
− | |-
| |
− | | 0x50
| |
− | | u32*
| |
− | | [[Memory_layout|LINEAR]] memory virtual address(userland) base for this process.
| |
− | |-
| |
− | | 0x58
| |
− | | u32
| |
− | | Size of the MMU table
| |
− | |-
| |
− | | 0x5C
| |
− | | u32
| |
− | | Virtual address of the MMU table for this process
| |
− | |-
| |
− | | 0x60
| |
− | | u32
| |
− | | Total size of all thread context pages (0xFF4xxxxx) owned by threads that belong to this process
| |
− | |-
| |
− | | 0x64
| |
− | | u32
| |
− | | Number of KThreadLocalPages used by this KProcess
| |
− | |-
| |
− | | 0x68
| |
− | | KLinkedListNode*
| |
− | | Pointer to first KLinkedListNode in the list of KThreadLocalPages
| |
− | |-
| |
− | | 0x6C
| |
− | | KLinkedListNode*
| |
− | | Pointer to last KLinkedListNode in the list of KThreadLocalPages
| |
− | |-
| |
− | | 0x74
| |
− | | s32
| |
− | | Ideal processor for this process
| |
− | |-
| |
− | | 0x7C
| |
− | | KResourceLimit*
| |
− | | Pointer to resource limits for process.
| |
− | |-
| |
− | | 0x84
| |
− | | u32
| |
− | | Number of threads which belong to this process.
| |
− | |-
| |
− | | 0x88
| |
| | 0x10-bytes | | | 0x10-bytes |
− | | SVC access control mask from the exheader kernel descriptors. | + | | SVC access control mask from the exheader kernel descriptors. This is copied to the [[Memory_layout#0xFF4XX000|Thread Context]] area when creating threads, which is the actual data the SVC-handler checks for SVC-access-control. |
| |- | | |- |
− | | 0x98 | + | | 0xA0 |
| | u32[4] | | | u32[4] |
| | Interrupt flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words | | | Interrupt flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words |
| |- | | |- |
− | | 0xA8 | + | | 0xB0 |
| | u32 | | | u32 |
− | | Kernel flags from the exheader kernel descriptors. | + | | Kernel flags from the exheader kernel descriptors. |
| |- | | |- |
− | | 0xAC | + | | 0xB4 |
| | u16 | | | u16 |
| | Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM. | | | Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM. |
| |- | | |- |
− | | 0xAE | + | | 0xB6 |
| | u16 | | | u16 |
| | Kernel release version field, from the exheader kernel descriptors. | | | Kernel release version field, from the exheader kernel descriptors. |
| |- | | |- |
− | | 0xB0 | + | | 0xB8 |
− | | u32 | + | | KCodeSet* |
| | Pointer to [[KCodeSet]] instance | | | Pointer to [[KCodeSet]] instance |
| |- | | |- |
− | | 0xB4 | + | | 0xBC |
| | u32 | | | u32 |
| | Process id, this always begins at 0x0 for the first process. | | | Process id, this always begins at 0x0 for the first process. |
| |- | | |- |
| | 0xC0 | | | 0xC0 |
| + | | s64 |
| + | | Process creation time as tick count |
| + | |- |
| + | | 0xC8 |
| | KThread* | | | KThread* |
| | Pointer to the process's main thread. | | | Pointer to the process's main thread. |
| |- | | |- |
− | | 0xD4 | + | | 0xCC |
− | | KProcessHandleTable | + | | u32[4] |
| + | | Interrupt enabled flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words |
| + | |- |
| + | | 0xDC |
| + | | [[KProcess#KProcessHandleTable|KProcessHandleTable]] |
| | This is the data for tracking and using all of the KProcess's handles. | | | This is the data for tracking and using all of the KProcess's handles. |
| |- | | |- |
− | | 0xEC | + | | 0x234 |
− | | HandleData[0x28]
| |
− | | These internal HandleData entries are only used if the exheader's handle table size is 0
| |
− | |-
| |
− | | 0x22C
| |
− | | ?
| |
− | | Unknown
| |
− | |}
| |
− | | |
− | | |
− | Structure starting with [[8.1.0-0 New3DS]] NATIVE_FIRM:
| |
− | | |
− | Size : 0x270 bytes
| |
− | | |
− | {| class="wikitable" border="1"
| |
− | |-
| |
− | ! Offset
| |
− | ! Type
| |
− | ! Description
| |
− | |-
| |
− | | 0x0
| |
| | u32 | | | u32 |
− | | Pointer to vtable | + | | Unused (From here up, everything is set to 0 on creation, has 0 written to it again during process creation, and is never used again.) |
| |- | | |- |
− | | 0x4 | + | | 0x238 |
− | | u32 | + | | u64 |
− | | Reference count | + | | Unused |
| |- | | |- |
− | | 0x8 | + | | 0x240 |
− | | u32 | + | | u64 |
− | | Count of KThreads that sync with this object - number of nodes in the linked list below | + | | Unused |
| |- | | |- |
− | | 0xC | + | | 0x248 |
− | | KLinkedListNode* | + | | u64 |
− | | Pointer to first KLinkedListNode in node list of KThreads that sync with this object | + | | Unused |
| |- | | |- |
− | | 0x10 | + | | 0x250 |
− | | KLinkedListNode* | + | | u64 |
− | | Pointer to last KLinkedListNode in node list of KThreads that sync with this object | + | | Unused |
− | |-
| |
− | | 0x64
| |
− | | u32
| |
− | | Virtual address of the MMU table for this process
| |
− | |-
| |
− | | 0x84
| |
− | | KResourceLimit*
| |
− | | Pointer to resource limits for process.
| |
− | |-
| |
− | | 0xB0
| |
− | | u32
| |
− | | Kernel flags from the exheader kernel descriptors.
| |
− | |-
| |
− | | 0xBC
| |
− | | u32
| |
− | | Process id, this always begins at 0x0 for the first process.
| |
| |- | | |- |
− | | 0xC8 | + | | 0x258 |
− | | KThread* | + | | u64 |
− | | Pointer to the process's main thread. | + | | Unused |
| |- | | |- |
− | | 0xDC | + | | 0x260 |
− | | KProcessHandleTable | + | | u64 |
− | | This is the data for tracking and using all of the KProcess's handles. | + | | Unused |
| |- | | |- |
− | | 0xF4 | + | | 0x268 |
− | | HandleData[0x28] | + | | u64 |
− | | These internal HandleData entries are only used if the exheader's handle table size is 0 | + | | Unused |
| |} | | |} |
| | | |
| | | |
− | KProcessHandleTable info struct: | + | = KProcessHandleTable = |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 348: |
Line 181: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | HandleData* | + | | HandleDescriptor* |
| | Pointer to the process's handle table. | | | Pointer to the process's handle table. |
| |- | | |- |
| | 0x4 | | | 0x4 |
− | | u16 | + | | s16 |
| | The max number of handles that can be open at once - usually 0x200. | | | The max number of handles that can be open at once - usually 0x200. |
| |- | | |- |
| | 0x6 | | | 0x6 |
− | | u16 | + | | s16 |
− | | Unknown | + | | The highest count of handles that have been open at once |
| |- | | |- |
| | 0x8 | | | 0x8 |
− | | HandleData* | + | | HandleDescriptor* |
− | | Pointer to the next open HandleData entry in the handle table. | + | | Pointer to the next open HandleDescriptor entry in the handle table. |
| |- | | |- |
| | 0xC | | | 0xC |
− | | u16 | + | | s16 |
| | Total handles used by this KProcess. | | | Total handles used by this KProcess. |
| |- | | |- |
| | 0xE | | | 0xE |
− | | u16 | + | | s16 |
| | The current number of handles in use. | | | The current number of handles in use. |
| |- | | |- |
| | 0x10 | | | 0x10 |
− | | u32 | + | | [[KObjectMutex]] |
− | | Unknown | + | | Mutex |
− | |-
| |
− | | 0x14
| |
− | | u32
| |
− | | Unknown
| |
− | |-
| |
− | | 0x16
| |
− | | u32
| |
− | | Unknown
| |
| |- | | |- |
| | 0x18 | | | 0x18 |
− | | HandleData[28] | + | | HandleDescriptor[0x28] |
− | | This small handle data table, internal to the KProcess, is only used in certain processes that don't have an external handle data table in FCRAM. It is all zeros in most processes. | + | | This small handle data table, internal to the KProcess, is only used in certain processes that don't have an external handle descriptor table in FCRAM. It is all zeros in most processes. |
| |} | | |} |
| | | |
− | | + | = HandleDescriptor = |
− | HandleData struct:
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 411: |
Line 235: |
| On table creation, each entry in the handle data table is populated with a pointer to the next entry in the table. When a new handle is created, that pointer is moved into offset 0x8 of the KProcessHandleTable info struct to use for generation of the next handle. | | On table creation, each entry in the handle data table is populated with a pointer to the next entry in the table. When a new handle is created, that pointer is moved into offset 0x8 of the KProcessHandleTable info struct to use for generation of the next handle. |
| | | |
− | The final handle that gets returned when a handle is created is (handle_index | (handle_total << 15)), basically they take the index into the handle data table and OR that with the total handle count << 15. This returned value is the one that gets passed back to the running application and is used to look up the HandleData entry in the table. | + | The final handle that gets returned when a handle is created is (handle_index | (handle_total << 15)), basically they take the index into the handle data table and OR that with the total handle count << 15. This returned value is the one that gets passed back to the running application and is used to look up the HandleDescriptor entry in the table. |