本质上,Ext3 mount的过程实际上是inode被替代的过程。例如,/dev/sdb块设备被mount到/mnt/alan目录。那么mount这个过程所需要解决的问题就是将/mnt/alan的dentry目录项所指向的inode屏蔽掉,然后重新定位到/dev/sdb所表示的inode索引节点。在没有分析阅读linux vfs mount代码的时候,我的想法是修改dentry所指向的inode索引节点,以此实现mount文件系统的访问。经过分析,在实际的vfs mount实现过程中,还是和我原始的想法略有差别,但是,基本目标还是相同的。

Linux VFS的mount过程基本原理如下图所示:
这里写图片描述

当用户输入”mount /dev/sdb /mnt/alan”命令后,Linux会解析/mnt/alan字符串,并且从Dentry Hash表中获取相关的dentry目录项,然后将该目录项标识成DCACHE_MOUNTED。一旦该dentry被标识成DCACHE_MOUNTED,也就意味着在访问路径上对其进行了屏蔽。

在mount /dev/sdb设备上的ext3文件系统时,内核会创建一个该文件系统的superblock对象,并且从/dev/sdb设备上读取所有的superblock信息,初始化该内存对象。Linux内核维护了一个全局superblock对象链表。s_root是superblock对象所维护的dentry目录项,该目录项是该文件系统的根目录。即新mount的文件系统内容都需要通过该根目录进行访问。在mount的过程中,VFS会创建一个非常重要的vfsmount对象,该对象维护了文件系统mount的所有信息。Vfsmount对象通过HASH表进行维护,通过path地址计算HASH值,在这里vfsmount的HASH值通过“/mnt/alan”路径字符串进行计算得到。Vfsmount中的mnt_root指向superblock对象的s_root根目录项。因此,通过/mnt/alan地址可以检索VFSMOUNT Hash Table得到被mount的vfsmount对象,进而得到mnt_root根目录项。

例如,/dev/sdb被mount之后,用户想要访问该设备上的一个文件ab.c,假设该文件的地址为:/mnt/alan/ab.c。在打开该文件的时候,首先需要进行path解析。在解析到/mnt/alan的时候,得到/mnt/alan的dentry目录项,并且发现该目录项已经被标识为DCACHE_MOUNTED。之后,会采用/mnt/alan计算HASH值去检索VFSMOUNT Hash Table,得到对应的vfsmount对象,然后采用vfsmount指向的mnt_root目录项替代/mnt/alan原来的dentry,从而实现了dentry和inode的重定向。在新的dentry的基础上,解析程序继续执行,最终得到表示ab.c文件的inode对象。

关键数据结构说明
Linux VFS mount所涉及的关键数据结构分析如下。

Vfsmount数据结构
Vfsmount数据结构是vfs mount最为重要的数据结构,其维护了一个mount点的所有信息。该数据结构描述如下:
struct vfsmount {
struct list_head mnt_hash; /* 连接到VFSMOUNT Hash Table */
struct vfsmount mnt_parent; / 指向mount树中的父节点 */
struct dentry mnt_mountpoint; / 指向mount点的目录项 */
struct dentry mnt_root; / 被mount的文件系统根目录项 */
struct super_block mnt_sb; / 指向被mount的文件系统superblock */

ifdef CONFIG_SMP

struct mnt_pcp __percpu *mnt_pcp;  
atomic_t mnt_longterm;      /* how many of the refs are longterm */  

else

int mnt_count;  
int mnt_writers;  

endif

struct list_head mnt_mounts;    /* 下级(child)vfsmount对象链表 */  
struct list_head mnt_child; /* 链入上级vfsmount对象的链表点 */  
int mnt_flags;  
/* 4 bytes hole on 64bits arches without fsnotify */  

ifdef CONFIG_FSNOTIFY

__u32 mnt_fsnotify_mask;  
struct hlist_head mnt_fsnotify_marks;  

endif

const char *mnt_devname;    /* 文件系统所在的设备名字,例如/dev/sdb */  
struct list_head mnt_list;  
struct list_head mnt_expire;    /* link in fs-specific expiry list */  
struct list_head mnt_share; /* circular list of shared mounts */  
struct list_head mnt_slave_list;/* list of slave mounts */  
struct list_head mnt_slave; /* slave list entry */  
struct vfsmount *mnt_master;    /* slave is on master->mnt_slave_list */  
struct mnt_namespace *mnt_ns;   /* containing namespace */  
int mnt_id;         /* mount identifier */  
int mnt_group_id;       /* peer group identifier */  
int mnt_expiry_mark;        /* true if marked for expiry */  
int mnt_pinned;  
int mnt_ghosts;  

};
在Linux内核中不仅存在VFSMOUNT的Hash Table,而且还维护了一棵Mount对象树,通过该mount树,我们可以了解到各个文件系统之间的关系。该mount树描述如下:
这里写图片描述

