LWN: glibc里的系统调用封装函数

glibc 知:系统调用 文章目录系统调用包装器汇编系统调用系统调用 系统调用包装器 wiki主页:https://sourceware.org/glibc/wiki/SyscallWrappers glibc 使用三种类型的操作系统内核系统调用包装器:汇编、宏和定制。 说明:本文所使用的代码为glibc的master分支代码,版本>2.33。 汇编系统调用 glibc 中的简单内核系统调用从名称列表转换为汇编包装器,然后进行编译。 在构建目录中反汇编socket系统调用,将看到syscall-template.S包装器: 阅读详情
640
点击上方蓝色“Linux News搬运工”关注我们~

System-call wrappers for glibc

By Jonathan Corbet


LPC

glibc,又名GNU C Library,过去长久以来大家对它的印象都是不愿意为Linux新加的系统调用增加wrapper(封装函数)。因此,其实有很多系统调用多年来一直都没有得到glibc的支持。不过情况在转变。2019 Linux Plumbers Conference会议的Toolchain microconference上,Maciej Rozycki介绍了一下glibc关于system-call wrapper的最新观点,不过也又一次提醒大家,要加一个新的系统调用,会有非常多的工作要做。

Rozycki和Dmitry Levin共同主持了这个环节,不过他并不是负责这部分工作的人,只是代真正的负责人Florian Weimer来做这个介绍,因为Weimer没能赶来参加这个会议。

背景信息:user space运行的应用程序并不是直接调用进入kernel的,而是调用一个wrapper函数,由wrapper函数来决定调用哪个系统调用。通常wrapper函数只是把参数排列好,做些准备,然后就trap进kernel mode。某些情况下,wrapper提供的接口可能跟kernel提供的差异非常大。

其实也并不是一定要提供一个专门的wrapper函数的,application总是可以通过直接调用syscall()来调用任何系统调用的。不过,Rozycki认为还是尽量需要让application避免使用syscall(),例如syscall()不会检查传入参数的类型。system-call number(系统调用编号)在每个体系架构上都不一样,并且不同体系架构的ABI可能也是有区别的。这些导致很难用syscall()调用来实现可移植性强的代码。此外,POSIX线程和线程取消功能也会导致一些问题。所以最好是能把application会用到的系统调用都封装到C库函数里去。

640

所以glibc项目的做法现在有了改变,此前它不愿意接受新的系统调用wrapper,现在愿意接受了。不过没法一下子把所有syscall都加进来,每个新加的syscall都会需要清理掉一些障碍,例如在glibc manual里写清楚文档,并且完成copyright-assignment文档,毕竟glibc是Free Software Foundation的项目。这里引起了大家的热烈讨论,关于syscall wrapper的copyright需求,是否在承认ABI的copyright?会场讨论下来居然没有结论。Rozycki提到最后一点障碍,就是缺少reviewer,这是其他自由软件项目的共同问题。

glibc项目采取的策略是尽量避免模拟系统调用。如果某个系统调用不可用,那么glibc就会返回ENOSYS结束。因为模拟出来的系统调用,很容易出现各种意外错误,所以只会用在一些不重要的场景下。glibc也要求wrapper的名字要跟体系架构无关,否则的话就会是维护者的噩梦了。可能的话,glibc开发者还希望能把某个syscall在所有体系结构的支持都在同一个release版本里面实现出来,否则会需要人为维护支持状态,很麻烦的。

glibc开发者也从以前的经验得出一个教训(kernel开发者也有同感):multiplexing system call的支持非常麻烦。这会导致参数类型的检测变得非常困难,尤其是要支持可变参数数量(有些函数做不同操作的时候接受不通参数)的话。出于这个原因,大家可以看到futex()或者bpf()这种系统调用很可能会被glibc实现成很多个独立wrapper,每种行为都有一个特制的wrapper。

还有一些ABI相关的规则。比如ssize_t或者size_t应该备用在所有buffer size的场合,无论kernel里面用的是什么类型。这样能够让这个参数的用途更明晰。flag不应该用long类型,因为32位架构系统上如何处理高32位是一个没有定论的行为。错误值应该利用errno来返回出来,除了POSIX线程调用是例外。glibc开发者还希望每个新加的系统调用能有一个单独的kernel UAPI头文件来放置相关的类型和常量,这样在include时就能只包含相关信息,而不会引入太多无关的声明。

Rozycki总结时提出,希望大家能更好的跟各个C函数库项目配合。例如,所有跟ABI改动相关的patch,都应该抄送C函数库相关开发者。不过我倒是发现有时候C函数库开发者对kernel社区提出的要求跟这个很不一样,今后应该如何避免呢?听众中有个建议是应该有更多glibc开发者加入linux-api mailing list,还有个建议是所有改动都加上Florian :)

结束之前,Christian Brauner总结指出,此前要给glibc加入新改动是很麻烦的,不过最近几年已经有了不少变化。哪怕是不起眼的gettid()系统调用,在经过了长期激烈的争论之后,也已经合入了,很多人都表示很惊奇。glibc社区现在跟kernel社区互动更加频繁,希望这个变化能一直保持下去,并且kernel社区也能投桃报李。

[Your editor thanks the Linux Foundation, LWN's travel sponsor, for supporting his travel to this event.]

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

glibc源码分析之系统调用(一) 在编写本文时,glibc的最新版本是glibc-2.26。本文所有描述都是基于glibc-2.26。 系统调用 系统调用是程序员接触到的最底层的构建程序的组件。它们由内核实现,提供给程序调用。用户按照其调用规则可以实现调用。 glibc封装方式 glibc使用了两种方式来封装系统调用。一种是由脚本生成。一种是.c文件。 使用.c文件封装系统调用,是因为封装过程比较复杂,除了按系统调用的调 阅读详情

相关推荐

glibc库与系统调用

Linux系统中自带的函数glibc提供,glibc是GNU发布的libc库,是标准C的gnu实现,基于GPL的。b、标准C函数,其中某些比如fopen、fread函数,是对open、read函数的进一步封装(增添了buffer缓冲区,减少了进入内核的次数),也会触发系统调用,兼容适用于linux,window系统。前言:之前知道在Linux系统中,软件要通过系统调用接口才能进入内核,比如软件使用read函数要读取硬件设备数据时,要通过系统调用进入内核,调用内核的驱动程序,才能访问硬件。

qq_47258284的博客 624

linux程序启动时glibc的调用流程

ELF 文件头的 e_entry 项指明了入口地址,可以通过 objdump -f 命令查看 ELF 文件头信息,一般来说,入口地址的就是代码段 _start 符号的起始地址,在 _start 中调用了 libc 中的 __libc_start_main(),该函数的大致流程是: 1)判断是否是静态链接库,如果是,则调用 _dl_start_user() ,否则调用 __libc_init_first(); 2)调用 __libc_csu_init(); 3)调用 main(); 4)调用 __GI

choumin的专栏 1650

系统调用封装例程

 原文 http://blog.chinaunix.net/uid-27033491-id-3249801.html 1,什么是封装例程?         系统调用内核实现的,内核向用户态提供服务,内核向用户态提供系统调用的接口是一个软中断。 也就是int 0x80.如果用户直接调用系统调用会很麻烦。下面就举个直接调用系统调用的例子。用汇编实现的。 #

u011520133的专栏 1416

LWNglibc 支持临界区的重放功能!

关注了就能看到更多这么棒的文章哦~Restartable sequences in glibcBy Jonathan CorbetJanuary 31, 2022DeepL assiste...

Linux News搬运工 711

LWN:在GCC和glibc支持 CHERI 的 capability!

关注了就能看到更多这么棒的文章哦~Supporting CHERI capabilities in GCC and glibcBy Jonathan CorbetSeptember 26, 2022CauldronDeepL assisted translationhttps://lwn.net/Articles/909265/CHERI 架构来自于一个研究计划,希望能对普通的 CPU 架构进行扩...

Linux News搬运工 520

LWNglibc面创建进程可以不用担心race condition了!

关注了就能看到更多这么棒的文章哦~Race-free process creation in the GNU C LibraryBy Jonathan CorbetSeptember 1, 2023ChatGPT assisted translationhttps://lwn.net/Articles/943022/pidfd API 近年被添加到内核中,希望提供一个无竞争的方式(race-fre...

Linux News搬运工 954

LWN:6.4也许会支持用户空间影子堆栈了!

关注了就能看到更多这么棒的文章哦~User-space shadow stacks (maybe) for 6.4By Jonathan CorbetMarch 24, 2023DeepL assisted translationhttps://lwn.net/Articles/926649/x86 架构的影子堆栈(shadow stacks)已经支持很久了;LWN 在 2018 年首次报道了这项...

Linux News搬运工 1716

LWN:在GNU C库实现内存封印!

关注了就能看到更多这么棒的文章哦~Memory sealing for the GNU C LibraryBy Jonathan CorbetJune 12, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/978010/mseal()系统调用允许进程阻止其地址空间未来进行任何更改(因此被称为“密封 sealing”);它借鉴了...

