|
|
@@ -0,0 +1,454 @@
|
|
|
+use core::ffi::{c_uchar, c_uint, c_ulonglong, c_ushort};
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct ScreenInfo {
|
|
|
+ pub orig_x: c_uchar, /* 0x00 */
|
|
|
+ pub orig_y: c_uchar, /* 0x01 */
|
|
|
+ pub ext_mem_k: c_ushort, /* 0x02 */
|
|
|
+ pub orig_video_page: c_ushort, /* 0x04 */
|
|
|
+ pub orig_video_mode: c_uchar, /* 0x06 */
|
|
|
+ pub orig_video_cols: c_uchar, /* 0x07 */
|
|
|
+ pub flags: c_uchar, /* 0x08 */
|
|
|
+ pub unused2: c_uchar, /* 0x09 */
|
|
|
+ pub orig_video_ega_bx: c_ushort, /* 0x0a */
|
|
|
+ pub unused3: c_ushort, /* 0x0c */
|
|
|
+ pub orig_video_lines: c_uchar, /* 0x0e */
|
|
|
+ pub orig_video_is_vga: c_uchar, /* 0x0f */
|
|
|
+ pub orig_video_points: c_ushort, /* 0x10 */
|
|
|
+
|
|
|
+ /* VESA graphic mode -- linear frame buffer */
|
|
|
+ pub lfb_width: c_ushort, /* 0x12 */
|
|
|
+ pub lfb_height: c_ushort, /* 0x14 */
|
|
|
+ pub lfb_depth: c_ushort, /* 0x16 */
|
|
|
+ pub lfb_base: c_uint, /* 0x18 */
|
|
|
+ pub lfb_size: c_uint, /* 0x1c */
|
|
|
+ pub cl_magic: c_ushort, /* 0x20 */
|
|
|
+ pub cl_offset: c_ushort, /* 0x20 + 2 */
|
|
|
+ pub lfb_linelength: c_ushort, /* 0x24 */
|
|
|
+ pub red_size: c_uchar, /* 0x26 */
|
|
|
+ pub red_pos: c_uchar, /* 0x27 */
|
|
|
+ pub green_size: c_uchar, /* 0x28 */
|
|
|
+ pub green_pos: c_uchar, /* 0x29 */
|
|
|
+ pub blue_size: c_uchar, /* 0x2a */
|
|
|
+ pub blue_pos: c_uchar, /* 0x2b */
|
|
|
+ pub rsvd_size: c_uchar, /* 0x2c */
|
|
|
+ pub rsvd_pos: c_uchar, /* 0x2d */
|
|
|
+ pub vesapm_seg: c_ushort, /* 0x2e */
|
|
|
+ pub vesapm_off: c_ushort, /* 0x30 */
|
|
|
+ pub pages: c_ushort, /* 0x32 */
|
|
|
+ pub vesa_attributes: c_ushort, /* 0x34 */
|
|
|
+ pub capabilities: c_uint, /* 0x36 */
|
|
|
+ pub ext_lfb_base: c_uint, /* 0x3a */
|
|
|
+ pub _reserved: [c_uchar; 2], /* 0x3e */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct ApmBiosInfo {
|
|
|
+ pub version: c_ushort, /* 0x00 */
|
|
|
+ pub cseg: c_ushort, /* 0x02 */
|
|
|
+ pub offset: c_uint, /* 0x04 */
|
|
|
+ pub cseg_16: c_ushort, /* 0x08 */
|
|
|
+ pub dseg: c_ushort, /* 0x0a */
|
|
|
+ pub flags: c_ushort, /* 0x0c */
|
|
|
+ pub cseg_len: c_ushort, /* 0x0e */
|
|
|
+ pub cseg_16_len: c_ushort, /* 0x10 */
|
|
|
+ pub dseg_len: c_ushort, /* 0x12 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct IstInfo {
|
|
|
+ pub signature: c_uint, /* 0x00 */
|
|
|
+ pub command: c_uint, /* 0x04 */
|
|
|
+ pub event: c_uint, /* 0x08 */
|
|
|
+ pub perf_level: c_uint, /* 0x0c */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct SysDescTable {
|
|
|
+ pub length: c_ushort, /* 0x00 */
|
|
|
+ pub table: [c_uchar; 14], /* 0x02 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct OlpcOfwHeader {
|
|
|
+ pub ofw_magic: c_uint, /* OFW signature - 0x00 */
|
|
|
+ pub ofw_version: c_uint, /* 0x04 */
|
|
|
+ pub cif_handler: c_uint, /* callback into OFW - 0x08 */
|
|
|
+ pub irq_desc_table: c_uint, /* 0x0c */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct EdidInfo {
|
|
|
+ pub dummy: [u8; 128],
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct EfiInfo {
|
|
|
+ pub efi_loader_signature: c_uint, /* 0x00 */
|
|
|
+ pub efi_systab: c_uint, /* 0x04 */
|
|
|
+ pub efi_memdesc_size: c_uint, /* 0x08 */
|
|
|
+ pub efi_memdesc_version: c_uint, /* 0x0c */
|
|
|
+ pub efi_memmap: c_uint, /* 0x10 */
|
|
|
+ pub efi_memmap_size: c_uint, /* 0x14 */
|
|
|
+ pub efi_systab_hi: c_uint, /* 0x18 */
|
|
|
+ pub efi_memmap_hi: c_uint, /* 0x1c */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct SetupHeader {
|
|
|
+ pub setup_sects: c_uchar, /* 0x00 */
|
|
|
+ pub root_flags: c_ushort, /* 0x01 */
|
|
|
+ pub syssize: c_uint, /* 0x03 */
|
|
|
+ pub ram_size: c_ushort, /* 0x07 */
|
|
|
+ pub vid_mode: c_ushort, /* 0x09 */
|
|
|
+ pub root_dev: c_ushort, /* 0x0b */
|
|
|
+ pub boot_flag: c_ushort, /* 0x0d */
|
|
|
+ pub jump: c_ushort, /* 0x0f */
|
|
|
+ pub header: c_uint, /* 0x11 */
|
|
|
+ pub version: c_ushort, /* 0x15 */
|
|
|
+ pub realmode_swtch: c_uint, /* 0x17 */
|
|
|
+ pub start_sys_seg: c_ushort, /* 0x1b */
|
|
|
+ pub kernel_version: c_ushort, /* 0x1d */
|
|
|
+ pub type_of_loader: c_uchar, /* 0x1f */
|
|
|
+ pub loadflags: c_uchar, /* 0x20 */
|
|
|
+ pub setup_move_size: c_ushort, /* 0x21 */
|
|
|
+ pub code32_start: c_uint, /* 0x23 */
|
|
|
+ pub ramdisk_image: c_uint, /* 0x27 */
|
|
|
+ pub ramdisk_size: c_uint, /* 0x2b */
|
|
|
+ pub bootsect_kludge: c_uint, /* 0x2f */
|
|
|
+ pub heap_end_ptr: c_ushort, /* 0x33 */
|
|
|
+ pub ext_loader_ver: c_uchar, /* 0x35 */
|
|
|
+ pub ext_loader_type: c_uchar, /* 0x36 */
|
|
|
+ pub cmd_line_ptr: c_uint, /* 0x37 */
|
|
|
+ pub initrd_addr_max: c_uint, /* 0x3b */
|
|
|
+ pub kernel_alignment: c_uint, /* 0x3f */
|
|
|
+ pub relocatable_kernel: c_uchar, /* 0x43 */
|
|
|
+ pub min_alignment: c_uchar, /* 0x44 */
|
|
|
+ pub xloadflags: c_ushort, /* 0x45 */
|
|
|
+ pub cmdline_size: c_uint, /* 0x47 */
|
|
|
+ pub hardware_subarch: c_uint, /* 0x4b */
|
|
|
+ pub hardware_subarch_data: c_ulonglong, /* 0x4f */
|
|
|
+ pub payload_offset: c_uint, /* 0x57 */
|
|
|
+ pub payload_length: c_uint, /* 0x5b */
|
|
|
+ pub setup_data: c_ulonglong, /* 0x5f */
|
|
|
+ pub pref_address: c_ulonglong, /* 0x67 */
|
|
|
+ pub init_size: c_uint, /* 0x6f */
|
|
|
+ pub handover_offset: c_uint, /* 0x73 */
|
|
|
+ pub kernel_info_offset: c_uint, /* 0x77 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct BootE820Entry {
|
|
|
+ pub addr: u64, /* 0x00 */
|
|
|
+ pub size: u64, /* 0x08 */
|
|
|
+ pub type_: u32, /* 0x10 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddDeviceParams {
|
|
|
+ pub length: c_ushort, /* 0x00 */
|
|
|
+ pub info_flags: c_ushort, /* 0x02 */
|
|
|
+ pub num_default_cylinders: c_uint, /* 0x04 */
|
|
|
+ pub num_default_heads: c_uint, /* 0x08 */
|
|
|
+ pub sectors_per_track: c_uint, /* 0x0c */
|
|
|
+ pub number_of_sectors: c_ulonglong, /* 0x10 */
|
|
|
+ pub bytes_per_sector: c_ushort, /* 0x18 */
|
|
|
+ pub dpte_ptr: c_uint, /* 0x1a */
|
|
|
+ pub key: c_ushort, /* 0x1e */
|
|
|
+ pub device_path_info_length: c_uchar, /* 0x20 */
|
|
|
+ pub reserved2: c_uchar, /* 0x21 */
|
|
|
+ pub reserved3: c_ushort, /* 0x22 */
|
|
|
+ pub host_bus_type: [c_uchar; 4], /* 0x24 */
|
|
|
+ pub interface_type: [c_uchar; 8], /* 0x28 */
|
|
|
+ pub interface_path: EddInterfacePath, /* 0x30 */
|
|
|
+ pub device_path: EddDevicePath, /* 0x38 */
|
|
|
+ pub reserved4: c_uchar, /* 0x48 */
|
|
|
+ pub checksum: c_uchar, /* 0x49 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub union EddInterfacePath {
|
|
|
+ pub isa: EddIsaPath,
|
|
|
+ pub pci: EddPciPath,
|
|
|
+ pub ibnd: EddIbndPath,
|
|
|
+ pub xprs: EddXprsPath,
|
|
|
+ pub htpt: EddHtptPath,
|
|
|
+ pub unknown: EddUnknownPath,
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddIsaPath {
|
|
|
+ pub base_address: c_ushort, /* 0x00 */
|
|
|
+ pub reserved1: c_ushort, /* 0x02 */
|
|
|
+ pub reserved2: c_uint, /* 0x04 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddPciPath {
|
|
|
+ pub bus: c_uchar, /* 0x00 */
|
|
|
+ pub slot: c_uchar, /* 0x01 */
|
|
|
+ pub function: c_uchar, /* 0x02 */
|
|
|
+ pub channel: c_uchar, /* 0x03 */
|
|
|
+ pub reserved: c_uint, /* 0x04 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddIbndPath {
|
|
|
+ pub reserved: c_ulonglong, /* 0x00 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddXprsPath {
|
|
|
+ pub reserved: c_ulonglong, /* 0x00 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddHtptPath {
|
|
|
+ pub reserved: c_ulonglong, /* 0x00 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddUnknownPath {
|
|
|
+ pub reserved: c_ulonglong, /* 0x00 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub union EddDevicePath {
|
|
|
+ pub ata: EddAtaPath,
|
|
|
+ pub atapi: EddAtapiPath,
|
|
|
+ pub scsi: EddScsiPath,
|
|
|
+ pub usb: EddUsbPath,
|
|
|
+ pub i1394: EddI1394Path,
|
|
|
+ pub fibre: EddFibrePath,
|
|
|
+ pub i2o: EddI2oPath,
|
|
|
+ pub raid: EddRaidPath,
|
|
|
+ pub sata: EddSataPath,
|
|
|
+ pub unknown: EddUnknownDevicePath,
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddAtaPath {
|
|
|
+ pub device: c_uchar, /* 0x00 */
|
|
|
+ pub reserved1: c_uchar, /* 0x01 */
|
|
|
+ pub reserved2: c_ushort, /* 0x02 */
|
|
|
+ pub reserved3: c_uint, /* 0x04 */
|
|
|
+ pub reserved4: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddAtapiPath {
|
|
|
+ pub device: c_uchar, /* 0x00 */
|
|
|
+ pub lun: c_uchar, /* 0x01 */
|
|
|
+ pub reserved1: c_uchar, /* 0x02 */
|
|
|
+ pub reserved2: c_uchar, /* 0x03 */
|
|
|
+ pub reserved3: c_uint, /* 0x04 */
|
|
|
+ pub reserved4: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddScsiPath {
|
|
|
+ pub id: c_ushort, /* 0x00 */
|
|
|
+ pub lun: c_ulonglong, /* 0x02 */
|
|
|
+ pub reserved1: c_ushort, /* 0x0a */
|
|
|
+ pub reserved2: c_uint, /* 0x0c */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddUsbPath {
|
|
|
+ pub serial_number: c_ulonglong, /* 0x00 */
|
|
|
+ pub reserved: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddI1394Path {
|
|
|
+ pub eui: c_ulonglong, /* 0x00 */
|
|
|
+ pub reserved: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddFibrePath {
|
|
|
+ pub wwid: c_ulonglong, /* 0x00 */
|
|
|
+ pub lun: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddI2oPath {
|
|
|
+ pub identity_tag: c_ulonglong, /* 0x00 */
|
|
|
+ pub reserved: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddRaidPath {
|
|
|
+ pub array_number: c_uint, /* 0x00 */
|
|
|
+ pub reserved1: c_uint, /* 0x04 */
|
|
|
+ pub reserved2: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddSataPath {
|
|
|
+ pub device: c_uchar, /* 0x00 */
|
|
|
+ pub reserved1: c_uchar, /* 0x01 */
|
|
|
+ pub reserved2: c_ushort, /* 0x02 */
|
|
|
+ pub reserved3: c_uint, /* 0x04 */
|
|
|
+ pub reserved4: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddUnknownDevicePath {
|
|
|
+ pub reserved1: c_ulonglong, /* 0x00 */
|
|
|
+ pub reserved2: c_ulonglong, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+#[repr(C, packed)]
|
|
|
+#[derive(Copy, Clone)]
|
|
|
+pub struct EddInfo {
|
|
|
+ pub device: c_uchar, /* 0x00 */
|
|
|
+ pub version: c_uchar, /* 0x01 */
|
|
|
+ pub interface_support: c_ushort, /* 0x02 */
|
|
|
+ pub legacy_max_cylinder: c_ushort, /* 0x04 */
|
|
|
+ pub legacy_max_head: c_uchar, /* 0x06 */
|
|
|
+ pub legacy_sectors_per_track: c_uchar, /* 0x07 */
|
|
|
+ pub params: EddDeviceParams, /* 0x08 */
|
|
|
+}
|
|
|
+
|
|
|
+/// 对齐 Linux 的 boot_params
|
|
|
+/// https://code.dragonos.org.cn/xref/linux-6.1.9/arch/x86/include/uapi/asm/bootparam.h#185
|
|
|
+#[repr(C, packed)]
|
|
|
+pub struct ArchBootParams {
|
|
|
+ pub screen_info: ScreenInfo, /* 0x000 */
|
|
|
+ pub apm_bios_info: ApmBiosInfo, /* 0x040 */
|
|
|
+ pub _pad2: [c_uchar; 4], /* 0x054 */
|
|
|
+ pub tboot_addr: c_ulonglong, /* 0x058 */
|
|
|
+ pub ist_info: IstInfo, /* 0x060 */
|
|
|
+ pub acpi_rsdp_addr: c_ulonglong, /* 0x070 */
|
|
|
+ pub _pad3: [c_uchar; 8], /* 0x078 */
|
|
|
+ pub hd0_info: [c_uchar; 16], /* obsolete! */
|
|
|
+ /* 0x080 */
|
|
|
+ pub hd1_info: [c_uchar; 16], /* obsolete! */
|
|
|
+ /* 0x090 */
|
|
|
+ pub sys_desc_table: SysDescTable, /* obsolete! */
|
|
|
+ /* 0x0a0 */
|
|
|
+ pub olpc_ofw_header: OlpcOfwHeader, /* 0x0b0 */
|
|
|
+ pub ext_ramdisk_image: c_uint, /* 0x0c0 */
|
|
|
+ pub ext_ramdisk_size: c_uint, /* 0x0c4 */
|
|
|
+ pub ext_cmd_line_ptr: c_uint, /* 0x0c8 */
|
|
|
+ pub _pad4: [c_uchar; 112], /* 0x0cc */
|
|
|
+ pub cc_blob_address: c_uint, /* 0x13c */
|
|
|
+ pub edid_info: EdidInfo, /* 0x140 */
|
|
|
+ pub efi_info: EfiInfo, /* 0x1c0 */
|
|
|
+ pub alt_mem_k: c_uint, /* 0x1e0 */
|
|
|
+ pub scratch: c_uint, /* 0x1e4 */
|
|
|
+ pub e820_entries: c_uchar, /* 0x1e8 */
|
|
|
+ pub eddbuf_entries: c_uchar, /* 0x1e9 */
|
|
|
+ pub edd_mbr_sig_buf_entries: c_uchar, /* 0x1ea */
|
|
|
+ pub kbd_status: c_uchar, /* 0x1eb */
|
|
|
+ pub secure_boot: c_uchar, /* 0x1ec */
|
|
|
+ pub _pad5: [c_uchar; 2], /* 0x1ed */
|
|
|
+ pub sentinel: c_uchar, /* 0x1ef */
|
|
|
+ pub _pad6: [c_uchar; 1], /* 0x1f0 */
|
|
|
+ pub hdr: SetupHeader, /* 0x1f1 */
|
|
|
+ pub _pad7: [c_uchar; 0x290 - 0x1f1 - core::mem::size_of::<SetupHeader>()], /* 0x290 - 0x1f1 - sizeof(struct setup_header) */
|
|
|
+ pub edd_mbr_sig_buffer: [c_uint; 16], /* 0x290 */
|
|
|
+ pub e820_table: [BootE820Entry; 128], /* 0x2d0 */
|
|
|
+ pub _pad8: [c_uchar; 48], /* 0xcd0 */
|
|
|
+ pub eddbuf: [EddInfo; 6], /* 0xd00 */
|
|
|
+ pub _pad9: [c_uchar; 276], /* 0xeec */
|
|
|
+}
|
|
|
+
|
|
|
+impl core::fmt::Debug for ArchBootParams {
|
|
|
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
|
|
+ write!(f, "Struct ArchBootParams(x86) do not support Debug!")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Linux 非0的字段有:
|
|
|
+// Sceen_info(为0不影响)
|
|
|
+// IstInfo(为0不影响)
|
|
|
+// acpi_rsdp_addr(为0不影响)
|
|
|
+// alt_mem_k 0x7fb40
|
|
|
+// scratch 0x10000d
|
|
|
+// e820_entries 0x09
|
|
|
+// SetupHeader(重要!非常重要)
|
|
|
+// e820_table(与上面的e820_entries数量对应)(这个就是/sys/firmware/memmap)
|
|
|
+impl ArchBootParams {
|
|
|
+ pub const DEFAULT: Self =
|
|
|
+ unsafe { core::mem::MaybeUninit::<ArchBootParams>::zeroed().assume_init() };
|
|
|
+
|
|
|
+ pub fn set_alt_mem_k(&mut self, alt_mem_k: u32) {
|
|
|
+ self.alt_mem_k = alt_mem_k;
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn set_scratch(&mut self, scratch: u32) {
|
|
|
+ self.scratch = scratch;
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn add_e820_entry(&mut self, addr: u64, size: u64, mtype: u32) {
|
|
|
+ let entry = BootE820Entry {
|
|
|
+ addr,
|
|
|
+ size,
|
|
|
+ type_: mtype,
|
|
|
+ };
|
|
|
+ self.e820_entries += 1;
|
|
|
+ self.e820_table[self.e820_entries as usize] = entry;
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn init_setupheader(&mut self) {
|
|
|
+ // 不设置就为0
|
|
|
+ // 下面的是根据同等 qemu 环境(日期为2025.10.15)在启动 Linux 的值
|
|
|
+ // 应该改成自己内核在初始化的过程中获得的值(部分值是需要写死的, 但不应该全部写死)
|
|
|
+ self.hdr.setup_sects = 0x40;
|
|
|
+ self.hdr.root_flags = 0xfb07;
|
|
|
+ self.hdr.syssize = 0x00000d00;
|
|
|
+ self.hdr.ram_size = 0x1000;
|
|
|
+ self.hdr.vid_mode = 0x09;
|
|
|
+ self.hdr.jump = 0xaa55;
|
|
|
+ self.hdr.header = 0x53726448;
|
|
|
+ self.hdr.version = 0x020f;
|
|
|
+ self.hdr.start_sys_seg = 0x1000;
|
|
|
+ self.hdr.kernel_version = 0x42a0;
|
|
|
+ self.hdr.type_of_loader = 0xb0;
|
|
|
+ self.hdr.loadflags = 0x83;
|
|
|
+ self.hdr.setup_move_size = 0x8000;
|
|
|
+ self.hdr.code32_start = 0x10000000;
|
|
|
+ self.hdr.ramdisk_image = 0x00100000;
|
|
|
+ self.hdr.ramdisk_size = 0x1eee6000;
|
|
|
+ self.hdr.bootsect_kludge = 0x010e9eb0;
|
|
|
+ self.hdr.heap_end_ptr = 0xfe00;
|
|
|
+ self.hdr.cmd_line_ptr = 0x20000;
|
|
|
+ self.hdr.initrd_addr_max = 0x7fffffff;
|
|
|
+ self.hdr.kernel_alignment = 0x00200000;
|
|
|
+ self.hdr.relocatable_kernel = 0x1;
|
|
|
+ self.hdr.min_alignment = 0x15;
|
|
|
+ self.hdr.xloadflags = 0x007f;
|
|
|
+ self.hdr.cmdline_size = 0x7ff;
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn convert_to_buf(&self) -> &[u8] {
|
|
|
+ unsafe {
|
|
|
+ core::slice::from_raw_parts(
|
|
|
+ (self as *const Self) as *const u8,
|
|
|
+ core::mem::size_of::<Self>(),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|