用前端框架做自适应网站杭州住房和城乡建设部网站

news/2025/9/27 0:32:36/文章来源:
用前端框架做自适应网站,杭州住房和城乡建设部网站,wordpress不能更新,wordpress 文章内容页NIC注册和注销的通用架构Linux系统中NIC网络设备驱动程序利用网络代码进行注册和注销有其通用的架构#xff0c;这里以PCI Ethernet NIC为例#xff0c;其他设备类型只是所以函数名称和调用方式不同#xff0c;主要依据于设备总线提供的接口。其中(a)为设备注册的大致流程图…NIC注册和注销的通用架构Linux系统中NIC网络设备驱动程序利用网络代码进行注册和注销有其通用的架构这里以PCI Ethernet NIC为例其他设备类型只是所以函数名称和调用方式不同主要依据于设备总线提供的接口。其中(a)为设备注册的大致流程图而(b)为设备注销的流程图。在PCI Ethernet NIC设备驱动程序的探测函数(热插拔设备)或模块初始化函数中首先要为设备分配一个net_device数据结构并对其中的成员进行必要的初始化对其中与设备类型密切相关的特殊成员利用驱动程序自己实现的setup函数进行初始化Ethernet NIC设备驱动程序还需要调用netdev_boot_setup_check检查是否在系统启动参数中对网络设备进行了设置然后调用register_netdev完成设备的注册。在分配net_device数据结构时驱动程序一般不直接调用alloc_netdev函数而是调用为其类型封装后的函数如Ethernet NIC设备直接调用alloc_etherdev函数使用更加方便简单。而Ethernet NIC设备的注销则是相反的过程首先调用unregister_netdev在系统中注销设备然后将分配的net_device数据结构释放。在释放net_device数据结构时设备也可能不直接调用free_netdev函数中而是调用net_device数据结构中的成员函数/* Called from unregister, can be used to call free_netdev */void (*destructor)(struct net_device *dev);虚拟设备驱动程序一般采用这种方式实现自己的destructor函数来释放net_device数据结构。网络设备注册过程网络设备在系统中注册后内核在处理数据包时才能调用设备接口实现的处理函数。网络设备的注册是通过register_netdev函数完成的/***    register_netdev    - register a network device*    dev: device to register**    Take a completed network device structure and add it to the kernel*    interfaces. A %NETDEV_REGISTER message is sent to the netdev notifier*    chain. 0 is returned on success. A negative errno code is returned*    on a failure to set up the device, or if the name is a duplicate.**    This is a wrapper around register_netdevice that takes the rtnl semaphore*    and expands the device name if you passed a format string to*    alloc_netdev.*/int register_netdev(struct net_device *dev){int err;rtnl_lock();/** If the name is a format string the caller wants us to do a* name allocation.*/if (strchr(dev-name, %)) {err dev_alloc_name(dev, dev-name);if (err 0)goto out;}err register_netdevice(dev);out:rtnl_unlock();return err;}EXPORT_SYMBOL(register_netdev);其中rtnl_lock是内核保护运行时的net_device数据结构的互斥手段一般在修改net_device中flag字段表示有事件发生需要改变设备的状态或者用户通过ifconfig、route等命令修改接口的配置时通过ioctl和netlink接口告诉内核操作设备的net_device结构都需要调用这个锁来进行互斥。dev_alloc_name(dev, dev-name)函数会在系统中找到这种类型的网络设备中第一个没有使用的序列号来替换设备名称中的%d生成如eth2的设备名称。int dev_alloc_name(struct net_device *dev, const char *name){char buf[IFNAMSIZ];struct net *net;int ret;BUG_ON(!dev_net(dev));net dev_net(dev);ret __dev_alloc_name(net, name, buf);if (ret 0)strlcpy(dev-name, buf, IFNAMSIZ); //将返回的设备名称复制到net_device的name字段return ret;}static int __dev_alloc_name(struct net *net, const char *name, char *buf){int i 0;const char *p;const int max_netdevices 8*PAGE_SIZE;unsigned long *inuse;struct net_device *d;/*检查设备名称中是否有%d或其他不合法字符*/p strnchr(name, IFNAMSIZ-1, %);if (p) {if (p[1] ! d || strchr(p 2, %))return -EINVAL;/*分配一个物理页面作为位图来对系统中该类型设备已用序列号进行标记*/inuse (unsigned long *) get_zeroed_page(GFP_ATOMIC);if (!inuse)return -ENOMEM;/*变量网络命名空间中的所有设备即net_device结构*/for_each_netdev(net, d) {if (!sscanf(d-name, name, i)) //获取同类型网络设备的其序列号这里极为巧妙continue;if (i 0 || i max_netdevices) //判断序列号的范围continue;snprintf(buf, IFNAMSIZ, name, i);if (!strncmp(buf, d-name, IFNAMSIZ)) /*验证解析的序列号是否正确*/set_bit(i, inuse); //在位图中将该位标记}i find_first_zero_bit(inuse, max_netdevices); //找到第一个为0的序列号free_page((unsigned long) inuse);}if (buf ! name)snprintf(buf, IFNAMSIZ, name, i); //根据找到的序列号输出完整的设备名if (!__dev_get_by_name(net, buf)) //在name_list链表中查找是否有同名的设备return i;/* It is possible to run out of possible slots* when the name is long and there isnt enough space left* for the digits, or if all bits are used.*/return -ENFILE;}在这里就为设备完成了完整设备名的组合内核在这里位图的使用非常巧妙以后可以在处理位图时可以直接使用内核实现的set_bit和find_first_zero_bit、clear_bit等函数。register_netdevice才是网络设备注册的最重要步骤int register_netdevice(struct net_device *dev){int ret;struct net *net dev_net(dev);  //设备的网络空间BUG_ON(dev_boot_phase);ASSERT_RTNL();might_sleep();/* When net_devices are persistent, this will be fatal. */BUG_ON(dev-reg_state ! NETREG_UNINITIALIZED); //alloc_netdev时不需要设置这个成员因为其为0BUG_ON(!net);/*初始化net_device中的一些成员锁*/spin_lock_init(dev-addr_list_lock);netdev_set_addr_lockdep_class(dev);dev-iflink -1;/* Init, if this function is available */if (dev-netdev_ops-ndo_init) { //调用设备驱动程序操作中实现的初始化函数ret dev-netdev_ops-ndo_init(dev);if (ret) {if (ret 0)ret -EIO;goto out;}}ret dev_get_valid_name(dev, dev-name, 0); //检查设备名称的有效性if (ret)goto err_uninit;dev-ifindex dev_new_index(net); //为设备分配一个唯一的索引号if (dev-iflink -1)dev-iflink dev-ifindex;/* Transfer changeable features to wanted_features and enable* software offloads (GSO and GRO).*//*设置设备的一些特性*/dev-hw_features | NETIF_F_SOFT_FEATURES;dev-features | NETIF_F_SOFT_FEATURES;dev-wanted_features dev-features dev-hw_features;/* Enable GRO and NETIF_F_HIGHDMA for vlans by default,* vlan_dev_init() will do the dev-features check, so these features* are enabled only if supported by underlying device.*/dev-vlan_features | (NETIF_F_GRO | NETIF_F_HIGHDMA);ret call_netdevice_notifiers(NETDEV_POST_INIT, dev); //调用通知链发出事件通知ret notifier_to_errno(ret);if (ret)goto err_uninit;ret netdev_register_kobject(dev); //设备注册的核心函数主要是调用device_add函数将设备添加到内核的设备管理器中if (ret)goto err_uninit;dev-reg_state NETREG_REGISTERED;  //设置net_device的状态netdev_update_features(dev);/**    Default initial state at registry is that the*    device is present.*/set_bit(__LINK_STATE_PRESENT, dev-state);dev_init_scheduler(dev); //在这里会设置设备的看门狗定时器dev_hold(dev); //增加设备的引用计数list_netdevice(dev);  //将设备加入系统的indexlist、namelist和devlist中/* Notify protocols, that a new device appeared. */ret call_netdevice_notifiers(NETDEV_REGISTER, dev); //通过通知链发出设备注册通知ret notifier_to_errno(ret);if (ret) {rollback_registered(dev);dev-reg_state NETREG_UNREGISTERED;}/**    Prevent userspace races by waiting until the network*    device is fully setup before sending notifications.*/if (!dev-rtnl_link_ops ||dev-rtnl_link_state RTNL_LINK_INITIALIZED)rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);out:return ret;err_uninit:if (dev-netdev_ops-ndo_uninit)dev-netdev_ops-ndo_uninit(dev);goto out;}EXPORT_SYMBOL(register_netdevice);由上可知注册的主要过程是netdev_register_kobject函数中的device_add过程和list_netdevice(dev)将设备加入到系统的几个hash链表中便于系统处理数据包时查找对应的设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918944.shtml

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

