chore(devfs): 清理定位期临时探针,directory_count/file_count 恢复 static

main.vp:删除 devfs 注册结果回读([main] devfs reg / files[k] / find_in_dir / serial0(before fb/desk) fd)、fb0 注册后回读([main] fb0 reg)、desk 共享区地址比对([main] desk shm)、serial0 查找结果([main] devfs serial0 fd)共 6 组诊断打印,去掉不再使用的局部量。保留 _CheckFrameLocals 系列(fail-fast 断言,不是探针)。devfs.vp:删除 framebuffer_device.ioctl 内的两条 [fb0] ioctl 诊断打印与随之无用的 import viperlib;directory_count/file_count 恢复 static(跨模块读取点已随探针删除)。fat32_types.vp 的 winread FAIL / dir read failed 保留为正式错误上报(错误必须立即可见),未改动。
This commit is contained in:
TermiNexus committed 2026-10-16 20:45:40 +08:00
1 parent cfb76b1b94
commit 48017a3d66
2 files changed
+2 -63

No files matched your search

+2 -15
View File
@@ -1,6 +1,5 @@
import drivers.serial.uart.serial as serial
import string
import viperlib
define MAX_FILE_DESCRIPTORS = 64
@@ -9,14 +8,14 @@ define MAX_DIRECTORIES = 16
define PATH_BUFFER_SIZE = 256
directories: [MAX_DIRECTORIES]devfs_directory = [0]
directory_count: int = 0
directory_count: static int = 0
# 存**指针**而不是基类值:按值数组会把设备对象**切片**成 devfs_file(只拷 88 字节基类部分),
# 派生字段(framebuffer_device.fb_w/fb_h/fb_phys…、shm_device.shm_phys…)全部丢失 ——
# 现场表现为 [main] fb0 reg w=1360(读的是模块级对象)而 [fb0] ioctl w=0(读的是数组里的切片)。
# IR 证据:create_file 里生成的是 llvm.load/llvm.store 整个 devfs_file 结构体,不含派生字段。
files: [MAX_DEVICE_FILES]devfs_file* = [0]
file_count: int = 0
file_count: static int = 0
class _fd_table:
@@ -506,12 +505,6 @@ virtual class framebuffer_device(devfs_file):
return -1
def ioctl(self, fd: int, request: int, arg: rawptr) -> int:
# 【诊断·临时】确认 request/arg 是否真的到达内核、以及写入的目标 VA。
# 若这里打印的 request 不是 0x4600,说明 syscall 派发把请求号传错了(app 会读到未写入的残留)。
_io_b: [128]char
viperlib.snprintf(&_io_b, 128, "[fb0] ioctl fd=%d req=0x%lx arg=0x%lx w=%lu h=%lu\n",
fd, uint64(request), uint64(arg), uint64(self.fb_w), uint64(self.fb_h))
serial.puts(&_io_b)
if request != FB_GET_INFO or not arg:
return -1
info: FbInfo* = FbInfo*(uint64(arg))
@@ -521,12 +514,6 @@ virtual class framebuffer_device(devfs_file):
info.format = self.fb_format
info.size = self.fb_size
info.phys = self.fb_phys
# 【诊断·临时】回读刚写的 6 个字段:能读到新值说明写入确实落到了 arg 指向的内存。
_io_b2: [128]char
viperlib.snprintf(&_io_b2, 128, "[fb0] ioctl wrote w=%lu h=%lu pitch=%lu fmt=%lu\n",
uint64(info.width), uint64(info.height),
uint64(info.pitch), uint64(info.format))
serial.puts(&_io_b2)
return 0
def mmap_info(self, fd: int, out_phys: uint64*, out_size: uint64*) -> int:
-48
View File
@@ -273,32 +273,6 @@ class ViperKernel:
devfs.devfs_register_serial1()
devfs.devfs_register_keyboard()
devfs.devfs_register_mouse()
# 【诊断·临时】devfs 注册结果:计数 + files[] 里实际存下的名字 + 直接 find 一次。
# 判读:counts=0 或名字为空 ⇒ 注册没落表;名字正常但 find_in_dir 返回 None ⇒ 名字比较
# 路径坏了;两者都正常而下面 devfs_open 仍 -1 ⇒ 封装层(路径切分/返回值)问题。
_dfi: [160]char
viperlib.snprintf(&_dfi, 160, "[main] devfs reg dirs=%d files=%d\n",
devfs.directory_count, devfs.file_count)
serial.puts(&_dfi)
for _k in range(devfs.file_count):
_dfn: [160]char
viperlib.snprintf(&_dfn, 160, "[main] devfs files[%d] name='%s' priv=0x%lx parent=0x%lx\n",
_k, devfs.files[_k].name,
uint64(devfs.files[_k].private_data),
uint64(devfs.files[_k].parent_dir))
serial.puts(&_dfn)
_df_hit: devfs.devfs_file* = devfs.devfs_file.find_in_dir("serial0", devfs.files[0].parent_dir)
_dfh: [128]char
viperlib.snprintf(&_dfh, 128, "[main] devfs find_in_dir('serial0', files[0].parent)=0x%lx\n",
uint64(_df_hit))
serial.puts(&_dfh)
# 【诊断·临时】在注册 fb0/desk **之前**先查一次 serial0:与后面那次对比,
# 即可判定是不是本轮新增的两个设备注册把 devfs 表搞坏(而不是别的原因)。
_fd0: int = devfs.devfs_open("/dev/serial0", 0)
_fd0_cr: [64]char
viperlib.snprintf(&_fd0_cr, 64, "[main] devfs serial0(before fb/desk) fd=%d\n", _fd0)
serial.puts(&_fd0_cr)
devfs.devfs_close(_fd0)
# /dev/fb0:把 framebuffer 的物理区间与几何登记成设备节点,供用户态图形壳
# explorer 经 open + ioctl(FB_GET_INFO) + mmap 接管屏幕绘制(S1)。
# 【重要】这里**直接从 BootInfo 重取几何**,不复用 L116-120 的长寿命局部量:
@@ -313,36 +287,14 @@ class ViperKernel:
int(BootInfo.framebuffer_pitch),
int(BootInfo.framebuffer_format),
BootInfo.framebuffer_size)
# 【诊断·临时】注册后**立刻回读设备对象**:与 explorer 侧 "[fb0] ioctl … w=? h=?" 对比,
# 即可把"注册时传参就是 0"和"注册正确但对象字段在之后被踩成 0"彻底分开
# (_CheckFrameLocals 只校验 __init__ 的局部量,管不到设备对象里的字段)。
_fb0_cr: [176]char
viperlib.snprintf(&_fb0_cr, 176,
"[main] fb0 reg w=%lu h=%lu pitch=%lu fmt=%lu phys=0x%lx size=%lu\n",
uint64(devfs.fb0_file.fb_w), uint64(devfs.fb0_file.fb_h),
uint64(devfs.fb0_file.fb_pitch), uint64(devfs.fb0_file.fb_format),
devfs.fb0_file.fb_phys, devfs.fb0_file.fb_size)
serial.puts(&_fb0_cr)
# /dev/desk:explorer 与各 app 的共享内存通道(S3)。分配失败就让登记跳过 ——
# explorer 的 open 会明确失败并打日志,不做静默兜底。
desk_shm: rawptr = mm.malloc(uint64(devfs.DESK_SHM_SIZE))
# 【诊断·临时】量出 desk 共享区地址与 devfs 注册表地址:若两者区间重叠,说明
# mm 把堆分到了内核镜像/.bss 上(devfs 注册表被踩 ⇒ devfs_open 查不到设备 ⇒ fd=-1)。
_desk_cr: [128]char
viperlib.snprintf(&_desk_cr, 128, "[main] desk shm=0x%lx size=%lu devfs_files=0x%lx devfs_dirs=0x%lx\n",
uint64(desk_shm), uint64(devfs.DESK_SHM_SIZE),
uint64(&devfs.files[0]), uint64(&devfs.directories[0]))
serial.puts(&_desk_cr)
devfs.devfs_register_desk(desk_shm, uint64(devfs.DESK_SHM_SIZE))
serial.puts("[main] sched started\n")
fd: int = devfs.devfs_open("/dev/serial0", 0)
# 【诊断·临时】devfs 设备查找是否成功:fd < 0 表示 lookup 失败(serial0_open 不会被调、
# 所以 "[serial0] open:" 也不会出现);用户态写串口(explorer 的首条日志)也走这条路。
_devfs_cr: [64]char
viperlib.snprintf(&_devfs_cr, 64, "[main] devfs serial0 fd=%d\n", fd)
serial.puts(&_devfs_cr)
buf: [64]char
string.memset(&buf, 0, 64)
devfs.devfs_write(fd, "hello from devfs!", 17)