Linux编程接口 在第3章中将进行如下练习:
当使用特定于Linux的reboot()系统调用来重新引导系统时,必须将第二个参数magic2指定为一组幻数(例如LINUX_REBOOT_MAGIC2)之一。这些数字的意义是什么?(将它们转换为十六进制提供了一个线索。)
手册页告诉我们magic2
可以是LINUX_REBOOT_MAGIC2(672274793),LINUX_REBOOT_MAGIC2A(85072278),LINUX_REBOOT_MAGIC2B(369367448)或LINUX_REBOOT_MAGIC2C(537993216)之一。我无法用十六进制解释它们的含义。我也查看了/usr/include/linux/reboot.h
,也没有给出任何有用的评论。
然后,我在内核的源代码中搜索sys_reboot
的定义。我发现的只是一个头文件中的声明。
因此,我的第一个问题是,这些数字的意义是什么?我的第二个问题是sys_reboot
的定义在哪里,以及如何找到它的?
编辑 :我在中找到了定义kernel/sys.c
。我只为rep
sys_reboot
,而忘记了magic编号的grep。我认为定义必须隐藏在一些宏技巧的后面,因此我查看了下面的System.map
文件/boot
,并在旁边找到了该文件ctrl_alt_del
。然后我为该符号摸索了一下,这使我找到了正确的文件。如果我是从源代码编译内核的,则可以尝试查找定义该符号的目标文件,然后从那里开始。
只是一个猜测,但这些数字看起来更有趣(十六进制):
672274793 = 0x28121969
85072278 = 0x05121996
369367448 = 0x16041998
537993216 = 0x20112000
开发人员或孩子的生日?
关于查找syscall实现,我做了一个git grep -n LINUX_REBOOT_MAGIC2
发现,并在kernel /
sys.c中找到了定义。我怀疑这个符号sys_reboot
是由小SYSCALL_DEFINE4(reboot, ...
企鹅产生的。
本章描述 Linux 内核中的系统调用概念。 系统调用概念简介 - 介绍 Linux 内核中的系统调用概念 Linux 内核如何处理系统调用 - 介绍 Linux 内核如何处理来自于用户空间应用的系统调用。 vsyscall and vDSO - 介绍 vsyscall 和 vDSO 概念。 Linux 内核如何运行程序 - 介绍一个程序的启动过程。 open 系统调用的实现 - 介绍 open
系统调用sendfile Sendfile是Linux实现的系统调用,可以通过避免文件在内核态和用户态的拷贝来优化文件传输的效率。 其中大名鼎鼎的分布式消息队列服务Kafka就使用sendfile来优化效率,具体用法可参见其官方文档。 优化策略 在普通进程中,要从磁盘拷贝数据到网络,其实是需要通过系统调用,进程也会反复在用户态和内核态切换,频繁的数据传输在此有效率问题。因此我们必须意识到Linux
系统调用 我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。 如果用户态进程想执行内核态的操作,只能通过系统调用了。Linux提供了超多系统调用函数,我们关注与进程相
11.3.1 默认的调用规范 通常, FreeBSD 的内核使用 C 语言的调用规范。 此外, 虽然我们使用 int 80h 来访问内核, 但是我们常常通过调用一个函数来执行 int 80h, 而不是直接访问。 这个规范是非常方便的, 比 Microsoft® 的 MS-DOS® 上使用的规范更加优越。 为什么呢? 因为 UNIX® 的规范允许任何语言所写的程序访问内核。 汇编语言也可以这样做,
问题内容: 我正在开发一个需要与Video4Linux抽象交互的应用程序。该应用程序使用mono框架以C#开发。 我面临的问题是我无法P /调用系统调用。或者,更准确地说,我可以P /调用它,但是它崩溃严重。 extern声明如下: 到目前为止,一切都很好。 使用的实际例程如下: 以上所有代码似乎都不错。该类用于按照标头规范计算I / O请求代码(基本上,它遵循处声明的宏)。 该参数是一个结构,声
我刚刚开始研究系统调用。我想知道当进行系统调用时是什么导致了开销。 例如,如果我们考虑getpid(),当系统调用getpid()时,我的猜测是,如果控件当前位于子进程中,则必须进行上下文切换才能进入父进程以获取pid。这会导致间接费用吗? 此外,当调用getpid()时,会有一些元数据跨用户空间边界传输,并进入和退出内核。那么,用户空间和内核之间的不断切换也会导致一些开销吗?