相关文章

TDS文件搜索_Winform版本与avalonia开发差异比较:(一)系统消息的接收与无标题栏/边框窗体的移动与尺寸调整

TDS文件搜索_Winform版本与avalonia开发差异比较:(一)系统消息的接收与无标题栏/边框窗体的移动与尺寸调整一、Winform和Avalonia的选择 收到私信,有看过上一篇的朋友说想了解Winform相关内容,感谢建议,因为因此…

台州网站制作维护规范门户网站的建设和管理办法

说明: 1)访问应用业务,读取不到数据,show databases;查看数据库报错 2)重启docker服务,服务启动失败,查看日志报错如下图所示 3)报错信息:chmod /data/docker: read-only…

宜昌做网站优化万网ip查询

一、 在终端输入 sudo apt-get install openssh-server 二、 执行如下命令 sudo apt-get install ssh 三、 开启 ssh-server,输入密码 service ssh start 四、 验证,输入 ps -e|grep ssh,看到sshd成功 ps -e|grep ssh五、 连接

手机版网站开发网站运行时错误如何做

1、代码如下: close all;clear all;clc; %关闭所有图形窗口,清除工作空间所有变量,清空命令行 Iimread(pout.tif); Jimadjust(I,[0.2 0.5],[0 1]);%将0.2-0.5之间的灰度扩展到整个0-1范围,这种处理 对于强调感兴趣灰度区非常有用…

