mirror of
https://github.com/Leonmmcoset/cleonos.git
synced 2026-04-24 19:34:01 +00:00
partctl
This commit is contained in:
@@ -38,7 +38,7 @@ python wine/cleonos_wine.py build/x86_64/ramdisk_root/shell/shell.elf --rootfs b
|
||||
## 支持
|
||||
|
||||
- ELF64 (x86_64) PT_LOAD 段装载
|
||||
- CLeonOS `int 0x80` syscall 0..92(含 `FD_*`、`DL_*`、`FB_*`、`PROC_*`、`STATS_*`、`EXEC_PATHV_IO`、`KERNEL_VERSION`、`DISK_*`)
|
||||
- CLeonOS `int 0x80` syscall 0..94(含 `FD_*`、`DL_*`、`FB_*`、`PROC_*`、`STATS_*`、`EXEC_PATHV_IO`、`KERNEL_VERSION`、`DISK_*`)
|
||||
- TTY 输出与键盘输入队列
|
||||
- rootfs 文件/目录访问(`FS_*`)
|
||||
- `/temp` 与已挂载磁盘路径写入限制(`FS_MKDIR/WRITE/APPEND/REMOVE`)
|
||||
@@ -52,14 +52,14 @@ python wine/cleonos_wine.py build/x86_64/ramdisk_root/shell/shell.elf --rootfs b
|
||||
- 动态库兼容加载(`DL_OPEN/DL_CLOSE/DL_SYM`,基于 ELF 符号解析)
|
||||
- framebuffer 兼容(`FB_INFO/FB_BLIT/FB_CLEAR`,支持内存缓冲与窗口显示)
|
||||
- 内核版本查询(`KERNEL_VERSION`)
|
||||
- 磁盘接口兼容(`DISK_PRESENT/SIZE_BYTES/SECTOR_COUNT/FORMATTED/FORMAT_FAT32/MOUNT/MOUNTED/MOUNT_PATH`)
|
||||
- Wine 虚拟磁盘目录默认位于 `<rootfs>/__clks_disk0__`(格式化标记文件 `.fat32`)
|
||||
- 磁盘接口兼容(`DISK_PRESENT/SIZE_BYTES/SECTOR_COUNT/FORMATTED/FORMAT_FAT32/MOUNT/MOUNTED/MOUNT_PATH/READ_SECTOR/WRITE_SECTOR`)
|
||||
- Wine 虚拟磁盘目录默认位于 `<rootfs>/__clks_disk0__`(格式化标记文件 `.fat32`,原始扇区后端文件 `.rawdisk.img`)
|
||||
- 异常退出状态编码与故障元信息(`PROC_LAST_SIGNAL/PROC_FAULT_*`)
|
||||
|
||||
## 版本策略
|
||||
|
||||
- CLeonOS-Wine 版本号固定为:`85.0.0-wine`
|
||||
- 该值按项目策略固定,不再随新增 syscall 变更(即使当前实现范围已扩展到 `0..92`)
|
||||
- 该值按项目策略固定,不再随新增 syscall 变更(即使当前实现范围已扩展到 `0..94`)
|
||||
|
||||
## 参数
|
||||
|
||||
|
||||
@@ -107,6 +107,8 @@ SYS_DISK_FORMAT_FAT32 = 89
|
||||
SYS_DISK_MOUNT = 90
|
||||
SYS_DISK_MOUNTED = 91
|
||||
SYS_DISK_MOUNT_PATH = 92
|
||||
SYS_DISK_READ_SECTOR = 93
|
||||
SYS_DISK_WRITE_SECTOR = 94
|
||||
|
||||
# proc states (from cleonos/c/include/cleonos_syscall.h)
|
||||
PROC_STATE_UNUSED = 0
|
||||
|
||||
@@ -69,8 +69,10 @@ from .constants import (
|
||||
SYS_DISK_MOUNTED,
|
||||
SYS_DISK_MOUNT_PATH,
|
||||
SYS_DISK_PRESENT,
|
||||
SYS_DISK_READ_SECTOR,
|
||||
SYS_DISK_SECTOR_COUNT,
|
||||
SYS_DISK_SIZE_BYTES,
|
||||
SYS_DISK_WRITE_SECTOR,
|
||||
SYS_GETPID,
|
||||
SYS_KERNEL_VERSION,
|
||||
SYS_KBD_BUFFERED,
|
||||
@@ -286,10 +288,12 @@ class CLeonOSWineNative:
|
||||
self._disk_mount_path = "/temp/disk"
|
||||
self._disk_root = (self.rootfs / "__clks_disk0__").resolve()
|
||||
self._disk_marker = self._disk_root / ".fat32"
|
||||
self._disk_image_file = self._disk_root / ".rawdisk.img"
|
||||
self._disk_formatted = False
|
||||
self._disk_mounted = False
|
||||
try:
|
||||
self._disk_root.mkdir(parents=True, exist_ok=True)
|
||||
self._disk_prepare_raw_image()
|
||||
if self._disk_marker.exists():
|
||||
self._disk_formatted = True
|
||||
self._disk_mounted = True
|
||||
@@ -762,6 +766,16 @@ class CLeonOSWineNative:
|
||||
return 1 if self._disk_mounted else 0
|
||||
if sid == SYS_DISK_MOUNT_PATH:
|
||||
return self._disk_mount_path_query(uc, arg0, arg1)
|
||||
if sid == SYS_DISK_READ_SECTOR:
|
||||
sector_data = self._disk_read_sector_raw(int(arg0))
|
||||
if sector_data is None:
|
||||
return 0
|
||||
return 1 if self._write_guest_bytes(uc, int(arg1), sector_data) else 0
|
||||
if sid == SYS_DISK_WRITE_SECTOR:
|
||||
sector_data = self._read_guest_bytes_exact(uc, int(arg1), 512)
|
||||
if sector_data is None:
|
||||
return 0
|
||||
return 1 if self._disk_write_sector_raw(int(arg0), sector_data) else 0
|
||||
|
||||
return u64_neg1()
|
||||
|
||||
@@ -1080,20 +1094,78 @@ class CLeonOSWineNative:
|
||||
return None
|
||||
return host
|
||||
|
||||
def _disk_prepare_raw_image(self) -> None:
|
||||
target_size = int(self._disk_size_bytes)
|
||||
|
||||
if target_size < 512:
|
||||
raise RuntimeError("wine disk image size too small")
|
||||
|
||||
if not self._disk_image_file.exists():
|
||||
with open(self._disk_image_file, "wb") as fp:
|
||||
fp.truncate(target_size)
|
||||
return
|
||||
|
||||
current_size = int(self._disk_image_file.stat().st_size)
|
||||
if current_size != target_size:
|
||||
with open(self._disk_image_file, "r+b") as fp:
|
||||
fp.truncate(target_size)
|
||||
|
||||
def _disk_read_sector_raw(self, lba: int) -> Optional[bytes]:
|
||||
if not self._disk_present:
|
||||
return None
|
||||
if lba < 0:
|
||||
return None
|
||||
offset = int(lba) * 512
|
||||
if offset + 512 > int(self._disk_size_bytes):
|
||||
return None
|
||||
try:
|
||||
with open(self._disk_image_file, "rb") as fp:
|
||||
fp.seek(offset)
|
||||
data = fp.read(512)
|
||||
if len(data) != 512:
|
||||
return None
|
||||
return data
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def _disk_write_sector_raw(self, lba: int, data: bytes) -> bool:
|
||||
if not self._disk_present:
|
||||
return False
|
||||
if lba < 0:
|
||||
return False
|
||||
if len(data) != 512:
|
||||
return False
|
||||
offset = int(lba) * 512
|
||||
if offset + 512 > int(self._disk_size_bytes):
|
||||
return False
|
||||
try:
|
||||
with open(self._disk_image_file, "r+b") as fp:
|
||||
fp.seek(offset)
|
||||
fp.write(data)
|
||||
fp.flush()
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def _disk_format_fat32(self, label: str) -> int:
|
||||
_ = label
|
||||
if not self._disk_present:
|
||||
return 0
|
||||
|
||||
try:
|
||||
self._disk_prepare_raw_image()
|
||||
self._disk_root.mkdir(parents=True, exist_ok=True)
|
||||
for child in list(self._disk_root.iterdir()):
|
||||
if child.name == self._disk_marker.name:
|
||||
if child.name == self._disk_marker.name or child.name == self._disk_image_file.name:
|
||||
continue
|
||||
if child.is_dir():
|
||||
shutil.rmtree(child)
|
||||
else:
|
||||
child.unlink()
|
||||
with open(self._disk_image_file, "r+b") as fp:
|
||||
fp.seek(0)
|
||||
fp.write(b"\x00" * 512)
|
||||
fp.flush()
|
||||
self._disk_marker.write_text("FAT32\n", encoding="utf-8")
|
||||
self._disk_formatted = True
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user