mirror of
https://github.com/RGBCube/serenity
synced 2025-06-22 14:12:10 +00:00
Kernel: Implement OffsetDiskDevice to prepare for partition support
This implements a passthrough disk driver that translates the read/write block addresses by a fixed offset. This could form the basis of MBR partition support if we were to parse the MBR table at boot and create that OffsetDiskDevice dynamically, rather than seeking to a fixed offset. This also introduces a dependency in the form of grub. You'll need to have 32-bit grub binaries installed to build the project now. As a bonus, divorcing Serenity from qemu's kernel loading means we can now *technically* boot on real hardware. It just... doesn't get very far yet. If you write the `_disk_image` file to an IDE hard drive and boot it in a machine that supports all the basic PC hardware, it *will* start loading the kernel.
This commit is contained in:
parent
5e1c7cb32c
commit
6f43f81fb4
8 changed files with 220 additions and 66 deletions
63
Kernel/Devices/OffsetDiskDevice.cpp
Normal file
63
Kernel/Devices/OffsetDiskDevice.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
#include <Kernel/Devices/OffsetDiskDevice.h>
|
||||
|
||||
// #define OFFD_DEBUG
|
||||
|
||||
Retained<OffsetDiskDevice> OffsetDiskDevice::create(Retained<DiskDevice>&& device, unsigned offset)
|
||||
{
|
||||
return adopt(*new OffsetDiskDevice(move(device), offset));
|
||||
}
|
||||
|
||||
OffsetDiskDevice::OffsetDiskDevice(Retained<DiskDevice>&& device, unsigned offset)
|
||||
: m_device(move(device)), m_offset(offset)
|
||||
{
|
||||
}
|
||||
|
||||
OffsetDiskDevice::~OffsetDiskDevice()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned OffsetDiskDevice::block_size() const
|
||||
{
|
||||
return m_device->block_size();
|
||||
}
|
||||
|
||||
bool OffsetDiskDevice::read_block(unsigned index, byte* out) const
|
||||
{
|
||||
#ifdef OFFD_DEBUG
|
||||
kprintf("OffsetDiskDevice::read_block %u (really: %u)\n", index, m_offset + index);
|
||||
#endif
|
||||
|
||||
return m_device->read_block(m_offset + index, out);
|
||||
}
|
||||
|
||||
bool OffsetDiskDevice::write_block(unsigned index, const byte* data)
|
||||
{
|
||||
#ifdef OFFD_DEBUG
|
||||
kprintf("OffsetDiskDevice::write_block %u (really: %u)\n", index, m_offset + index);
|
||||
#endif
|
||||
|
||||
return m_device->write_block(m_offset + index, data);
|
||||
}
|
||||
|
||||
bool OffsetDiskDevice::read_blocks(unsigned index, word count, byte* out)
|
||||
{
|
||||
#ifdef OFFD_DEBUG
|
||||
kprintf("OffsetDiskDevice::read_blocks %u (really: %u) count=%u\n", index, m_offset + index, count);
|
||||
#endif
|
||||
|
||||
return m_device->read_blocks(m_offset + index, count, out);
|
||||
}
|
||||
|
||||
bool OffsetDiskDevice::write_blocks(unsigned index, word count, const byte* data)
|
||||
{
|
||||
#ifdef OFFD_DEBUG
|
||||
kprintf("OffsetDiskDevice::write_blocks %u (really: %u) count=%u\n", index, m_offset + index, count);
|
||||
#endif
|
||||
|
||||
return m_device->write_blocks(m_offset + index, count, data);
|
||||
}
|
||||
|
||||
const char* OffsetDiskDevice::class_name() const
|
||||
{
|
||||
return "OffsetDiskDevice";
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue