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

网站app制作hao123网址导航

网站app制作,hao123网址导航,b2c模式举例,短视频拍摄价目表文章目录 系统调用和POSIX标准系统调用表程序直接访问系统调用新增系统调用 在linux中,内核空间和用户空间之间增加了一个中间层——系统调用层,如下图: 系统内调用层主要作用: 为用户空间程序提供一层硬件抽象接口。保证系统稳定…

文章目录

    • 系统调用和POSIX标准
    • 系统调用表
    • 程序直接访问系统调用
    • 新增系统调用

在linux中,内核空间和用户空间之间增加了一个中间层——系统调用层,如下图:
在这里插入图片描述

系统内调用层主要作用:

  • 为用户空间程序提供一层硬件抽象接口。
  • 保证系统稳定和安全,应用陈续访问内核必须通过系统调用层,那么内核可以在系统调用层对应用的访问权限、用户类型和其他一些规则进行过滤。
  • 可移植性,可以让应用程序在不修改源代码的情况下,重新编辑便可在不同操作系统或不同架构系统上运行。

系统调用和POSIX标准

一般来说,应用程序调用用户空间实现的编程接口来编程,而不是直接调用系统调用。一个API接口函数可以由一个系统调用实现,也可以由多个系统调用实现,或者完全不由系统调用实现。因此,一个API接口和特定的系统调用之间并无对应关系。

在UNIX世界中,最通用的系统调用层接口是POSIX(Portable Operating System Interface of UNIX)标准。POSIX标准针对的是API而不是系统调用,判断一个系统是否与POSIX兼容,要看它是否提供一组合适的应用编程接口,而不是看它的系统调用是如何定义和实现的。

Linux操作系统中的API接口通常是以C 标准库的方式提供,比如libc库。C库中提供了POSIX的绝大部分的API实现,同时也为内核提供的系统调用封装了相应的函数。

系统调用表

Linux系统为每个系统调用赋予了一个系统调用号,系统调用号一旦分配之后就不会有任何变更,否则编译好的应用程序就不能运行了。
在x86_64上,其系统调用号定义在arch/x86/include/generated/uapi/asm/unistd_64.h:

#ifndef _UAPI_ASM_UNISTD_64_H
#define _UAPI_ASM_UNISTD_64_H#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
...
#define __NR_memfd_secret 447
#define __NR_process_mrelease 448
#define __NR_futex_waitv 449
#define __NR_set_mempolicy_home_node 450
#define __NR_cachestat 451
#define __NR_fchmodat2 452
#define __NR_map_shadow_stack 453#ifdef __KERNEL__
#define __NR_syscalls 454
#endif#endif /* _UAPI_ASM_UNISTD_64_H */

以open为例,其系统调用号为2,open函数最终的实现在fs/open.c

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{if (force_o_largefile())flags |= O_LARGEFILE;return do_sys_open(AT_FDCWD, filename, flags, mode);
}

SYSCALL_DEFINE*是一组专门用来定义系统调用的宏,其实现在include/linux/syscalls.h

#ifndef SYSCALL_DEFINE0
#define SYSCALL_DEFINE0(sname)					\SYSCALL_METADATA(_##sname, 0);				\asmlinkage long sys_##sname(void);			\ALLOW_ERROR_INJECTION(sys_##sname, ERRNO);		\asmlinkage long sys_##sname(void)
#endif /* SYSCALL_DEFINE0 */#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)#define SYSCALL_DEFINE_MAXARGS	6#define SYSCALL_DEFINEx(x, sname, ...)				\SYSCALL_METADATA(sname, x, __VA_ARGS__)			\__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

__SYSCALL_DEFINEx宏最后会扩展成__do_sys_open函数(在6.6.69版本是这样,较早的版本则不是,这个不是固定的)。

程序直接访问系统调用

可以通过syscall函数来直接访问系统调用而不需要通过C 标准库函数。

#define _GNU_SOURCE         /* See feature_test_macros(7) */#include <unistd.h>#include <sys/syscall.h>   /* For SYS_xxx definitions */long syscall(long number, ...);

下面测试下用syscall直接调用open系统调用:

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <fcntl.h>int main(int argc, char *argv[])
{int fd = syscall(SYS_open, "/tmp/call.log", O_CREAT);return 0;
}

运行程序后,可以看到成功创建了/tmp/call.log这个临时文件。

新增系统调用

Linux系统的系统调用必须由Linux社区来决定,并且和glibc社区同步,总之这个过程一般会很漫长。
为了实现用户程序和内核进行信息交互,除了系统调用,还可以使用下面的方法:

  • 设备节点。实现一个设备节点后,就可以对设备进行I/O操作了,也可以通过ioctl接口自定义一些操作
  • sysfs接口,可以让用户程序和内核直接通信,这种方式比较灵活,是linux内核推荐的方法
http://www.r43.cn/news/149714.html

相关文章:

  • 浙江省网站备案时间站长工具域名查询社区
  • 微信小程序可以做网站用网络优化大师手机版
  • wordpress 旅游优化法治化营商环境
  • 建立网站请示搜索推广是什么意思
  • 苏州网站开发建设方法百度地图排名可以优化吗
  • 西安市建设协会网站今日头条十大热点
  • 网站商城系统设计广州网页seo排名
  • 郴州市地图全图廊坊优化外包
  • 毕业设计做网站起个名字邯郸网站seo
  • php做网站特效搜狗seo优化
  • 小程序加盟平台seo网站首页推广
  • 长春疫情第二波最新消息春哥seo博客
  • 产品目录网站模板文大侠seo博客
  • 如何购买域名建网站客服外包平台
  • 七牛云做网站成都网络营销推广公司
  • 广东智能网站建设哪家有上海小红书seo
  • 内部网站建设教程百度 seo 工具
  • wordpress屏蔽连接百中搜优化软件
  • 做网站一台电脑可以吗百度权重排名查询
  • 帮人做网站在徐州被敲诈五万外包推广服务
  • 武汉有做夺宝网站的吗竞价服务托管公司
  • 时尚女装网站设计小程序怎么开发
  • 对外网站ipv6建设方案模板nba新闻最新消息
  • 好的外贸网站特点网站网址查询工具
  • 商城网站建设 上海可以推广的软件有哪些
  • 沙坪坝集团网站建设seo服务外包客服
  • 绵阳集团网站建设百度广告联盟网站
  • server 2012 iis 添加网站seo指导
  • 产品设计ppt案例百度推广关键词优化
  • 微网站的建设模板有哪些内容关键词优化报价怎么样