上图所示为三层mount文件系统树。第一层为系统根目录“/”;第二层有两个mount点,一个为/mnt/a,另一个是/mnt/b;第三层在/mnt/a的基础上又创建了两个mount点,分别为/mnt/a/c和/mnt/a/d。通过mount树,可以对整个系统的mount结构一目了然。

Superblock数据结构
每个文件系统都会拥有一个superblock对象对其基本信息进行描述。对于像ext3之类的文件系统而言,在磁盘上会持久化存储一份superblock元数据信息,内存的superblock对象由磁盘上的信息初始化。对于像block device 之类的“伪文件系统”而言,在mount的时候也会创建superblock对象,只不过很多信息都是临时生成的,没有持久化信息。Vfs superblock数据结构定义如下:
struct super_block {
struct list_head s_list; /* 链入全局链表的对象*/
dev_t s_dev; /* search index; not kdev_t */
unsigned char s_dirt;
unsigned char s_blocksize_bits;
unsigned long s_blocksize;
loff_t s_maxbytes; /* Max file size */
struct file_system_type *s_type;
const struct super_operations s_op; / superblock操作函数集 */
const struct dquot_operations *dq_op;
const struct quotactl_ops *s_qcop;
const struct export_operations *s_export_op;
unsigned long s_flags;
unsigned long s_magic;
struct dentry s_root; / 文件系统根目录项 */
struct rw_semaphore s_umount;
struct mutex s_lock;
int s_count;
atomic_t s_active;

ifdef CONFIG_SECURITY

void                    *s_security;  

endif

const struct xattr_handler **s_xattr;  struct list_head    s_inodes;   /* all inodes */  
struct hlist_bl_head    s_anon;     /* anonymous dentries for (nfs) exporting */  

ifdef CONFIG_SMP

struct list_head __percpu *s_files;  

else

struct list_head    s_files;  

endif

/* s_dentry_lru, s_nr_dentry_unused protected by dcache.c lru locks */  
struct list_head    s_dentry_lru;   /* unused dentry lru */  
int         s_nr_dentry_unused; /* # of dentry on lru */  /* s_inode_lru_lock protects s_inode_lru and s_nr_inodes_unused */  
spinlock_t      s_inode_lru_lock ____cacheline_aligned_in_smp;  
struct list_head    s_inode_lru;        /* unused inode lru */  
int         s_nr_inodes_unused; /* # of inodes on lru */  struct block_device *s_bdev;  
struct backing_dev_info *s_bdi;  
struct mtd_info     *s_mtd;  
struct list_head    s_instances;  
struct quota_info   s_dquot;    /* Diskquota specific options */  int         s_frozen;  
wait_queue_head_t   s_wait_unfrozen;  char s_id[32];              /* Informational name */  
u8 s_uuid[16];              /* UUID */  void            *s_fs_info; /* Filesystem private info */  
fmode_t         s_mode;  /* Granularity of c/m/atime in ns.  Cannot be worse than a second */  
u32        s_time_gran;  /*  * The next field is for VFS *only*. No filesystems have any business  * even looking at it. You had been warned.  */  
struct mutex s_vfs_rename_mutex;    /* Kludge */  /*  * Filesystem subtype.  If non-empty the filesystem type field  * in /proc/mounts will be "type.subtype"  */  
char *s_subtype;  /*  * Saved mount options for lazy filesystems using  * generic_show_options()  */  
char __rcu *s_options;  
const struct dentry_operations *s_d_op; /* default d_op for dentries */  /*  * Saved pool identifier for cleancache (-1 means none)  */  
int cleancache_poolid;  struct shrinker s_shrink;   /* per-sb shrinker handle */  

};
代码流程分析
Linux中实现mount操作需要一定的代码量,下面对Linux VFS Mount代码进行分析说明,整个分析过程按照mount操作函数调用流程进行。代码分析基于Linux-3.2版本。

