From 48017a3d664a929d2459cf6dab773372fb85f7fe Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 16 Oct 2026 20:45:40 +0800 Subject: [PATCH] =?UTF-8?q?chore(devfs):=20=E6=B8=85=E7=90=86=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D=E6=9C=9F=E4=B8=B4=E6=97=B6=E6=8E=A2=E9=92=88=EF=BC=8C?= =?UTF-8?q?directory=5Fcount/file=5Fcount=20=E6=81=A2=E5=A4=8D=20static?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 保留为正式错误上报(错误必须立即可见),未改动。 --- VKernel/Kernel/drivers/devfs/devfs.vp | 17 ++-------- VKernel/Kernel/main.vp | 48 --------------------------- 2 files changed, 2 insertions(+), 63 deletions(-) diff --git a/VKernel/Kernel/drivers/devfs/devfs.vp b/VKernel/Kernel/drivers/devfs/devfs.vp index d22d79a..eea8637 100644 --- a/VKernel/Kernel/drivers/devfs/devfs.vp +++ b/VKernel/Kernel/drivers/devfs/devfs.vp @@ -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: diff --git a/VKernel/Kernel/main.vp b/VKernel/Kernel/main.vp index 74e9fb1..c3cf4ba 100644 --- a/VKernel/Kernel/main.vp +++ b/VKernel/Kernel/main.vp @@ -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)