/// Translate a user pointer to a mutable reference pubfntranslate_user_ptr<T>(ptr: *mut T) -> Option<&'staticmut T> { TASK_MANAGER.translate_user_ptr(ptr) }
/// Translate a user pointer to a reference pubfntranslate_user_ptr_readonly<T>(ptr: *const T) -> Option<&'static T> { TASK_MANAGER.translate_user_ptr_readonly(ptr) }
/// Prints to the standard output, with a newline. #[macro_export] macro_rules! println { () => { $crate::print!("\n") }; ($($arg:tt)*) => { $crate::io::__print_impl(format_args!("\u{1B}[92m{}\u{1B}[m\n", format_args!($($arg)*))); } }
ramfs就是一个最基础的文件系统,不需要回写,不需要驱动,基本上意思就是在内存里进行书写,关机后不会存下来,这个rename也不会再下次开机后保存下来。 学习正常的rename,以前从没看过底层的inode操作,都是直接调用ext_rename()就完工了,所以这次对照着加抄袭整了个版本。 明确这个操作是在ramfs模块下的就简单了,这是个结点操作,所以要在两个地方添加操作(这是我的做法),一个是impl VfsNodeOps for DirNode,一个是DirNode内部。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/// Renames a node from `src_name` to `dst_name` in this directory. pubfnrename_node(&self, src_name: &str, dst_name: &str) -> VfsResult { letmut children = self.children.write();
let node = children.get(src_name).ok_or(VfsError::NotFound)?.clone();
if children.contains_key(dst_name) { returnErr(VfsError::AlreadyExists); } // Remove from old name and insert with new name children.remove(src_name); children.insert(dst_name.into(), node); Ok(()) }
let start_addr = if addr.is_null() { // Use find_free_area to find a suitable address let hint = VirtAddr::from(0x10000000usize); let limit = VirtAddrRange::from_start_size(aspace.base(), aspace.size()); aspace.find_free_area(hint, aligned_length, limit) .ok_or(LinuxError::ENOMEM)? } else { VirtAddr::from(addr asusize) };
// Map memory in user address space aspace.map_alloc(start_addr, aligned_length, mapping_flags, true) .map_err(|_| LinuxError::ENOMEM)?;
# Check if Don't Fragment support should be disabled AC_ARG_ENABLE([have-dont-fragment], [AS_HELP_STRING([--disable-have-dont-fragment], [Disable Don't Fragment (DF) packet support])], [ case "$enableval" in yes|"") disable_have_dont_fragment=false ;; no) disable_have_dont_fragment=true ;; *) AC_MSG_ERROR([Invalid --enable-have-dont-fragment value]) ;; esac ], [disable_have_dont_fragment=false] ) if test "x$disable_have_dont_fragment" = "xtrue"; then AC_MSG_WARN([Don't Fragment (DF) packet support disabled by user]) else iftest"x$iperf3_cv_header_dontfragment" = "xyes"; then AC_DEFINE([HAVE_DONT_FRAGMENT], [1], [Have IP_MTU_DISCOVER/IP_DONTFRAG/IP_DONTFRAGMENT sockopt.]) fi fi
针对 Linux 特有的套接字选项(如 SO_MAX_PACING_RATE、SO_BINDTODEVICE、IP_MTU_DISCOVER),提供 --disable 选项,以便在非 Linux 环境下(如交叉编译到嵌入式系统或其他操作系统)能够顺利编译,避免因缺少这些特性而导致的在其他环境下的运行错误。
# 根据用户选择和系统检测结果,决定是否定义宏 iftest"x$disable_feature_name" = "xtrue"; then AC_MSG_WARN([Feature Name support disabled by user]) else # 这里可以添加额外的系统特性检测,例如检查头文件、函数或套接字选项 # if test "x$ac_cv_header_some_header" = "xyes"; then AC_DEFINE([HAVE_FEATURE_NAME], [1], [Description of the feature macro.]) # fi fi