当用户在用户层执行mount命令时,会执行系统调用从用户态陷入linux内核,执行如下函数(namespace.c):
SYSCALL_DEFINE5(mount, char __user , dev_name, char __user , dir_name,
char __user , type, unsigned long, flags, void __user , data)
{
int ret;
char *kernel_type;
char *kernel_dir;
char *kernel_dev;
unsigned long data_page;
/* 获取mount类型 */
ret = copy_mount_string(type, &kernel_type);
if (ret < 0)
goto out_type;
/* 获取mount点目录字符串 */
kernel_dir = getname(dir_name);
if (IS_ERR(kernel_dir)) {
ret = PTR_ERR(kernel_dir);
goto out_dir;
}
/* 获取设备名称字符串 */
ret = copy_mount_string(dev_name, &kernel_dev);
if (ret < 0)
goto out_dev;
/* 获取其它选项 */
ret = copy_mount_options(data, &data_page);
if (ret < 0)
goto out_data;
/* 主要函数,执行挂载文件系统的具体操作 */
ret = do_mount(kernel_dev, kernel_dir, kernel_type, flags,
(void *) data_page);

free_page(data_page);  

out_data:
kfree(kernel_dev);
out_dev:
putname(kernel_dir);
out_dir:
kfree(kernel_type);
out_type:
return ret;
}
do_mount()函数是mount操作过程中的核心函数,在该函数中,通过mount的目录字符串找到对应的dentry目录项,然后通过do_new_mount()函数完成具体的mount操作。do_mount()函数分析如下:
long do_mount(char *dev_name, char *dir_name, char *type_page,
unsigned long flags, void *data_page)
{
struct path path;
int retval = 0;
int mnt_flags = 0;

。。。

/* 通过mount目录字符串获取path,path结构中包含有mount目录的dentry目录对象 */  
retval = kern_path(dir_name, LOOKUP_FOLLOW, &path);  
if (retval)  return retval;  。。。  /* Separate the per-mountpoint flags */  
if (flags & MS_NOSUID)  mnt_flags |= MNT_NOSUID;  
if (flags & MS_NODEV)  mnt_flags |= MNT_NODEV;  
if (flags & MS_NOEXEC)  mnt_flags |= MNT_NOEXEC;  
if (flags & MS_NOATIME)  mnt_flags |= MNT_NOATIME;  
if (flags & MS_NODIRATIME)  mnt_flags |= MNT_NODIRATIME;  
if (flags & MS_STRICTATIME)  mnt_flags &= ~(MNT_RELATIME | MNT_NOATIME);  
if (flags & MS_RDONLY)  mnt_flags |= MNT_READONLY;  flags &= ~(MS_NOSUID | MS_NOEXEC | MS_NODEV | MS_ACTIVE | MS_BORN |  MS_NOATIME | MS_NODIRATIME | MS_RELATIME| MS_KERNMOUNT |  MS_STRICTATIME);  /* remount操作 */  
if (flags & MS_REMOUNT)  retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags,  data_page);  
else if (flags & MS_BIND)  retval = do_loopback(&path, dev_name, flags & MS_REC);  
else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))  retval = do_change_type(&path, flags);  
else if (flags & MS_MOVE)  retval = do_move_mount(&path, dev_name);  
else  /* 正常的mount操作,完成具体的mount操作 */  retval = do_new_mount(&path, type_page, flags, mnt_flags,  dev_name, data_page);  