wordpress 站标不显示wordpress 手机登陆

返回目录:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 环境变量参考 下一篇:将OpenCV与gcc和CMake结合使用 引言: OpenCV是一个开源的计算机视觉库,由英特尔公司所赞助。它是一个跨…

学做彩票网站win7 iis 默认网站

​​​​​​ 与存储标量数据(如整数、字符串等)的传统数据库不同,矢量数据库旨在有效地存储和检索矢量数据——表示多维空间中的点的数值集合。 本文将探讨如何在 Rust 中实现基本的向量数据库。 让我们开始吧!🦀 什么是矢量数据库? 矢量数据库是一种针对存储和查询…

单人网站制作关键词搜索站长工具

PHP 做网页后端还是很优秀的&#xff0c;PHP 表单提交&#xff0c;不外乎两种方法&#xff0c;即 GET 和 POST 方法&#xff1b;PHP后台使用全局变量$_POST;$_GET;来获取提交数据。代码&#xff1a;<!DOCTYPE HTML> <html> <head><meta charset"utf-…

梦织网站如何用wordpress快速建站

使用 fake-as 可以将本地真实的 AS 编号隐藏&#xff0c;其他 AS 内的对等体在指定本端对等体所在的AS 编号时&#xff0c;应该设置成这个伪AS 编号。 这是实验拓扑&#xff0c;IBGP EBGP 邻居都使用物理接口来建立 基本配置&#xff1a; R1: sys sysname R1 int loo0 ip add…

js源码下载从哪个网站能下载建设部门户网站条例免费下载

【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路&#xff0c;就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器&#xff0c;也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路&#xff0c;读出内容就…

网站更新前知道内容岳阳网站平台设计

