Sfoglia il codice sorgente

Add subregions to /proc/PID/vm

Andreas Kling 6 anni fa
parent
commit
0a6a2521e8
2 ha cambiato i file con 17 aggiunte e 2 eliminazioni
  1. 13 1
      Kernel/ProcFileSystem.cpp
  2. 4 1
      Kernel/Task.h

+ 13 - 1
Kernel/ProcFileSystem.cpp

@@ -30,7 +30,7 @@ ByteBuffer procfs$pid_vm(const Task& task)
 {
     InterruptDisabler disabler;
     char* buffer;
-    auto stringImpl = StringImpl::createUninitialized(80 + task.regionCount() * 80, buffer);
+    auto stringImpl = StringImpl::createUninitialized(80 + task.regionCount() * 80 + 80 + task.subregionCount() * 80, buffer);
     memset(buffer, 0, stringImpl->length());
     char* ptr = buffer;
     ptr += ksprintf(ptr, "BEGIN       END         SIZE        NAME\n");
@@ -41,6 +41,18 @@ ByteBuffer procfs$pid_vm(const Task& task)
             region->size,
             region->name.characters());
     }
+    if (task.subregionCount()) {
+        ptr += ksprintf(ptr, "\nREGION    OFFSET    BEGIN       END         SIZE        NAME\n");
+        for (auto& subregion : task.subregions()) {
+            ptr += ksprintf(ptr, "%x  %x  %x -- %x    %x    %s\n",
+                subregion->region->linearAddress.get(),
+                subregion->offset,
+                subregion->linearAddress.get(),
+                subregion->linearAddress.offset(subregion->size - 1).get(),
+                subregion->size,
+                subregion->name.characters());
+        }
+    }
     *ptr = '\0';
     return ByteBuffer::copy((byte*)buffer, ptr - buffer);
 }

+ 4 - 1
Kernel/Task.h

@@ -15,7 +15,8 @@ class Zone;
 
 class Task : public InlineLinkedListNode<Task> {
     friend class InlineLinkedListNode<Task>;
-    class Region;
+    struct Region;
+    struct Subregion;
 public:
     static Task* createKernelTask(void (*entry)(), String&& name);
     static Task* createUserTask(const String& path, uid_t, gid_t, pid_t parentPID, int& error, const char** args = nullptr);
@@ -114,6 +115,8 @@ public:
 
     size_t regionCount() const { return m_regions.size(); }
     const Vector<RetainPtr<Region>>& regions() const { return m_regions; }
+    size_t subregionCount() const { return m_regions.size(); }
+    const Vector<OwnPtr<Subregion>>& subregions() const { return m_subregions; }
     void dumpRegions();
 
     void didSchedule() { ++m_timesScheduled; }