dput_out:
path_put(&path);
return retval;
}
do_new_mount()函数主要分成两大部分:第一部分建立vfsmount对象和superblock对象,必要时从设备上获取文件系统元数据;第二部分将vfsmount对象加入到mount树和Hash Table中,并且将原来的dentry对象无效掉。do_new_mount函数说明如下:
static int do_new_mount(struct path *path, char *type, int flags,
int mnt_flags, char *name, void *data)
{
struct vfsmount *mnt;
int err;

。。。  /* 在内核建立vfsmount对象和superblock对象 */  
mnt = do_kern_mount(type, flags, name, data);  
if (IS_ERR(mnt))  return PTR_ERR(mnt);  
/* 将vfsmount对象加入系统,屏蔽原有dentry对象 */  
err = do_add_mount(mnt, path, mnt_flags);  
if (err)  mntput(mnt);  
return err;  

}
do_new_mount()中的第一步调用do_kern_mount()函数,该函数的主干调用路径如下:
do_kern_mount–> vfs_kern_mount–> mount_fs
在mount_fs()函数中会调用特定文件系统的mount方法,如果mount是ext3文件系统,那么在mount_fs函数中最终会调用ext3的mount方法。Ext3的mount方法定义在super.c文件中:
static struct file_system_type ext3_fs_type = {
.owner = THIS_MODULE,
.name = “ext3”,
.mount = ext3_mount, /* ext3文件系统mount方法 */
.kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV,
};
ext3 mount函数主干调用路径为:ext3_mount–> mount_bdev。Mount_bdev()函数主要完成superblock对象的内存初始化,并且加入到全局superblock链表中。该函数说明如下:
struct dentry *mount_bdev(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data,
int (fill_super)(struct super_block , void *, int))
{
struct block_device *bdev;
struct super_block *s;
fmode_t mode = FMODE_READ | FMODE_EXCL;
int error = 0;

if (!(flags & MS_RDONLY))  mode |= FMODE_WRITE;  
/* 通过设备名字获取被mount设备的bdev对象 */  
bdev = blkdev_get_by_path(dev_name, mode, fs_type);  
if (IS_ERR(bdev))  return ERR_CAST(bdev);  /*  * once the super is inserted into the list by sget, s_umount  * will protect the lockfs code from trying to start a snapshot  * while we are mounting  */  
mutex_lock(&bdev->bd_fsfreeze_mutex);  
if (bdev->bd_fsfreeze_count > 0) {  mutex_unlock(&bdev->bd_fsfreeze_mutex);  error = -EBUSY;  goto error_bdev;  
}  
/* 查找或者创建superblock对象 */  
s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);  
mutex_unlock(&bdev->bd_fsfreeze_mutex);  
if (IS_ERR(s))  goto error_s;  if (s->s_root) {  /* 被mount文件系统的根目录项已经存在 */  if ((flags ^ s->s_flags) & MS_RDONLY) {  deactivate_locked_super(s);  error = -EBUSY;  goto error_bdev;  }  /*  * s_umount nests inside bd_mutex during  * __invalidate_device().  blkdev_put() acquires  * bd_mutex and can't be called under s_umount.  Drop  * s_umount temporarily.  This is safe as we're  * holding an active reference.  */  up_write(&s->s_umount);  blkdev_put(bdev, mode);  down_write(&s->s_umount);  
} else {  /* 文件系统根目录项不存在,通过filler_super函数读取磁盘上的superblock元数据信息,并且初始化superblock内存结构 */  char b[BDEVNAME_SIZE];  s->s_flags = flags | MS_NOSEC;  s->s_mode = mode;  strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));  sb_set_blocksize(s, block_size(bdev));  /* 对于ext3文件系统,调用ext3_fill_super函数 */  error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);  if (error) {  deactivate_locked_super(s);  goto error;  }  s->s_flags |= MS_ACTIVE;  bdev->bd_super = s;  
}  
/* 正常返回被mount文件系统根目录项 */  
return dget(s->s_root);  

