- let addr =
- (Virt_mem_mmap.unsafe_typed_addr_of_addr addr :
- [ `task_struct ] Virt_mem_mmap.typed_addr) in
- Kernel_task_struct.get kernel_version mem addr in
-
- printf "comm = %S prio = %Ld state = %Ld static_prio = %Ld tasks'next = %Lx\n"
- init_task.Kernel_task_struct.comm
- init_task.Kernel_task_struct.prio
- init_task.Kernel_task_struct.state
- init_task.Kernel_task_struct.static_prio
- (Virt_mem_mmap.unsafe_addr_of_typed_addr init_task.Kernel_task_struct.tasks'next);
+ let init_task =
+ get_task_struct kernel_version image.mem init_task_addr in
+ init_task, init_task_addr in
+
+ (* Starting at init_task, navigate through the linked list of
+ * tasks (through tasks.next). Grab each task_struct as we go.
+ *)
+ let tasks, image =
+ let rec loop image acc task =
+ let next = task.task_struct_tasks'next in
+ if next <> init_task_addr then (
+ let mapped =
+ Virt_mem_mmap.is_mapped_range image.mem next task_struct_size in
+ let image =
+ if not mapped then load_memory image next task_struct_size
+ else image in
+ let task = get_task_struct kernel_version image.mem next in
+ let task = {
+ task with
+ task_struct_comm = truncate_c_string task.task_struct_comm
+ } in
+ let acc = task :: acc in
+ loop image acc task
+ ) else
+ acc, image
+ in
+ loop image [] init_task in
+
+ (* Sort tasks by PID. *)
+ let cmp { task_struct_pid = p1 } { task_struct_pid = p2 } = compare p1 p2 in
+ let tasks = List.sort cmp tasks in
+
+ printf " PID STAT COMMAND\n";
+
+ List.iter (
+ fun task ->
+ printf "%5Ld %s\n" task.task_struct_pid task.task_struct_comm
+ ) tasks