文章目录 前言SMTPPOP3IMAP4区别与联系 前言 常见的邮件协议包括SMTP、POP3和IMAP4。这些协议都隶属于TCP/IP协议簇&#xff0c;属于应用层&#xff0c;分别通过TCP端口25、110和143建立连接。电子邮件的发送和接收过程依赖于这些协议。 SMTP &#xff08;Simple Mail Trans…

东莞seo网站优化方式深圳网站快速备案

关于类似的帖子好像很多&#xff0c;但是没有找到具体能帮我解决问题的办法。还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点&#xff1a; 先放一个图&#xff1a; A&#xff0c;先说说不用xpath的场景&#xff0c;一般是用于存在id或者name。可能没有看到na…

网站开发是先做前段还是后台简单电子商务网站建设

大家好&#xff0c;我是专注家居和装修知识分享的家居杂坛。喜欢的就点击一下关注吧&#xff01;对于在地面上所浇筑的混凝土&#xff0c;常规有两种做法。例如&#xff0c;在混凝土中铺设钢筋&#xff0c;打成钢筋混凝土的地面&#xff0c;又或者还有一些朋友在钢混凝土中放入…

php网站开发作业网站中高端建设

1、hibernate 要求实体类里面有一个属性作为唯一值&#xff0c;对应的表字段是主键&#xff0c;主键可以不同的生成策略 2、hibernate 主键生成策略有很多的值 <generator class"native"></generator> 3、在class属性里面有很多值 &#xff08;1&#xf…

docker复制文件到宿主机

要将 Nacos 容器内的文件复制到宿主机,可以使用 docker cp 命令,该命令支持在容器和宿主机之间复制文件或目录。以下是具体操作步骤: 一、基本语法 # 将容器内的文件/目录复制到宿主机 docker cp <容器名或容器I…

【SimpleFOC】SimpleFOC的运动规划器(Motion Planner)和梯形速度规划

SimpleFOC 在位置(角度)模式时,达到目标位置过程中,是默认开启平滑转动的效果的。 SimpleFOC 的平滑转动是通过运动规划器(Motion Planner)实现的,而不是瞬间跳到目标位置。 运动规划器的工作原理 1. 默认的梯形速…

南昌企业做网站产品单页营销型网站模板

指系统能按某种顺序如&#xff08;P1&#xff0c;P2&#xff0c;...&#xff0c;Pn&#xff09;&#xff0c;来为每个进程分配所需要的资源&#xff0c;直至最大需求&#xff0c;使每个进程都可以顺序完成。若系统不存在这样一个安全序列&#xff0c;则称系统处于不安全状态。

深圳入户申请网站官网永春网站设计

如果你准备发NLP方向的论文&#xff0c;或准备从事科研工作或已在企业中担任NLP算法岗的工作。那么我真诚的向大家推荐&#xff0c;贪心学院《自然语言处理高阶研修班》&#xff0c;目前全网上应该找不到类似体系化的课程。课程精选了四大主题进行深入的剖析讲解&#xff0c;四…

网站建设的线框图叫什么dw网页制作教程视频简单第三期

前言 小羊近期已经将C语言初阶学习内容与铁汁们分享完成&#xff0c;接下来小羊会继续追更C语言进阶相关知识&#xff0c;小伙伴们坐好板凳&#xff0c;拿起笔开始上课啦~ 一、数据类型的介绍 我们目前已经学了基本的内置类型&#xff1a; char //字符数据类型 short …

Day22多态详解

多态是面向对象的重要特性,在java中表现为父类引用指向子类对象 Father f1 = new Son(); 多态是方法的多态,与属性无关 父类与子类之间需要有联系,否则类型转换异常,即ClassCastException 多态的存在条件是两个类之…

rad/s RPM之间的换算

SimpleFOC中,经常用到如下代码motor.velocity_limit = 1.0; // 限制最大速度其中 ,velocity_limit单位为 rad/s, 其与 rpm换算关系是什么呢?// 速度单位换算参考: // 1 rad/s = 9.55 RPM // 2 rad/s ≈ 19 RPM //…