Overview
Relevant source files
Purpose and Scope
The axsignal crate implements a Unix-like signal handling system for ArceOS. It provides a comprehensive framework for managing signals at both process and thread levels, supporting standard operations such as sending, blocking, and handling signals. This crate enables applications running on ArceOS to use familiar signal handling patterns similar to those found in POSIX systems.
For detailed explanations of specific components, see Signal Management System, Signal Types and Structures, and Architecture Support.
Sources: src/lib.rs(L1 - L16) Cargo.toml(L1 - L31)
High-Level Architecture
The axsignal crate is organized into several interconnected modules that together form a complete signal handling system.
flowchart TD
subgraph subGraph2["axsignal Crate"]
lib["lib.rs"]
subgraph subGraph1["Architecture Support"]
x86_64["arch/x86_64.rs"]
aarch64["arch/aarch64.rs"]
riscv["arch/riscv.rs"]
loongarch64["arch/loongarch64.rs"]
end
subgraph subGraph0["Core Modules"]
action["action.rs"]
types["types.rs"]
pending["pending.rs"]
api["api.rs"]
arch["arch/mod.rs"]
end
end
arch --> aarch64
arch --> loongarch64
arch --> riscv
arch --> x86_64
lib --> action
lib --> api
lib --> arch
lib --> pending
lib --> types
High-Level Architecture of axsignal
Sources: src/lib.rs(L7 - L15)
Key Components
The axsignal crate consists of several key components that work together to provide signal handling functionality:
Signal Types
classDiagram
class Signo {
+value: u8
+const SIGHUP, SIGINT, SIGQUIT, etc.
+is_standard()
+is_realtime()
}
class SignalSet {
+bits: u64
+new()
+add_signal(Signo)
+del_signal(Signo)
+contains(Signo)
+is_empty()
}
class SignalInfo {
+signo: Signo
+code: i32
+errno: i32
+fields: SignalFields
}
class SignalStack {
+ss_sp: usize
+ss_flags: i32
+ss_size: usize
}
SignalInfo --> Signo
Signal Type Components
Signal Managers
classDiagram
class ProcessSignalManager {
+pending: Mutex
+actions: Arc~
+send_signal(sig: SignalInfo)
+dequeue_signal(mask: SignalSet)
+pending()
+wait_signal()
}
class ThreadSignalManager {
-proc: Arc
-pending: Mutex
-blocked: Mutex
-stack: Mutex
+send_signal(sig: SignalInfo)
+dequeue_signal(mask: SignalSet)
+check_signals(tf, restore_blocked)
+handle_signal(tf, restore_blocked, sig, action)
}
class PendingSignals {
+set: SignalSet
+info_std: Option[32]
+info_rt: VecDeque
+put_signal(sig: SignalInfo)
+dequeue_signal(mask: SignalSet)
}
ThreadSignalManager --> ProcessSignalManager
ProcessSignalManager --> PendingSignals
ThreadSignalManager --> PendingSignals
Signal Management Components
Sources: src/lib.rs(L7 - L15)
Signal Processing Flow
The signal handling process in axsignal follows a well-defined flow from generation to handling:
flowchart TD
subgraph subGraph2["Signal Handling"]
CheckAction["Check SignalAction"]
Default["Execute Default Action"]
Ignore["Ignore Signal"]
Handler["Execute Custom Handler"]
SaveContext["Save CPU Context"]
ExecuteHandler["Run Handler Function"]
RestoreContext["Restore CPU Context"]
end
subgraph subGraph1["Signal Queuing"]
CheckBlocked["Is Signal Blocked?"]
Queue["Add to PendingSignals"]
Deliver["Deliver Immediately"]
end
subgraph subGraph0["Signal Generation"]
Start["Signal Generated"]
SendToProcess["ProcessSignalManager.send_signal()"]
SendToThread["ThreadSignalManager.send_signal()"]
end
CheckPending["check_signals()"]
CheckAction --> Default
CheckAction --> Handler
CheckAction --> Ignore
CheckBlocked --> Deliver
CheckBlocked --> Queue
CheckPending --> Deliver
Deliver --> CheckAction
ExecuteHandler --> RestoreContext
Handler --> SaveContext
Queue --> CheckPending
SaveContext --> ExecuteHandler
SendToProcess --> CheckBlocked
SendToThread --> CheckBlocked
Start --> SendToProcess
Start --> SendToThread
Signal Processing Flow
Sources: src/lib.rs(L7 - L15)
System Dependencies and Integration
The axsignal crate integrates with several core components of ArceOS to provide its functionality:
flowchart TD
subgraph subGraph1["External Dependencies"]
axerrno["axerrno - Error Codes"]
bitflags["bitflags - Bit Flag Manipulation"]
log["log - Logging Infrastructure"]
end
subgraph subGraph0["ArceOS Core Components"]
axconfig["axconfig - System Configuration"]
axhal["axhal - Hardware Abstraction Layer"]
axtask["axtask - Task Management"]
end
axsignal["axsignal"]
axsignal --> axconfig
axsignal --> axerrno
axsignal --> axhal
axsignal --> axtask
axsignal --> bitflags
axsignal --> log
Dependencies and Integration
The crate relies on:
axconfig: For system configuration parametersaxhal: For hardware abstraction with userspace supportaxtask: For multitasking integrationaxerrno: For error handlingbitflags: For efficient signal set implementation- Additional utilities for logging and synchronization
Sources: Cargo.toml(L6 - L26)
Architecture Support
The axsignal crate provides platform-specific implementations for different CPU architectures, ensuring proper signal context management:
flowchart TD
subgraph subGraph2["Architecture-Specific Features"]
context["Machine Context Management"]
trampoline["Signal Trampoline Code"]
setup["Signal Handler Setup"]
restore["Context Restoration"]
end
subgraph subGraph1["Architecture Support"]
arch_mod["arch/mod.rs - Common Interface"]
subgraph subGraph0["Platform-Specific Implementations"]
x86_64["arch/x86_64.rs"]
aarch64["arch/aarch64.rs"]
riscv["arch/riscv.rs"]
loongarch64["arch/loongarch64.rs"]
end
end
aarch64 --> context
aarch64 --> restore
aarch64 --> setup
aarch64 --> trampoline
arch_mod --> aarch64
arch_mod --> loongarch64
arch_mod --> riscv
arch_mod --> x86_64
loongarch64 --> context
loongarch64 --> restore
loongarch64 --> setup
loongarch64 --> trampoline
riscv --> context
riscv --> restore
riscv --> setup
riscv --> trampoline
Architecture Support System
Each architecture implementation provides specialized functionality for:
- Saving and restoring CPU registers during signal handling
- Setting up signal trampolines (code that transfers control to user-defined handlers)
- Managing signal stacks
- Handling architecture-specific signal delivery requirements
Sources: src/lib.rs(L8 - L9)
Summary
The axsignal crate provides a comprehensive signal handling system for ArceOS, implementing familiar Unix-like functionality across multiple processor architectures. It manages signals at both process and thread levels, supports standard and real-time signals, and offers a flexible framework for defining custom signal actions.
Key features include:
- Process and thread level signal management
- Support for multiple architectures (x86_64, AArch64, RISC-V, LoongArch64)
- Signal masking and prioritization
- Custom signal handlers with context management
- Integration with ArceOS task management
For detailed information about specific components, refer to the dedicated pages on Signal Management System and Signal Types and Structures.
Sources: src/lib.rs(L1 - L16) Cargo.toml(L1 - L31)