当前位置: 首页 > news >正文

广州微信网站建设平台住房和城乡建设部网站关于污水运行负荷率要求的文件

广州微信网站建设平台,住房和城乡建设部网站关于污水运行负荷率要求的文件,dw做网站背景图片设置,毕设做网站需要买域名么1、 什么是系统调用操作系统通过系统调用为运行于其上的进程提供服务。当用户态进程发起一个系统调用#xff0c; CPU 将切换到 内核态 并开始执行一个 内核函数 。 内核函数负责响应应用程序的要求#xff0c;例如操作文件、进行网络通讯或者申请内存资源等。在Linux中系统调…1、 什么是系统调用操作系统通过系统调用为运行于其上的进程提供服务。当用户态进程发起一个系统调用 CPU 将切换到 内核态 并开始执行一个 内核函数 。 内核函数负责响应应用程序的要求例如操作文件、进行网络通讯或者申请内存资源等。在Linux中系统调用是有Linux内核提供的各种功能服务为了便于调用Linux提供了一个底层C语言库libc(glibc是GUN版本的libc其他类似库还有uclibc、klibc)目前glibc是linux标准函数库这些都对系统系统接口打包成了标准C函数这些函数一般就成为系统调用。系统调用可以通过syscall()函数发起或者调用每个对应的一个C函数这些函数定义在 或者 头文件中。Linux系统中通过软中断0x80调用实现控制权转移给内核内容执行完成后返回结果。所有系统调用在linux内核的源文件目录 arch/x86/kernel中的各种文件中定义。内核实现了很多的系统调用函数, 这些函数会有自己的名字, 以及编号. 用户要调用系统调用, 首先需要使用  int 0x80 触发软中断. 这个指令会在0x80代表十进制的128, 所以这个指令会找终端向量表的128项, 找到以后, 跳转到相应的函数, 这个处理函数就是system_call. 这个中断向量表的设置, 是在操作系统初始化的时候, 通过trap_init()函数设置的. 在进入中断处理函数system_call以后, 首先要进行一般的中断处理流程, 即保护现场. 这个体现在指令SAVE_ALL(494行)上. 然后有一个重要的函数调用 call *sys_call_table(,%eax,4). 这个表示查找系统调用函数表(), 然后调用相应的系统调用函数. 对于32位的系统, 函数位置存了4个Bytes, eax中是我们传入的系统调用号, 所以4*eax,就可以找到对应的系统调用函数, 执行函数. 之后还需要进行返回值的保存等工作.2、 socket相关系统调用的内核处理函数深入分析1)        因为上一次实验是在shiyanlou环境下完成所以此次实验需要重新下载下载linux-5.0.1的内核并编译内核并制作根文件系统。2)解Linux内核中socket接口层的代码找出112号系统调用socketcall的内核处理函数sys_socketcall理解socket接口函数编号和对应的socket接口内核处理函数 通过前面构建MenuOS实验环境使得我们有方法跟踪socket接口通过系统调用进入内核代码在我们的环境中socket接口通过112号系统调用socketcall进入内核的System call vectors.Argument checking cleaned up. Saved 20% in size.This function doesn‘t need to set the kernel lock becauseit is set by the callees.2490 */24912492SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)2493{...2517 switch (call) {2518 case SYS_SOCKET:2519       err sys_socket(a0, a1, a[2]);2520       break;2521 case SYS_BIND:2522       err sys_bind(a0, (struct sockaddr __user *)a1, a[2]);2523       break;2524 case SYS_CONNECT:2525       err sys_connect(a0, (struct sockaddr __user *)a1, a[2]);2526       break;2527 case SYS_LISTEN:2528       err sys_listen(a0, a1);2529       break;2530 case SYS_ACCEPT:2531       err sys_accept4(a0, (struct sockaddr __user *)a1,2532                       (int __user *)a[2], 0);2533       break;2534 case SYS_GETSOCKNAME:2535       err 2536           sys_getsockname(a0, (struct sockaddr __user *)a1,2537                         (int __user *)a[2]);2538       break;2539 case SYS_GETPEERNAME:2540       err 2541           sys_getpeername(a0, (struct sockaddr __user *)a1,2542                         (int __user *)a[2]);2543       break;2544 case SYS_SOCKETPAIR:2545       err sys_socketpair(a0, a1, a[2], (int __user *)a[3]);2546       break;2547 case SYS_SEND:2548       err sys_send(a0, (void __user *)a1, a[2], a[3]);2549       break;2550 case SYS_SENDTO:2551       err sys_sendto(a0, (void __user *)a1, a[2], a[3],2552                     (struct sockaddr __user *)a[4], a[5]);2553       break;2554 case SYS_RECV:2555       err sys_recv(a0, (void __user *)a1, a[2], a[3]);2556       break;2557 case SYS_RECVFROM:2558       err sys_recvfrom(a0, (void __user *)a1, a[2], a[3],2559                        (struct sockaddr __user *)a[4],2560                        (int __user *)a[5]);2561       break;2562 case SYS_SHUTDOWN:2563       err sys_shutdown(a0, a1);2564       break;2565 case SYS_SETSOCKOPT:2566       err sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);2567       break;2568 case SYS_GETSOCKOPT:2569       err 2570           sys_getsockopt(a0, a1, a[2], (char __user *)a[3],2571                        (int __user *)a[4]);2572       break;2573 case SYS_SENDMSG:2574       err sys_sendmsg(a0, (struct msghdr __user *)a1, a[2]);2575       break;2576 case SYS_SENDMMSG:2577       err sys_sendmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3]);2578       break;2579 case SYS_RECVMSG:2580       err sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);2581       break;2582 case SYS_RECVMMSG:2583       err sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3],2584                        (struct timespec __user *)a[4]);2585       break;2586 case SYS_ACCEPT4:2587       err sys_accept4(a0, (struct sockaddr __user *)a1,2588                       (int __user *)a[2], a[3]);2589       break;2590 default:2591       err -EINVAL;2592       break;2593 }2594 return err;2595}2596在我们的实验环境中socket接口的调用是通过给socket接口函数编号的方式通过112号系统调用来处理的。这些socket接口函数编号的宏定义见/linux-3.18.6/include/uapi/linux/net.h#2626#define SYS_SOCKET 1            /* sys_socket(2)           */27#define SYS_BIND     2            /* sys_bind(2)              */28#define SYS_CONNECT    3            /* sys_connect(2)         */29#define SYS_LISTEN  4            /* sys_listen(2)             */30#define SYS_ACCEPT 5            /* sys_accept(2)           */31#define SYS_GETSOCKNAME  6            /* sys_getsockname(2)        */32#define SYS_GETPEERNAME   7            /* sys_getpeername(2)        */33#define SYS_SOCKETPAIR 8            /* sys_socketpair(2)             */34#define SYS_SEND    9            /* sys_send(2)              */35#define SYS_RECV    10          /* sys_recv(2)               */36#define SYS_SENDTO      11          /* sys_sendto(2)           */37#define SYS_RECVFROM  12          /* sys_recvfrom(2)        */38#define SYS_SHUTDOWN 13          /* sys_shutdown(2)             */39#define SYS_SETSOCKOPT      14          /* sys_setsockopt(2)            */40#define SYS_GETSOCKOPT     15          /* sys_getsockopt(2)           */41#define SYS_SENDMSG    16          /* sys_sendmsg(2)        */42#define SYS_RECVMSG    17          /* sys_recvmsg(2)         */43#define SYS_ACCEPT4     18          /* sys_accept4(2)         */44#define SYS_RECVMMSG 19          /* sys_recvmmsg(2)             */45#define SYS_SENDMMSG 20          /* sys_sendmmsg(2)            */接下来我们根据TCP server程序调用socket接口的顺序依次看一下socket、bind、listen、accept等socket接口的内核处理函数。socket接口函数的内核处理函数sys_socket1377SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)1378{1379 int retval;1380 struct socket *sock;...1397 retval sock_create(family, type, protocol, sock);...socket接口函数主要作用是建立socket套接字描述符Unix-like系统非常成功的设计是将一切都抽象为文件socket套接字也是一种特殊的文件sock_create内部就是使用文件系统中的数据结构inode为socket套接字分配了文件描述符。socket套接字与普通的文件在内部存储结构上是一致的甚至文件描述符和套接字描述符是通用的但是套接字和文件还是特殊之处因此定义了结构体struct socketstruct socket的结构体定义见/linux-3.18.6/include/linux/net.h#105具体代码摘录如下95/**96 *  struct socket - general BSD socket97 *  state: socket state (%SS_CONNECTED, etc)98 *  type: socket type (%SOCK_STREAM, etc)99 *  flags: socket flags (%SOCK_ASYNC_NOSPACE, etc)100 *  ops: protocol specific socket operations101 *  file: File back pointer for gc102 *  sk: internal networking protocol agnostic socket representation103 *  wq: wait queue for several uses104 */105struct socket {106  socket_state         state;107108  kmemcheck_bitfield_begin(type);109  short                    type;110  kmemcheck_bitfield_end(type);111112  unsigned long             flags;113114  struct socket_wq __rcu *wq;115116  struct file       *file;117  struct sock            *sk;118  const struct proto_ops *ops;119};sock_create内部还根据指定的网络协议族family和protocol初始化了相关协议的处理接口到结构体struct socket中结构体struct socket在后续的分析和理解中还会用到这里简单略过用到时再具体研究。bind接口函数的内核处理函数sys_bind1519/*1520 *     Bind a name to a socket. Nothing much to do here since it‘s1521 *     the protocol‘s responsibility to handle the local address.1522 *1523 *     We move the socket address to kernel space before we call1524 *     the protocol layer (having also checked the address is ok).1525 */15261527SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)1528{1529 struct socket *sock;1530 struct sockaddr_storage address;1531 int err, fput_needed;15321533 sock sockfd_lookup_light(fd, err, fput_needed);1534 if (sock) {1535       err move_addr_to_kernel(umyaddr, addrlen, address);1536       if (err 0) {1537              err security_socket_bind(sock,1538                                      (struct sockaddr *)address,1539                                      addrlen);1540              if (!err)1541                     err sock-ops-bind(sock,1542                                         (struct sockaddr *)1543                                         address, addrlen);1544       }1545       fput_light(sock-file, fput_needed);1546 }1547 return err;1548}如上代码可以看到move_addr_to_kernel将用户态的struct sockaddr结构体数据拷贝到内核里的结构体变量struct sockaddr_storage address然后使用sock-ops-bind将该网络地址绑定到之前创建的套接字。这里用到了通过套接字描述符fd找到之前分配的套接字struct socket *sock利用该套接字中的成员const struct proto_ops *ops找到对应网络协议的bind函数指针即sock-ops-bind。这里即是一个socket接口层通往具体协议处理的接口。listen接口函数的内核处理函数sys_listen1550/*1551 *     Perform a listen. Basically, we allow the protocol to do anything1552 *     necessary for a listen, and if that works, we mark the socket as1553 *     ready for listening.1554 */15551556SYSCALL_DEFINE2(listen, int, fd, int, backlog)1557{1558 struct socket *sock;1559 int err, fput_needed;1560 int somaxconn;15611562 sock sockfd_lookup_light(fd, err, fput_needed);1563 if (sock) {1564       somaxconn sock_net(sock-sk)-core.sysctl_somaxconn;1565       if ((unsigned int)backlog somaxconn)1566              backlog somaxconn;15671568       err security_socket_listen(sock, backlog);1569       if (!err)1570              err sock-ops-listen(sock, backlog);15711572       fput_light(sock-file, fput_needed);1573 }1574 return err;1575}listen接口的主要作用是通知网络底层开始监听套接字并接收网络连接请求listen接口正常处理完TCP服务就已经启动了只是这时网络连接请求都会暂存在缓冲区等调用accept建立连接listen接口函数的参数backlog就是用来配置支持的连接数。我们发现实际处理的工作是由sock-ops-listen完成的这也是一个socket接口层通往具体协议处理的接口。accept接口函数的内核处理函数sys_accept内核处理函数sys_accept的主要功能是调用sys_accept4完成的sys_accept4见/linux-3.18.6/net/socket.c#1589具体代码摘录如下1577/*1578 *     For accept, we attempt to create a new socket, set up the link1579 *     with the client, wake up the client, then return the new1580 *     connected fd. We collect the address of the connector in kernel1581 *     space and move it to user at the very end. This is unclean because1582 *     we open the socket then return an error....1589SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,1590       int __user *, upeer_addrlen, int, flags)1591{...1608 newsock sock_alloc();...1612 newsock-type sock-type;1613 newsock-ops sock-ops;...1621 newfd get_unused_fd_flags(flags);...1627 newfile sock_alloc_file(newsock, flags, sock-sk-sk_prot_creator-name);...1639 err sock-ops-accept(sock, newsock, sock-file-f_flags);...1643 if (upeer_sockaddr) {1644       if (newsock-ops-getname(newsock, (struct sockaddr *)address,...1649       err move_addr_to_user(address,...1657 fd_install(newfd, newfile);1658 err newfd;...1668}在TCP的服务器端通过socket函数创建的套接字描述符只是用来监听客户连接请求accept函数内部会为每一个请求连接的客户创建一个新的套接字描述符专门负责与该客户端进行网络通信并将该客户的网络地址和端口等地址信息返回到用户态。这里涉及更多的网络协议处理的接口如sock-ops-accept、ewsock-ops-getname。send和recv接口的内核处理函数类似也是通过调用网络协议处理的接口来将具体的工作交给协议层来完成比如sys_recv最终调用了sock-ops-recvmsgsys_send最终调用了sock-ops-sendmsg但send和recv接口涉及网络数据流是理解网络部分的关键内容
http://www.pierceye.com/news/677116/

