# Linux Kernel Module Cheat

##### 24.21.2.2. gem5 `Request`

One good way to think about `Request` vs `Packet` could be "it is what the instruction definitions see", a bit like `ExecContext` vs `ThreadContext`.

`Request` is passed to the constructor of `Packet`, and `Packet` keeps a reference to it:

        Packet(const RequestPtr &_req, MemCmd _cmd)
            :  cmd(_cmd), id((PacketId)_req.get()), req(_req),
               data(nullptr), addr(0), _isSecure(false), size(0),
               _qosValue(0), headerDelay(0), snoopDelay(0),
               payloadDelay(0), senderState(NULL)
        {
            if (req->hasPaddr()) {
                addr = req->getPaddr();
                flags.set(VALID_ADDR);
                _isSecure = req->isSecure();
            }
            if (req->hasSize()) {
                size = req->getSize();
                flags.set(VALID_SIZE);
            }
        }

where `RequestPtr` is defined as:

    typedef std::shared_ptr<Request> RequestPtr;

so we see that shared pointers to requests are basically passed around.

Some key fields include:

- `_paddr`:

      /**
          * The physical address of the request. Valid only if validPaddr
          * is set.
          */
      Addr _paddr = 0;

- `_vaddr`:

      /** The virtual address of the request. */
      Addr _vaddr = MaxAddr;

- gem5 <code>Request</code> in <code>AtomicSimpleCPU</code>

- gem5 <code>Request</code> in <code>TimingSimpleCPU</code>