+ let init_task = Kernel_task_struct.get kernel_version image.mem 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.Kernel_task_struct.tasks'next in
+ let next_addr = Virt_mem_mmap.unsafe_addr_of_typed_addr next in
+ if next_addr <> init_task_addr then (
+ let mapped =
+ Virt_mem_mmap.is_mapped_range image.mem
+ next_addr task_struct_size in
+ let image =
+ if not mapped then load_memory image next_addr task_struct_size
+ else image in
+ let task = Kernel_task_struct.get kernel_version image.mem next in
+ let acc = task :: acc in
+ loop image acc task
+ ) else
+ acc, image
+ in
+ loop image [] init_task in