Linux News搬运工 1732

linux 系统调用返回 1,linux – Assembly中系统调用的返回值是什么...

另见this excellent LWN article about system calls,它假定为C知识.C是Unix系统编程的语言,所以所有文档都是用C语言编写的.然后是文档,说明任何给定平台上C接口和asm之间的细微差别,通常在手册页的Notes部分.sys_read表示原始系统调用(与libc包装函数相对). read系统调用内核实现是一个名为sys_read()的内核函数.你不能用...

weixin_34394074的博客 628

LWN:GNU C 库 2.39 版本!

关注了就能看到更多这么棒的文章哦~GNU C Library version 2.39By Daroc AldenFebruary 6, 2024Gemini translationhttps://lwn.net/Articles/960309/GNU C 库 (glibc)发布了 2.39 版,1 月 31 日,其中包含了些新特性。值得一提的重要内容包括用于孵化(spawning)子进程的新函...

Linux News搬运工 718

LWN:让GNU C库的可调参数更安全!

关注了就能看到更多这么棒的文章哦~Toward safer GNU C Library tunable handlingBy Jonathan CorbetOctober 19, 2023ChatGPT translationhttps://lwn.net/Articles/947736/在讨论GNU C库(glibc)提供的接口时,自然会考虑到POSIX规范所对应的这些编程接口(programm...

Linux News搬运工 875

LWN: 修复getrandom()

点击上方蓝色“Linux News搬运工”关注我们~Fixing getrandom()ByJake Edge内核5.3版本面有人报出一个启动过程中死机问题,最终演化...

Linux News搬运工 2625

LWN:futex robust list 的 API 变更

他提到的另一个细节是,在执行操作(获取或释放锁)期间,但在链表更新之前,futex 可以被放入列表头的一个“待处理 (pending)”字段中,以便在此时发生崩溃时仍能进行清理。但正如 André Almeida 在东京举行的 2025 年 Linux Plumbers Conference (LPC) 的 “Gaming on Linux” 微型会议 (microconference) 会话 (session) 中所描述的那样,该 API 存在许多不同的问题。他说,出于几个原因,需要一个新的 API。

Linux News搬运工 78

c语言编程基础------0.4GNU C 函数库(glibc

这篇文章主要来自维基百科 GNU C函式庫 (重定向自Glibc) GNU C函式庫 初始版本 1987年[1] 穩定版本 2.20[2](2014年9月7日,4個月前)[±] 開發狀態 活跃 操作系统 跨平台 类型 运行时库 许可协议 LGPL 網站 http://w

Allen.Yao的专栏 2727

LWN:ELF hash table的ABI!

关注了就能看到更多这么棒的文章哦~The ABI status of ELF hash tablesBy Jonathan CorbetAugust 19, 2022DeepL assisted translationhttps://lwn.net/Articles/904892/确实有一些项目比其他项目会更关注 ABI 的兼容性;GNU C Library(glibc)这个项目在投入了大量精力来...

Linux News搬运工 479

LWN: GNU项目谁在管理?

Rethinking the governance of the GNU ProjectByJonathan CorbetOctober 24, 2019本文译自:ht...

Linux News搬运工 399

LWN:使用可重启序列来改进C库的大规模应用场景下的性能!

关注了就能看到更多这么棒的文章哦~Improving C-library scalability with restartable sequencesBy Jonathan CorbetOctober 17, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946870/自 2018 年以来,Linux 内核就支持可重启序列(有时称为...

Linux News搬运工 1137

深入解析Linux IO调用链与性能优化

IO操作是Linux系统编程的核心基础,涉及从用户空间到内核的多层调用链。理解C标准库缓冲区、系统调用接口和内核页缓存的工作原理,对于优化IO密集型应用至关重要。通过分析文件流缓冲策略、VFS抽象层和块设备调度机制,开发者可以掌握减少系统调用开销、提升数据吞吐量的关键技术。在实际场景中,合理选择mmap内存映射、AIO异步IO或O_DIRECT直接IO等方案,能够显著提升数据库、大数据处理等应用的性能表现。本文结合Linux内核参数调优和SSD特别优化等实践技巧,为系统级软件开发提供全面的IO性能优化指南。

weixin_34111790的博客 449
上一篇: LWN: 修复getrandom()
下一篇: LWN: 监控kernel内部的ABI
LinuxNews搬运工
博客等级 码龄7年 419粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值