Commit Graph

123 Commits

Author SHA1 Message Date
LoGin a451d185b2
refactor(gvisor): 优化测试输出配置并移除冗余日志 (#1650)
- 将测试运行器默认输出方式改为控制台,并添加`--no-stdout`选项以保存到文件
- 移除监控脚本中显示最近100行串口输出的冗余日志
- 清理代码格式和注释

Signed-off-by: longjin <longjin@DragonOS.org>
2026-01-13 23:55:47 +08:00
LoGin 3fc8866dd5
refactor(kernel): 重构 Mutex 和 WaitQueue 实现,使用状态机避免唤醒丢失 (#1643)
- 将 Mutex 内部实现从 SpinLock+LinkedList 改为 AtomicBool+WaitQueue
- 重构 WaitQueue 的 Waker
机制,使用四态状态机(Idle/Sleeping/Notified/Closed)替代 AtomicBool
- 引入 Waiter/Waker 握手机制,通过 prepare_sleep() 和 consume_notification()
避免竞态条件
- 在 Mutex::lock() 中直接使用 wait_queue.wait_until(),简化加锁逻辑
- 修复监控脚本中的权限问题,将 kill 命令改为 sudo kill

Signed-off-by: longjin <longjin@DragonOS.org>
2026-01-13 20:50:15 +08:00
LoGin 0f5163e5b2
feat: 改进VM状态管理和GDB调试支持 (#1638)
- 新增VM状态管理功能,支持获取网络端口、PID和GDB端口
- 改进GDB调试支持,自动分配端口并支持动态连接
- 优化QEMU启动脚本,使用数组参数提高可维护性
- 修复监控脚本的环境变量依赖问题

Signed-off-by: longjin <longjin@DragonOS.org>
2026-01-13 13:44:01 +08:00
LoGin 5d0cbdcff5
feat(vfs): 实现splice和tee系统调用 (#1621)
* feat(vfs): 实现splice和tee系统调用

- 新增splice系统调用,支持管道与文件间的零拷贝数据传输
- 新增tee系统调用,实现管道间数据复制而不消耗源数据
- 为File结构体添加pos()和advance_pos()方法用于文件偏移管理
- 在pipe模块中实现splice_to_pipe()和tee_to()等核心操作
- 添加send_kernel_signal_to_current()辅助函数简化内核信号发送
- 更新测试白名单以包含splice相关测试

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(ipc/pipe): 重构splice和tee实现,添加copy_from_other和transfer_chunk辅助函数

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(pipe): 修复管道读写时的信号发送与零拷贝处理逻辑

- 在管道写入时,若没有读取者,发送 SIGPIPE 信号并返回 EPIPE 错误
- 修复读取逻辑中零拷贝时的循环处理,避免因快照过期导致的无限循环

Signed-off-by: longjin <longjin@DragonOS.org>

* 1

* fix(pipe): 修复splice系统调用中管道数据竞争问题

- 为管道添加splice_hold字段,防止并发读取导致数据丢失
- 修改splice_pipe_to_file函数,使用peek+hold模式读取管道数据
- 修复sys_splice和sys_tee中的文件权限检查
- 优化管道可读性判断逻辑,正确处理splice_hold状态

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(splice): refine O_NONBLOCK handling for pipe endpoints

- Update logic to inherit O_NONBLOCK flag only from pipe endpoints, ensuring correct splice behavior for regular files.
- Clarify comments to reflect the changes in handling non-blocking flags.

Signed-off-by: longjin <longjin@DragonOS.org>

* refactor(filesystem): 移除冗余的 nonblock_prep_pipe_write 函数并优化 splice
非阻塞逻辑

- 删除`nonblock_prep_pipe_write`函数,将非阻塞检查逻辑内联至
`splice_file_to_pipe`函数中
- 优化文件到管道 splice 的非阻塞语义,使其更符合 Linux 行为
- 修复管道 epoll 事件检查逻辑,避免在 splice 持有锁时误报可读事件

Signed-off-by: longjin <longjin@DragonOS.org>

* 1

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2026-01-12 15:14:29 +08:00
LoGin 0ee965c8e9
feat(net): 重构网络子系统,引入NAPI机制与TCP socket改进 (#1599)
- 新增NAPI(New API)子系统,实现有界轮询机制,提升网络包处理性能
- 重构e1000e驱动,集成NAPI中断处理,移除旧的中断处理模块
- 改进TCP socket实现,支持self-connect、延迟关闭、backlog管理等Linux兼容特性
- 优化网络命名空间轮询线程,采用事件驱动与定时器混合模型
- 新增TCP listener backlog和TCP close defer机制,提升协议栈兼容性
- 修复epoll事件通知机制,避免竞态条件和唤醒丢失
- 升级smoltcp依赖,启用TCP Reno和Cubic拥塞控制算法
- 新增网络子系统设计文档,详细说明NAPI与NetNamespace Poll机制

Signed-off-by: longjin <longjin@DragonOS.org>
2026-01-07 22:50:48 +08:00
LoGin 90e127386f
chore(tests): 在gvisor测例白名单中添加pause_test (#1611)
Signed-off-by: longjin <longjin@DragonOS.org>
2026-01-06 00:34:30 +08:00
kado c9d123261a
fix(mm): 修复 msync 系统调用以通过 gvisor 测试用例 (#1583)
* 将原先 直接在内核根据用户地址构造slice再使用write同步 修改为 调用sync同步

Signed-off-by: kaleidoscope416 <jiangruizhi@DragonOS.org>
2026-01-01 15:43:55 +08:00
Samuel Dai a04c6c1ca6
fix(net): Fix UDP missing features and miss polls (#1571)
feat(net): 增强UDP套接字功能并修复多个网络问题

- 实现UDP套接字连接模式下的数据包过滤和预连接数据处理
- 添加UDP套接字断开连接支持,包括AF_UNSPEC和端口0处理
- 实现UDP套接字缓冲区大小配置(SO_SNDBUF/SO_RCVBUF)
- 添加UDP套接字shutdown功能支持
- 修复UDP发送到0.0.0.0地址的处理逻辑
- 实现UDP套接字ioctl FIONREAD/TIOCOUTQ支持
- 修复UDP recvmsg/sendmsg系统调用实现
- 增强TCP套接字listen和bind端口处理
- 修复网络接口绑定和地址转换逻辑
- 改进readv系统调用对套接字的特殊处理

Signed-off-by:  samuka007 <samuka007@dragonos.org>
2026-01-01 13:23:31 +08:00
LoGin 3ac1432288
feat(net): 重构 raw socket 并添加超时等待支持 (#1579)
- 重构 raw socket
模块,将大型文件拆分为多个子模块(loopback、ops、options、packet、recv、send、so
cket、sockopt)
- 在 wait_queue 中添加带超时的等待函数(wait_event_interruptible_timeout 和
wait_event_interruptible_timeout_with)
- 为 raw socket 添加 ICMP/ICMPv6 Echo 自动回复功能
- 为 Unix 域套接字(datagram 和 stream)使用新的超时等待函数
- 修复 getsockopt 系统调用中 optval 为 null 时的处理逻辑
- 添加 ICMPv6 过滤器支持
- 改进 raw socket 的 IP_HDRINCL 发送处理

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-30 13:25:16 +08:00
LoGin b445c2f5b9
feat(net): 实现 raw socket 和 packet socket 支持 (#1575)
- 新增 AF_INET/AF_INET6 SOCK_RAW 实现,支持 IPv4/IPv6 raw socket
- 新增 AF_PACKET socket 实现,支持链路层数据包捕获和发送
- 实现 raw socket 的 IP_HDRINCL、ICMP_FILTER、IPV6_CHECKSUM 等选项
- 为网络驱动添加 packet socket 分发支持(e1000e、virtio_net、veth、loopback)
- 完善 socket 系统调用对 raw/packet socket 的支持
- 修复代码规范问题(函数内 use 语句、magic number 常量化)
- 优化并发安全、代码重复和模块结构

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-30 08:34:35 +08:00
LoGin 62ae87ca3d
feat(signal): 实现进程级信号与线程级信号的分离处理 (#1574)
- 在信号发送路径中区分进程级信号(TGID/PGID/SID)与线程级信号(PID),分别存储到
shared_pending 和线程私有 pending
- 修改 kill、rt_sigqueueinfo 等系统调用使用进程级信号,tgkill 使用线程级信号
- 为 POSIX timer 添加线程定向信号支持,SIGEV_THREAD_ID 使用线程级信号
- 修复 signalfd 读操作中可能因持有锁而导致的死锁问题
- 更新信号检查逻辑,同时检查线程级 pending 和进程级 shared_pending

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-30 00:53:36 +08:00
LoGin a6b54d19c4
feat(syscall): 新增并重构UID/GID相关系统调用 (#1572)
- 新增id_utils模块,提供setuid/setgid相关系统调用的通用辅助函数
- 新增setreuid、setregid、getresuid、getresgid系统调用实现
- 重构setuid、setgid、setresuid、setresgid、sys_groups系统调用,使用统一的辅助函数
- 完善权限检查逻辑,遵循Linux语义处理-1参数和capability更新
- 在sys_groups中增加CAP_SETGID权限检查
- 更新测试白名单,添加uidgid_test

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-30 00:13:15 +08:00
LoGin 8e1c9051dc
feat(vfs): 改进pread/pwrite和getdents的用户缓冲区处理 (#1568)
- 新增pread_pwrite_common模块,实现Linux兼容的部分缓冲区访问语义
- 修改IoVecs::scatter方法返回实际写入字节数
- 修复getdents错误处理逻辑,遵循Linux语义返回已写入字节数
- 优化UserBuffer清零操作,临时关闭内核写保护
- 更新测试配置,添加部分坏缓冲区测试

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-29 11:11:57 +08:00
LoGin 073432f930
feat: 实现 Restartable Sequences (rseq) 机制 (#1565)
- 新增 rseq 内核支持,包括系统调用、进程状态管理和用户态辅助向量
- 在调度、信号处理和异常返回路径中集成 rseq 事件处理
- 添加 rseq 相关文档和测试用例
- 修复用户栈扩展逻辑中的边界检查问题
- 调整 Makefile 构建选项以支持测试

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-27 20:34:35 +08:00
LoGin 23bd1fc9a4
feat(epoll): 支持嵌套epoll与signalfd,修复poll语义 (#1566)
- 实现epoll嵌套检测与循环检查,支持epoll监听epoll文件描述符
- 添加signalfd系统调用,支持通过文件描述符接收信号
- 修复poll/select对普通文件和目录的处理,确保符合POSIX语义
- 优化epoll唤醒逻辑,避免虚假唤醒和事件丢失
- 修复pipe文件描述符关闭时的epoll通知问题

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-27 19:45:44 +08:00
LoGin 8480500e1f
feat(signal): 完善信号发送者信息传递与rt_sigqueueinfo实现 (#1564)
- 修改SigType枚举,为Kill类型添加uid字段,并新增Rt类型以支持rt_sigqueueinfo
- 在所有信号发送路径中传递发送者的pid和uid信息
- 实现rt_sigqueueinfo系统调用,支持用户态传递siginfo信息
- 更新SigCode::try_from_i32方法以支持错误处理
- 添加rtsignal_test到测试白名单

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-27 17:39:47 +08:00
LoGin ccd159f815
fix(net): 修复Unix流套接字SCM记录边界处理 (#1563)
- 修复Unix流套接字SCM记录边界处理,确保recvmsg正确合并数据
- 修复write系统调用零长度写入的语义
- 修复open系统调用对socket文件的处理
- 更新Makefile构建配置
- 启用gVisor Unix套接字测试

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-27 11:37:14 +08:00
LoGin 12b9e0629a
feat(vfs): 实现写/截断/修改所有者时清理suid/sgid位 (#1562)
* feat(vfs): 实现写/截断/修改所有者时清理suid/sgid位

- 在文件写入、截断和chown操作后,根据Linux语义清理suid/sgid位
- 修复init进程能力集,移除CAP_FSETID以符合gVisor测试预期
- 修复UserBufferWriter边界检查,防止缓冲区溢出

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-27 00:23:06 +08:00
Samuel Dai f031e61716
feat(build): replace rootfs and user space app creation with nix base scripts (#1505)
Implement
- userland build in nix, with cross platform support and 
non-previleged disk gen
- qemu start command in nix
- nix develop envrionment for make kernel
- document build environment defined by nix

Next Steps
- 减小rootfs占用nix store的体积
- deb包的打包兼容用的函数
- 更加灵活的构建依赖注入
- 保留先前系统内修改的内容
- nix rootfs build与qemu启动适配 vnc模式
- 适配 riscv64 构建
- Arm MacOS上的开发兼容
2025-12-26 18:36:13 +08:00
LoGin aab4617d3a
feat(net/unix): 为Unix流/seqpacket套接字添加缓冲区大小调整、超时设置与关闭处理 (#1555)
* feat(net/unix): 为Unix流/seqpacket套接字添加缓冲区大小调整、超时设置与关闭处理

- 在RingBuffer中新增resize方法,支持动态调整环形缓冲区容量并保持数据一致性
- 为Unix流套接字实现SO_SNDBUF/SO_RCVBUF选项,允许用户设置发送/接收缓冲区大小
- 新增SO_SNDTIMEO/SO_RCVTIMEO超时选项,支持阻塞操作的超时控制
- 重构seqpacket接收逻辑,统一try_recv_seqpacket_meta方法处理peek/truncate场景
- 完善套接字关闭流程,正确通知对端并唤醒等待队列
- 启用gVisor测试中的socket_unix_seqpacket相关测试用例

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(net/socket): 为Socket trait添加open_file_counter方法

- 在Socket trait中新增open_file_counter方法,用于管理socket的打开文件引用计数
- 为UdpSocket、TcpSocket、NetlinkSocket、UnixDatagramSocket和UnixStreamSocket实
现open_file_counter方法
- 修改socket inode的open和close方法,使用引用计数确保只在最后一次关闭时执行清理操作

Signed-off-by: longjin <longjin@DragonOS.org>

* refactor(net/socket): 修改环形缓冲区resize方法以返回Result类型

- 将RingBuffer::resize()的断言改为返回SystemError错误
- 更新Producer和Consumer的resize方法签名
- 修改Unix流套接字的缓冲区调整方法以处理错误

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(net/unix): 实现AF_UNIX流套接字完整功能

- 新增连接重置(ECONNRESET)机制,模拟Linux行为
- 实现SO_LINGER、SO_ACCEPTCONN套接字选项支持
- 添加SO_SNDBUF发送缓冲区限制检查
- 修复sendto()在已连接套接字上的EISCONN错误处理
- 优化缓冲区大小计算和限制逻辑
- 通过gVisor socket_unix_stream_test测试

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(net/socket): 修复环形缓冲区并发竞争和sendto语义问题

- 修复环形缓冲区在resize时的并发竞争问题,确保容量计算与索引访问的一致性
- 修复Unix流套接字sendto方法的语义,正确处理连接状态和地址参数

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(net): 同步socket非阻塞状态与文件标志,修复Unix域套接字抽象地址处理

- 在fcntl(F_SETFL)中增加对socket非阻塞状态的同步,确保内部状态与文件标志一致
- 重构Unix域套接字抽象地址处理,支持二进制名称(可包含嵌入的NUL字符)
- 将抽象地址表作用域限定到网络命名空间,修复跨命名空间地址冲突问题
- 修复Unix域套接字地址长度计算,使其符合Linux语义
- 更新gvisor测试白名单,启用socket_unix_unbound_abstract_test测试

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(net/socket): 为Unix流套接字添加监听器缓冲区大小继承功能

- 在Listener创建时传入sndbuf_effective和rcvbuf_effective参数
- 新增set_sndbuf_effective和set_rcvbuf_effective方法用于更新监听器缓冲区设置
- 修改push_incoming方法以应用客户端缓冲区配置
- 新增ring_cap_for_effective_sockbuf辅助函数计算环形缓冲区容量
- 在accept时继承监听器端的SO_SNDBUF/SO_RCVBUF设置
- 修改setsockopt逻辑,支持在监听器状态下更新缓冲区大小

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-26 17:25:32 +08:00
LoGin b5017cfa5c
feat(mm): 改进共享匿名映射和mremap的Linux兼容性 (#1552)
* feat(mm): 改进共享匿名映射和mremap的Linux兼容性

- 修复共享匿名映射的页偏移计算,添加超出范围SIGBUS检查
- 改进mremap系统调用,支持MREMAP_FIXED、原地扩展、复制映射等语义
- 完善VM_SHARED和VM_MAYSHARE标志的转换逻辑
- 重构AnonSharedMapping,支持固定大小和页缓存管理

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(mm): 将文件页偏移替换为后备对象页偏移以提高内存管理一致性

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-26 00:05:53 +08:00
LoGin f76025783b
feat(net/socket): 实现Unix域套接字完整功能与gVisor测试兼容性 (#1554)
* feat(net): 实现Unix域套接字完整功能与系统调用支持

- 新增Unix域数据报和流套接字的shutdown、ioctl(FIONREAD/TIOCOUTQ)支持
- 实现Unix域套接字的SCM_RIGHTS文件描述符传递功能
- 新增recvmmsg系统调用支持多消息接收
- 修复socket创建逻辑,区分VFS打开与系统调用创建的套接字文件
- 完善用户空间缓冲区访问的安全检查

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(epoll): 修复epoll事件掩码和信号中断处理

- 在epoll_ctl操作中强制添加EPOLLERR和EPOLLHUP事件以符合Linux语义
- 修复EPOLLEXCLUSIVE标志在MOD操作中的处理逻辑
- 将epoll_wait信号中断错误码从ERESTARTSYS改为EINTR以符合Linux规范
- 修复eventfd的最大计数值处理,使用EVENTFD_MAX常量替代u64::MAX

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(unix): 实现SCM_RIGHTS和SCM_CREDENTIALS支持

- 为Unix域数据报和流式套接字添加SCM_RIGHTS(文件描述符传递)和SCM_CREDENTIALS(
凭据传递)支持
- 实现SO_PASSCRED套接字选项,支持自动附加凭据
- 修复epoll事件处理,确保EPOLLET和EPOLLONESHOT标志符合Linux语义
- 改进recvmmsg系统调用,正确处理超时和WAITFORONE标志
- 添加辅助消息工具模块,统一处理控制消息的序列化和反序列化
- 更新gVisor测试白名单,启用socket_unix_pair_test测试

Signed-off-by: longjin <longjin@DragonOS.org>

* refactor(net/socket): 优化用户空间地址写入和原子操作

- 重构 Endpoint::write_to_user,提取 write_sockaddr_to_user 内部函数
- 新增 write_to_user_msghdr 方法用于 recvmsg 场景
- 统一原子操作内存序(Acquire/Release)
- 修复 recvmmsg 和 recvmsg 的用户空间缓冲区访问
- 优化 Unix 数据报套接字的发送/接收逻辑
- 调整 SIOCGIFCONF 中环回接口顺序以满足测试要求

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-25 23:34:48 +08:00
LoGin 31d25c7478
feat(net): 完善Unix域数据报套接字功能 (#1550)
* feat(net): 完善Unix域数据报套接字功能

- 为MsgHdr结构体添加64位平台填充字段以保持与Linux布局一致
- 实现Unix域数据报套接字的SO_SNDBUF、SO_RCVBUF、SO_SNDTIMEO、SO_RCVTIMEO选项支持
- 添加sendmsg系统调用支持,完善recvmsg实现
- 支持SOCK_RAW类型映射到SOCK_DGRAM,遵循Linux行为
- 实现发送缓冲区记账机制,支持阻塞/非阻塞发送等待
- 添加MSG_PEEK和MSG_TRUNC标志支持,完善数据报截断处理
- 修复getsockopt系统调用,支持更多选项类型
- 在recv/recvfrom/send/sendto中正确处理文件描述符的O_NONBLOCK标志

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-25 00:22:02 +08:00
LoGin 8e0400e6ee
fix(net): 修复 Unix 域套接字地址处理中的边界检查与错误映射 (#1548)
* fix(net): 修复 Unix 域套接字地址处理中的边界检查与错误映射

- 在`SockAddr::to_endpoint`中,为 Unix 域套接字地址添加了`addrlen`
参数的有效性检查,确保其长度在合法范围内,并避免忽略用户传入的长度。
- 修复了`UnixEndpoint::bind`中的错误映射,将 VFS 返回的`EEXIST`错误码正确映射为
`EADDRINUSE`,以符合 Linux/POSIX 的`bind`语义。

Signed-off-by: longjin <longjin@DragonOS.org>

* refactor(net): 重构 SockAddr::to_endpoint 函数,增强安全性并统一错误处理

- 新增 MAX_SOCKADDR_LEN 常量,限制用户传入的地址结构体大小,防止内核读取越界内存
- 使用 UserBufferReader 安全读取用户空间数据,防止用户地址缺页导致内核崩溃
- 统一地址长度检查逻辑,为每个地址家族添加明确的下限检查
- 移除冗余的 unsafe 代码块,提升代码可读性
- 优化错误日志输出,便于问题定位

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-25 00:15:02 +08:00
Vitus 1da7f944a7
refactor(epoll): 重构epoll实现,优化poll系统调用 (#1504)
- 移除自定义EpollTimeoutWaker,使用通用的TimeoutWaker
- 重构EPollItem::ep_item_poll(),添加对"总是就绪"文件的支持
- 优化poll/ppoll系统调用,支持nfds=0的情况
- 修复Unix流套接字的recv_from实现
- 在wait_queue模块添加通用的TimeoutWaker结构

Signed-off-by: Vitus213 <zhzvitus@gmail.com>
Signed-off-by: longjin <longjin@DragonOS.org>
Co-authored-by: longjin <longjin@DragonOS.org>
2025-12-24 15:43:13 +08:00
LoGin c3215a0bf5
feat(time): 重构POSIX时钟支持并实现clock_getres系统调用 (#1547)
- 新增posix_clock模块,统一处理不同时钟类型的当前时间和分辨率查询
- 扩展PosixClockID枚举以支持动态CPU时钟ID,用于pthread_getcpuclockid
- 实现clock_getres系统调用,支持查询时钟分辨率
- 重构clock_gettime系统调用,使用新的posix_clock_now函数
- 更新gvisor测试白名单,添加clock_getres_test和clock_gettime_test

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-24 11:09:47 +08:00
LoGin f914ae00f4
fix(vfs): 修复删除目录和文件时的权限检查逻辑 (#1543)
* fix(vfs): 修复删除目录和文件时的权限检查逻辑

- 在 do_remove_dir 和 do_unlink_at 中添加对父目录的 W+X 权限检查
- 调整权限检查顺序,确保在目标不存在时返回正确的 EACCES 错误码
- 删除已通过测试的 gvisor blocklist 条目

Signed-off-by: longjin <longjin@DragonOS.org>

* refactor(vfs): 提取父目录权限检查逻辑为独立函数

- 新增`check_parent_dir_permission`函数,统一处理父目录的写+执行权限检查
- 在`do_sys_openat2`、`do_remove_dir`和`do_unlink_at`中复用该函数,消除重复代码
- 遵循 Linux 语义,确保在查找目标前进行权限检查,以返回正确的错误码

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-23 21:10:00 +08:00
LoGin b71a265aff
feat(filesystem): 完善 rename 系统调用实现 (#1540)
- 在 kernfs 中处理重命名到自身的特殊情况
- 在 renameat2 系统调用中添加权限检查
- 从测试黑名单中移除已实现的测试项
- 在测试白名单中添加 munmap_test

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-23 18:21:25 +08:00
LoGin 539b82a597
feat(prctl): 实现PR_SET/GET_NO_NEW_PRIVS、PR_SET/GET_DUMPABLE、PR_SET/GET_CHILD_SUBREAPER选项 (#1538)
- 在ProcessControlBlock中新增no_new_privs和dumpable字段,并实现相应的getter/sett
er方法
- 在fork流程中新增copy_prctl_state函数,用于复制prctl相关的进程/线程状态
- 实现PR_SET/GET_NO_NEW_PRIVS、PR_SET/GET_DUMPABLE、PR_SET/GET_CHILD_SUBREAPER等
prctl选项
- 修复孤儿进程收养逻辑,优先reparent到最近的祖先subreaper,否则收养到init进程
- 更新gVisor测试白名单,启用prctl_test相关测试

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-23 11:24:49 +08:00
LoGin b6e9086087
fix(poll): 修复信号掩码恢复逻辑并优化pselect6实现 (#1531)
- 修复poll_select_finish中信号掩码恢复逻辑,避免在ERESTARTSYS时错误恢复
- 重构pselect6系统调用,正确处理sigmask参数和timeout验证
- 移除poll_select_finish中零超时提前返回的逻辑
- 为PosixTimeSpec添加as_millis方法
- 将select相关测试加入白名单

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-22 16:34:34 +08:00
LoGin a59cc0e91e
fix: 修复用户空间内存访问和页面回收问题 (#1522)
* fix: 修复用户空间内存访问和页面回收问题

- 修复 IoVecs 构造时对零长度缓冲区的验证,确保符合 Linux 语义
- 修复 scatter 方法在遇到不可访问内存时的错误处理,避免部分写入后返回错误
- 修复 readv/preadv 等系统调用,使其支持分块读取和部分成功写入
- 修复页面回收逻辑,避免回收仍被映射的文件页
- 修复 UserBufferReader/Writer 对空指针的检查,防止未定义行为
- 调整缓存阈值并添加 gVisor 测试的内存检测逻辑

Signed-off-by: longjin <longjin@DragonOS.org>

* refactor(vfs): 优化 IoVecs 的用户空间内存访问检查与拷贝逻辑

- 移除冗余的 verify_area 和 UserBufferReader/Writer 检查,统一使用
user_accessible_len 进行访问性验证
- 在 gather 方法中使用 copy_from_user_protected 进行异常保护的拷贝,与 scatter
方法保持一致
- 改进错误处理逻辑,当部分数据已成功读取时返回已读取的数据,否则返回 EFAULT

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-22 11:53:40 +08:00
LoGin 9cbd72af99
chore: 删除gvisor测试中的fifo_test blocklist文件 (#1524)
Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-21 03:30:32 +08:00
LoGin 1f4ee4719e
fix: sys_exec test (#1518)
* fix(syscall): 修复execve系统调用中空路径和空参数处理问题

- 在解析符号链接前检查argv是否为空,避免空指针访问
- 添加对空路径字符串的检查,返回ENOENT错误码

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(tests): 为gvisor测试套件添加版本管理功能

- 引入版本变量和版本文件以支持自动检测和升级
- 重构现有测试检查逻辑,根据版本信息决定是否重新下载
- 解压后自动记录当前安装的测试版本

Signed-off-by: longjin <longjin@DragonOS.org>

* 1

* feat(exec): 增强执行文件权限检查与信号处理

- 在execve系统调用中增加文件类型和执行权限检查
- 移除shebang处理中冗余的interpreter_path字段
- 修复fork时信号掩码复制问题,确保POSIX合规性
- 完善execveat系统调用对AT_EMPTY_PATH和AT_SYMLINK_NOFOLLOW标志的处理

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(exec): Enhance fd_table management and path resolution in execve

- Implemented unsharing of fd_table in the execve process to ensure isolation when shared.
- Updated path resolution logic to only replace argv[0] if absolute_path() succeeds, maintaining original path on failure.

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(exec): Correct argv handling in sys_execve for empty arguments

- Updated sys_execve to ensure that if argv is empty, an empty string is added as argv[0], maintaining proper argc behavior.
- Adjusted symlink resolution logic to only occur when argv[0] is non-empty, preventing unnecessary processing and potential errors.

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(exec): 改进shebang解释器未找到时的错误日志

- 在shebang解释器查找失败时,将错误详情添加到警告日志中
- 调整gvisor测试列表,移除不支持的测试用例并添加注释说明

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-21 01:57:16 +08:00
LoGin f095a26655
feat(process): 实现进程与线程CPU时间统计及clock_nanosleep支持 (#1517)
* feat(process): 实现进程与线程CPU时间统计及clock_nanosleep支持

- 新增ProcessCpuTime结构体,用于统计用户态、内核态及总执行时间
- 为PCB添加cputime_wait_queue,支持CLOCK_PROCESS/THREAD_CPUTIME_ID的clock_nanosleep
- 在调度器CPU时间统计中增加CPU-time等待队列唤醒逻辑
- 扩展clock_gettime和clock_nanosleep系统调用,支持进程和线程CPU时间时钟
- 添加PosixTimeSpec::from_ns方法,便于从纳秒创建时间规格
- 更新测试白名单,添加clock_nanosleep_test

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(cputime): 增强进程CPU时间统计并添加多线程测试

- 在`process_cputime_ns`中添加对无效线程组关系的防御性回退和日志记录
- 为`thread_cputime_ns`添加原子操作顺序的注释说明
- 新增多线程CPU时间测试程序,验证进程CPU时间累加线程时间的功能

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-20 23:04:23 +08:00
LoGin 514283011d
feat(filesystem): Enhance symlink handling and VFS behavior (#1507)
* feat(filesystem): Enhance symlink handling and VFS behavior

- Updated tmpfs to require page cache for both regular files and symlinks to ensure proper read/write operations.
- Increased the maximum symlink follow count to 40, aligning with Linux 6.6 standards.
- Improved symlink handling in VFS to correctly follow symlinks based on path conditions and trailing slashes.
- Added validation for conflicting flags in vfs_statx to prevent invalid operations.
- Refined syscall implementations for symlink and lstat to adhere to Linux semantics, ensuring correct behavior for symlink creation and path resolution.

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(vfs): 修正符号链接跟随次数的处理逻辑

- 将 VFS_MAX_FOLLOW_SYMLINK_TIMES 从 40 调整为 41,以保留 0 的禁用语义并实现最多
40 次跟随的 Linux 语义
- 重构路径解析逻辑,明确区分 max_follow_times 为
0(完全禁用跟随)、1(计数耗尽)及 >=2(允许继续跟随)三种情况
- 确保在计数耗尽(max_follow_times == 1)且需要跟随时正确返回 ELOOP 错误

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-19 20:24:10 +08:00
LoGin fa4d785eaa
feat(kernel/posix-timer): 实现 POSIX interval timer,修复 gVisor timers_test (#1501)
- 新增 timer_create/timer_settime/timer_gettime/timer_getoverrun/timer_delete 系统调用处理,并接入 syscall table
- 实现进程级 POSIX interval timer:基于 CLOCK_MONOTONIC 的创建/删除/设置/查询、周期性重装与到期调度
- 完整实现 SIGEV_NONE/SIGEV_SIGNAL/SIGEV_THREAD_ID(限制 THREAD_ID 只能指向当前线程)与 SI_TIMER siginfo(含 si_timerid/si_overrun/si_value)
- 修复 overrun 语义与信号合并:按线程 pending 队列合并并累积 overrun,避免重复入队导致进程被信号杀死
- 修复周期性 timer 的 gettime 剩余时间计算与回调窗口返回 0 的问题(PeriodicSilent)
- 修复定时器回调中信号锁/队列访问导致的自锁死(PeriodicGroupDirectedSignal)
- clear_child_tid/robust futex 相关用户内存访问改为异常表保护,并避免在失败时继续 futex 操作

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-18 20:37:40 +08:00
LoGin 601ba6d092
feat(fs): implement umask and improve permission handling (#1500)
- Set default umask to 0022 for new filesystem instances
- Add apply_umask_for_create() and chmod_preserve_type() helper functions
- Implement proper permission checks for file creation and chmod operations
- Fix fchmod syscall to work correctly and reject O_PATH file descriptors
- Add open_create_test to gvisor test suite

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-18 19:51:21 +08:00
LoGin 0ed7d33c19
feat(filesystem): Implement EventFd filesystem and enhance VFS inode capabilities (#1486)
* feat(filesystem): Implement EventFd filesystem and enhance VFS inode capabilities

- Introduced EventFdFs as a new pseudo-filesystem to support eventfd file descriptors, including methods for root inode retrieval and filesystem information.
- Enhanced IndexNode trait with is_stream, supports_seek, supports_pread, and supports_pwrite methods to streamline file operation semantics for stream-like files.
- Updated file handling in VFS to utilize new inode capabilities, ensuring correct behavior for pread, pwrite, and lseek operations.
- Added eventfd_test to the syscall whitelist for testing purposes.

This implementation aligns with Linux semantics for eventfd and improves the overall VFS design by consolidating stream behavior checks.

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(vfs): 修复pread/pwrite中O_PATH和流式对象的错误处理顺序

- 调整O_PATH文件描述符的错误处理顺序,确保优先返回EBADF
- 为流式对象(FMODE_STREAM)添加ESPIPE错误处理,避免权限检查导致的误报
- 分离权限检查逻辑,确保错误码符合Linux语义

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-17 12:09:17 +08:00
LoGin 0d10f70691
feat(vfs): 新增creat系统调用支持 (#1482)
* feat(vfs): 新增creat系统调用支持

- 实现creat系统调用处理器,遵循Linux语义:创建新文件或截断现有文件并打开为只写模式
- 在x86_64架构下注册creat系统调用到系统调用表
- 在gvisor测试白名单中添加creat测试项

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(rust-jhash): Update Cargo.toml to specify Rust edition 2021

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-16 23:58:15 +08:00
LoGin b28f766956
feat(vfs): Implement append lock manager for file operations (#1483)
* feat(vfs): Implement append lock manager for file operations

- Introduced an `AppendLockManager` to ensure atomicity for append operations across filesystems, preventing data corruption in concurrent write scenarios.
- Updated file write methods to utilize the new append lock mechanism, ensuring that appending to files respects the latest end-of-file position.
- Enhanced `write_append` and `pwrite_append` methods to support forced append semantics, aligning with Linux behavior.
- Initialized the append lock manager during VFS initialization to ensure it is ready before any file write operations.

This addition improves the reliability of file operations in a multi-threaded environment, particularly for append scenarios.

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(kernel): 添加jhash库并用于append_lock的哈希计算

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-16 23:55:53 +08:00
LoGin 5450a4bfc7
fix: fix chroot and tmpfs (#1480)
* feat(procfs): Add /proc/[pid]/mountinfo and /proc/[pid]/maps support

- Introduced new ProcFileType variants for /proc/[pid]/mountinfo and /proc/[pid]/maps.
- Implemented content generation for /proc/[pid]/mountinfo and /proc/[pid]/maps to align with Linux semantics.
- Updated ProcFS inode creation to include these new files for each process.
- Enhanced path handling in the VFS to ensure correct resolution based on process-specific root and current working directory.

This addition improves the process filesystem's functionality and compatibility with Linux behavior.

* feat(filesystem): Enhance page cache management in tmpfs

- Added an unevictable flag to the PageCache structure, allowing pages to be marked as unevictable to prevent reclamation.
- Updated the TmpfsInode structure to integrate page cache management, replacing direct data manipulation with page cache operations for read and write methods.
- Refactored truncate and resize methods to utilize the new page cache functionality, ensuring consistency and improved memory management.

* feat(filesystem): Enhance tmpfs functionality and VFS constraints

- Implemented support for readahead in tmpfs, allowing for optimized data retrieval.
- Added checks for filename length across various VFS operations to prevent errors related to excessively long names.
- Updated the tmpfs implementation to handle read and write operations directly through the page cache, improving memory management.
- Enhanced rename functionality to ensure type compatibility and empty directory checks during operations.
- Increased maximum path length and defined maximum single filename length for better filesystem compliance.

* refactor(fs): 重构tmpfs重命名逻辑并修复MountFSInode的move_to委托

- 将tmpfs跨目录移动逻辑提取为独立函数`tmpfs_move_entry_between_dirs`
- 优化锁顺序以避免死锁,按inode_id顺序锁定目录
- 修复MountFSInode::move_to中目标inode解包问题,确保正确委托给底层文件系统

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(filesystem): Implement zero-page creation for tmpfs and enhance page fault handling

- Added `create_zero_pages` method to `InnerPageCache` for efficient zero-page creation, optimizing memory usage in tmpfs.
- Updated `Tmpfs` to utilize the new zero-page creation during read and write operations, ensuring seamless handling of page faults.
- Enhanced `PageFaultHandler` with `pagecache_fault_zero` to manage page faults specifically for tmpfs, allowing for direct page cache access without disk I/O.

This improves the performance and reliability of memory file systems by reducing unnecessary allocations and ensuring proper page management.

* refactor(syscall): Rename check_and_clone_cstr to vfs_check_and_clone_cstr for clarity

- Updated the user access module to introduce vfs_check_and_clone_cstr, enhancing clarity in its purpose for VFS operations.
- Refactored sys_openat and utimensat to utilize the new vfs_check_and_clone_cstr function, ensuring consistent handling of C string paths across the filesystem.

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-16 14:05:27 +08:00
kado 85989fdb49
fix(vfs): 修复truncate系统调用,添加截断时的页缓存截断,修复边界条件 (#1444)
* 限制缓冲区大小为 512KB,避免分配过大内存导致容量溢出;为resize加上页缓存截断

* 增加对len的检查,检查截断后的长度是否超过限度

* 检查filemode

* 回退在resize里限制文件大小

* fmt

* 添加测试

* 改进长度参数的类型转换逻辑;统一使用限制大小的缓冲区策略

* 在fat的resize中加入最大容量检查

* 统一定义ZERO_BUF_SIZE;增加对零写入的检查;在vfs层统一拒绝超出 isize::MAX 的长度

* fmt

---------

Co-authored-by: longjin <longjin@DragonOS.org>
2025-12-15 23:20:25 +08:00
LoGin a8d78be4c4
feat(mm,procfs): 添加/proc/<pid>/maps文件支持并改进缺页异常处理 (#1468)
* fix(interrupt): 修正缺页异常处理中的用户态判断逻辑

- 优先使用TrapFrame和错误码判断访问发起者,而非仅依赖地址范围
- 避免用户态访问高地址区域时触发内核panic,改为产生SIGSEGV
- 确保内核态访问用户地址时能正确走用户态fault处理路径

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(time): 修复 sys_gettimeofday 用户空间访问保护

- 重构 sys_gettimeofday 系统调用处理逻辑,使用 buffer_protected 保护用户空间访问
- 修复 tv 和 timezone 指针为空时的处理逻辑,避免空指针错误
- 根据调用来源(用户/内核)动态设置用户空间访问保护标志

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(procfs): 添加/proc/<pid>/maps文件支持

- 新增proc_maps模块,实现/proc/<pid>/maps文件的生成逻辑
- 在ProcFS中注册maps文件,支持进程文件夹的创建和清理
- 更新gvisor测试白名单,添加time_test

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-15 14:43:39 +08:00
Samuel Dai 165fa8e8df
fix(net): udp getsockname/getpeername (#1460)
* fix(net): udp getsockname/getpeername

* feat(ci): add test whitelist for new available inet syscall

---------

Co-authored-by: longjin <longjin@DragonOS.org>
2025-12-14 22:04:06 +08:00
LoGin d40c3c0191
feat(filesystem): Add tmpfs support and integrate with devfs (#1459)
* feat(filesystem): Add tmpfs support and integrate with devfs

- Introduced a new tmpfs module for temporary file storage in memory.
- Updated devfs to mount /dev/shm as tmpfs, aligning with Linux semantics.
- Enhanced vfs module to include TMPFS_MAGIC for tmpfs identification.
- Added necessary methods and structures for tmpfs functionality, including inode management and file operations.

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(filesystem): Implement atomic size management for tmpfs

- Added atomic operations to manage the current size of the tmpfs filesystem, including methods to increase and decrease size based on file operations.
- Integrated size management into inode operations, ensuring that size updates are thread-safe and adhere to specified limits.
- Enhanced the resize and truncate methods to adjust the filesystem size accordingly during file modifications.

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-12 15:54:45 +08:00
LoGin aa695d46dd
feat(filesystem): Add pwritev2 syscall implementation (#1461)
* feat(filesystem): Add pwritev2 syscall implementation

- Introduced the pwritev2 syscall, allowing vectorized writes with offset and flags, enhancing compatibility with Linux semantics.
- Implemented validation for file descriptors and offsets, ensuring robust error handling.
- Reused core logic from pwritev for the new syscall, maintaining consistency in file writing operations.

This addition improves the VFS layer's functionality and aligns with Linux behavior for vectorized writing operations.

Signed-off-by: longjin <longjin@DragonOS.org>

* fmt

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-12 13:44:41 +08:00
Vitus a501a688d4
ci: 添加 open_test 测试 (#1458) 2025-12-11 22:51:33 +08:00
LoGin 05e1d0eeba
feat(filesystem): Enhance pwrite and pwritev syscall validation (#1456)
- Added validation for pwrite and pwritev syscalls to ensure offset and length conform to Linux semantics, returning EINVAL for negative offsets and invalid ranges.
- Updated offset extraction in sys_pwrite64 and sys_pwritev to use i64 for better compatibility.
- Included a new test case for pwrite64 in the gvisor whitelist to ensure proper functionality.

This change improves the robustness of file writing operations in the VFS layer.

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-11 14:31:27 +08:00
LoGin e9ec735d6f
feat: 内存管理、mmap支持与设备驱动的综合改进 (#1455)
* refactor(mm): 重构页缓存读写以解决死锁问题并改进错误处理

- 将页缓存读写拆分为两阶段以避免用户缺页时持有锁
- 改进文件系统缺页处理,返回SIGBUS而非panic
- 优化sys_read/sys_write的用户缓冲区访问检查
- 修复mprotect参数对齐检查

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(devfs): 添加随机设备支持

- 新增随机设备模块random_dev,提供随机字节生成能力
- 在DevFS中注册/dev/random设备,确保系统能够访问随机数据
- 更新相关文件以支持新设备的集成

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(filesystem): 添加mmap支持到多个文件系统节点

- 为LockedZeroInode、LockedExt4Inode、LockedFATInode和LockedRamFSInode实现mmap方法,允许内存映射操作。
- 更新相关文件以支持mmap功能,确保与用户空间的交互更加灵活。

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(mm): Improve mmap error handling and validation

- Enhanced error handling in mmap implementation to return appropriate errors for unsupported operations.
- Added checks for MAP_PRIVATE and MAP_SHARED flags to ensure only one is set.
- Implemented page alignment validation for MAP_FIXED.
- Updated tests to reflect changes in mmap behavior.

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(mm): Enhance memory protection handling and validation

- Updated the `init_xd_rsvd` function to ensure NX support is enabled and correctly handle hardware limitations.
- Improved alignment checks in `sys_mprotect` to prevent overflow and ensure proper memory area verification.
- Removed outdated tests from `mmap_test` to streamline the test suite.

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(procfs): Add support for /proc/[pid]/statm file

- Introduced the ProcStatm file type to the ProcFileType enum.
- Implemented the open_statm function to return a placeholder response for the statm file.
- Updated the ProcFS inode creation to include the statm file for each process.
- Enhanced the IndexNode implementation to handle the new ProcStatm file type.

Signed-off-by: longjin <longjin@DragonOS.org>

* fix(mmap): 增强mmap系统调用的偏移量检查和内存分配逻辑

* fix(procfs): 优化statm文件打开逻辑,增加虚拟内存页数计算

* fix(syscall): 处理len为0的情况,确保read和write系统调用遵循POSIX标准


* refactor(mm): Optimize page reclamation process to prevent deadlocks

- Separated the page reclamation into two phases to avoid holding the reclaimer lock for extended periods, reducing the risk of lock order inversion with page_manager/page_cache.
- Updated the `shrink_list` method to handle victim page eviction without holding the reclaimer lock, ensuring safer memory management.
- Improved the `drain_lru` method to efficiently retrieve victim pages for reclamation.

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-11 11:44:35 +08:00
LoGin fc322fb0ba
fix(filesystem): update directory link count management in FAT and RAM filesystems (#1454)
- Adjusted the link count for directories to ensure it starts at 2, accounting for the self-reference and parent directory link.
- Updated the logic for incrementing and decrementing link counts when creating and deleting directories.
- Enhanced the dynamic calculation of directory link counts in the VFS layer to ensure accuracy when metadata is unreliable.

This change improves the consistency of link count management across different filesystem implementations.

Signed-off-by: longjin <longjin@DragonOS.org>
2025-12-10 15:30:34 +08:00