helos1/driver/block/ramdisk.hpp

47 lines
1.6 KiB
C++
Raw Normal View History

2021-10-23 19:39:23 +08:00
#pragma once
#include "blockdevice.hpp"
namespace helos {
// Ramdisk is a block device residing in runtime RAM.
class BlockDeviceRamdisk: public BlockDevice {
public:
BlockDeviceRamdisk(const BlockDeviceRamdisk &) = delete; // Don't copy by value
BlockDeviceRamdisk(BlockDeviceRamdisk &&) = delete;
const BlockDeviceRamdisk &operator=(const BlockDeviceRamdisk &) = delete;
public:
// Creates new, empty (all zero) ramdisk, allocating from kernel memory
BlockDeviceRamdisk(uint64_t blockSize, uint64_t blockCount, ::helos::Permission perm);
// Creates a Ramdisk wrapper from an existing buffer
// Size of the buffer must be a multiple of BlockSize
BlockDeviceRamdisk(void *buffer, uint64_t blockSize, uint64_t blockCount, ::helos ::Permission perm);
~BlockDeviceRamdisk();
public:
uint64_t BlockSize() const override { return blocksize; }
uint64_t Size() const override { return blockcount; }
uint64_t SizeBytes() const override { return blocksize * blockcount; }
::helos::Permission DevicePermission() const override { return perm; }
2021-10-23 19:39:23 +08:00
uint64_t ReadBlock(uint64_t blockOffset, void *data, uint64_t blockCount) const override;
uint64_t WriteBlock(uint64_t blockOffset, const void *data, uint64_t blockCount) override;
public:
// Buffer returns the underlying buffer.
void *Buffer() { return buffer; }
private:
uint64_t blocksize, blockcount;
void * buffer;
int pages; // Number of pages allocated in 4K or 2M paging allocation
::helos::Permission perm;
uint16_t alloctype; // Type of the buffer allocated
};
} // namespace helos