相关文章:

  • 宁波住房和城乡建设局网站最新上市新手机
  • 重庆做网站公司学校做网站方案
  • 网站建站建设价格酷家乐软件下载电脑版
  • 关于做网站的搞笑段子仿淘宝网站
  • 免费建网站的网站搭建价格表
  • 茶山网站仿做河池公司网站开发价格
  • 珠海网站制作推广公司哪家好做网站页面怎么做
  • 丰润网站建设怎么开网店流程
  • 电子商务网站建设的参考文献硬件开发平台是什么意思
  • 杭州做网站 做小程序自助建站免费永久
  • 软件培训网站建设鹤山市网站建设公司
  • 网站的验证码是怎么做的wordpress团购插件
  • 邯郸网站设计注册贵阳网站建设天锐科技
  • 网站建设服务费税率多少WordPress文档批量发布接口
  • 云服务器网站配置网页界面设计中一般使用的分辨率是多少
  • 网站域名销售wordpress文章入口设置
  • 上海做网站较好的公司c 做网站
  • 代发货网站系统建设螺栓球网架
  • 做书的网站有哪些内容吗电商平台定制
  • 网站建设与推广长春云电脑永久免费版手机版
  • 营销型网站建设优化建站坂田建设网站
  • 大型网站方案自己做网站详细流程
  • 网站开发中为什么有两个控制层南昌网站建设技术托管
  • 网站如何加入百度联盟易名中国网站
  • 海报在线制作免费网站网站建设费用明细湖南岚鸿
  • 宝塔服务器搭建网站教程盐城网站建设兼职
  • 南京网站制作公司怎么样wordpress思维导图
  • 学校网站建设和维护情况沈阳网页设计公司有哪些
  • 安徽网站建设电话网站建设动态静态
  • 网站建设规划设计公司排名摄影公司网站开发