error_s:
error = PTR_ERR(s);
error_bdev:
blkdev_put(bdev, mode);
error:
return ERR_PTR(error);
}
do_new_mount()函数的第二步是将创建的vfsmount对象加入到mount树和VFSMOUNT Hash Table中,并且将老的dentry目录项无效掉。该过程主干函数调用过程如下所示:
do_new_mount–> do_add_mount–> graft_tree–> attach_recursive_mnt
attach_recursive_mnt()函数完成第二步过程的主要操作。至此,文件系统的mount操作已经完成。Mount完成之后,如果用户想要访问新mount文件系统中的文件,那么需要在path解析过程中重定位dentry,该过程主要在follow_managed()函数中完成。在该函数中会判断一个dentry是否已经被标识成DCACHE_MOUNTED,如果该标志位已经被设置,那么通过VFSMOUNT Hash Table可以重定位dentry。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 如何学习C语言?就是这么简单粗暴!

    C语言是面向过程的,而C++是面向对象的。C和C++的区别:C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模…...

    2024/4/14 15:18:13
  2. 使用基于时间的关系加权标准来改善社交网络中的链接预测

    使用基于时间的关系加权标准来改善社交网络中的链接预测关键词:链接预测,社交网络,加权图。 摘要:近年来,对复杂网络中链路预测(LP)问题的研究引起了相当多的关注。此问题试图预测网络中两个未互连节点之间出现未来关联的可能性。已经开发了各种方法来解决这个问题。其中…...

    2024/5/1 3:09:45
  3. 解密黑客盗号

    早期的盗取号的方法主要有两种:第一种:本地机器种木马这是极为普遍的一种方法,而且很简单,只要您能有一个木马就行,这种软件可以说遍地都是,数量很多,随便到哪个小黑客网站都能找到,其工作原理也很简单!首先它具备记录功能,的密码可以自动记录下来,当木马被种到你的…...

    2024/4/19 12:19:02
  4. 黑客专业术语大全

    1、肉鸡所谓“肉鸡”是一种很形象的比喻,比喻那些可以随意被我们控制的电脑,对方可以是WINDOWS系统,也可以是UNIX/LINUX系统,可以是普通的个人电脑,也可以是大型的服务器,我们可以象操作自己的电脑那样来操作它们,而不被对方所发觉。 2、木马就是那些表面上伪装成了正常…...

    2024/5/5 9:55:44
  5. C语言之线程学习

    1. 线程调用函数中使用pthread_self() 获取线程ID,而不是通过pthread_create() 的第一个参数tidp获取线程ID? 受编译器的影响,pthread_create返回的tidp可能在执行线程函数之后返回,从而线程函数获取的tidp不存在。2. 使用pthread_join 获取线程退出的参数时,需要保证退…...

    2024/5/5 13:21:57
  6. 敏捷开发流程总结

    Agile——敏捷开发,作为CMM神话崩溃后被引入的一套新的软件开发模式,这几年来被广泛引起关注,并被寄予厚望。敏捷开发在其他业界的应用是否理想不得而知,但以下总结了我所在公司的敏捷开发试验,希望可以达到管中窥豹的目的。敏捷开发宣言——个体和交互 胜过 过程和工…...

    2024/5/5 7:21:07
  7. 2. ATF(ARM Trusted firmware)启动---bl1

    历经一年多时间的系统整理合补充,《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 》一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件,从用户空间到内核空间的顺序对TEE技术详细阐述,读者可从用户空间到TEE内核一步一步了解系统安…...

    2024/4/17 21:07:46
  8. 【java】在线编程网站推荐

    有些时候,我们需要在没有jdk的电脑上写一点测试用的小东西,与其是重新搭建环境,不如在线编程。今天向大家推荐一个在线编程的网站。https://www.jdoodle.com/online-java-compiler/再说一个比较基础的思考性问题:两个数值相同的Double类型的对象比较大小,得到的结果是true…...

    2024/5/5 6:47:38
  9. 使用SPSS Clementine进行社交网络分析

    原文链接: http://www.itongji.cn/spss/100211592012.html 背景知识:社交网络分析、数据挖掘、IBM SPSS Modeler社交网络分析是人、组织、计算机或者其他信息或知识处理实体之间的关系和流动信息的映射和测量。图 1 是社交网络的一个示意图,其中的节点表示人、组织、计算机或…...

    2024/4/14 22:20:19
  10. 配置本地的cloud9开发环境

    前言说到(前端)在线IDE开发环境,cloud9是不能绕过的,cloud9支持很多语言,默认支持的就有Node.js,Python,Ruby,PHP,Go,更逆天的是,他还支持数据库,包括MySQL,MongoDB,Redis,SQLite。但问题在于它是国外公司开发的,其基于web的特性在国内访问因为速度的问题,体验…...

    2024/4/14 22:20:17
  11. 黑客的google运用技巧

    搜索也是一门艺术说起Google,可谓无人不知无人不晓,其强大的搜索功能,可以让你在瞬间找到你想要的一切。不过对于普通的用户而言,Google是一个强大的搜索引擎;而对于黑客而言,则可能是一款绝佳的黑客工具。正因为google的检索能力强大,黑客可以构造特殊的关键字语法,使…...

    2024/5/5 4:42:43
  12. iOS开发没有开发者账号照样可以进行真机测试

    最近在一家公司开发一个新项目,由于公司之前没有进行过iOS开发所以暂时还没有苹果开发者账号。在之前的开发中要进行真机测试都是需要开发者账号的,本以为不能进行真机测试了,可没想到网上一搜,竟然找了不用苹果开发者账号也能进行真机测试的方法。下面就把这个方法分享给大…...

    2024/4/14 22:11:24
  13. Discuz

    Discuz 7.x/6.x 全局变量防御绕过导致代码执行 这是一个非常知名,历史漏洞也比较多的cms。 由于php5.3.x版本里php.ini的设置里request_order默认值为GP(只包含get和post,不包含cookie),导致$_REQUEST中不再包含$_COOKIE,我们通过在Cookie中传入$GLOBALS来覆盖全局变量,造…...

    2024/5/5 6:57:45
  14. c语言学习感想

    接触c语言已经2个多月了,在这段期间按时的完成了作业,上课能够较好的听讲,因此我获得了老师奖励的小黄衫。 同时,希望自己能够学好c语言!学习感受与心得因为兴趣,选择了计算机这专业,我从遥远的南方来到了北京上学,一切都是那么的新鲜,不习惯......c语言,一门暂新的课…...

    2024/4/14 22:11:21
  15. R语言数据挖掘1.4 社交网络挖掘

    1.4 社交网络挖掘正如我们前面提到的,数据挖掘是从数据中发现一个模型,社交网络挖掘就是从表示社交网络的图形数据中发现模型。 社交网络挖掘是网络数据挖掘的一个应用,比较流行的应用有社会科学和文献计量学、PageRank和HITS算法、粗粒度图模型的不足、增强模型和技术、主…...

    2024/5/4 17:28:04
  16. 简单模拟社交网络分析

    之前的文章中介绍了社交网络常用的一些分析指标,这里Tatsumi将自己编写Scrapy爬虫获取简书用户的关注与被关注行为信息,模拟一个真实的小社交网络群体。 打开简书的网站,随便找到一个用户然后点击关注或粉丝,便可获取该用户对应的粉丝和它关注的用户ID。 由于简书里这种用…...

    2024/5/5 10:58:11
  17. C语言编程入门新手学习精华:这样学习C语言最有效

    1、 C语言已死吗? 本资料描述的是使用C语言的高级技巧,力求将你的C语言能力由“基础”提升为“高级”。但是学习态度胜过学习方法,在正式学习之前,有一个问题不吐不快,那就是“C语言还值得学习吗?” 正方观点——C语言已死 正方论据:C语言的三宗罪: 1、代码底层,缺乏共…...

    2024/4/14 22:11:18
  18. Python IDE

    https://blog.csdn.net/zzfenglin/article/details/52336440http://www.runoob.com/python/python-ide.htmlhttps://blog.csdn.net/danielntz/article/details/51429686https://www.cnblogs.com/yhason/p/4725810.html...

    2024/4/28 8:15:53
  19. 黑客网站犯法吗?有什么法律管理吗,能告诉我吗。

    黑客网站犯法法吗?2007-03-18 20:56费力斯 | 分类:法律 | 浏览4711次黑客网站犯法吗?有什么法律管理吗,能告诉我吗。如果自己不知情,帮黑客管理网站,如果有问题了,公安会找我吗。分享到:2007-03-18 21:02提问者采纳看了下面的你知道了!什么是黑客? 黑客一词,源于英文…...

    2024/4/27 8:19:06
  20. Vue 项目判断开发、测试、正式环境

    方法一 最简单的方法:通过判断location.href来判断环境 function env() {if (process.env.NODE_ENV === "development") return "development"; //开发环境if (window.location.href.includes(192.168)) return test; //测试环境,"192.168…...

    2024/4/14 22:20:16

最新文章

  1. Web的介绍

    什么是web web&#xff1a;全球广域网 &#xff0c;也成为万维网&#xff0c;是通过浏览器访问的网站 web访问的流程 浏览器先对前端服务器&#xff08;前端程序&#xff09;发送请求 然后前端服务器对浏览器进行响应 浏览器对后端服务器&#xff08;Java程序&#xff09;发…...

    2024/5/5 14:59:54
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. javaWeb网上零食销售系统

    1 绪 论 目前&#xff0c;我国的网民数量已经达到7.31亿人&#xff0c;随着互联网购物和互联网支付的普及&#xff0c;使得人类的经济活动进入了一个崭新的时代。淘宝&#xff0c;京东等网络消费平台功能的日益完善&#xff0c;使得人们足不出户就可以得到自己想要的东西。如今…...

    2024/5/5 8:40:41
  4. RP2040开发笔记

    RP2040 采用合宙的RP2040(板载4MB Flash)&#xff0c; 所有开发资料参考官方&#xff1a;树莓派 Pico 中文站...

    2024/5/1 13:52:14
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57