标签: system-calls

如何找到 Linux 内核系统调用的实现?

我试图mkdir通过查看内核源代码来了解一个函数是如何工作的。这是尝试了解内核内部结构并在各种功能之间导航。我知道mkdirsys/stat.h. 我找到了原型:

/* Create a new directory named PATH, with permission bits MODE.  */
extern int mkdir (__const char *__path, __mode_t __mode)
     __THROW __nonnull ((1));
Run Code Online (Sandbox Code Playgroud)

现在我需要看看这个函数是在哪个 C 文件中实现的。从源目录,我试过

ack "int mkdir"
Run Code Online (Sandbox Code Playgroud)

其中显示

security/inode.c
103:static int mkdir(struct inode *dir, struct dentry *dentry, int mode)

tools/perf/util/util.c
4:int mkdir_p(char *path, mode_t mode)

tools/perf/util/util.h
259:int mkdir_p(char *path, mode_t mode);
Run Code Online (Sandbox Code Playgroud)

但它们中没有一个与 中的定义匹配sys/stat.h

问题

  1. 哪个文件有mkdir实现?
  2. 有了上面这样的函数定义,我怎么能找出哪个文件有实现呢?内核在定义和实现方法时是否遵循任何模式?

注意:我正在使用内核2.6.36-rc1

source system-calls linux-kernel

376
推荐指数
7
解决办法
5万
查看次数

如何从命令行查找应用程序的路径?

例如,我已经git安装在我的系统上。但我不记得我在哪里安装它,那么哪个命令适合找出这个?

terminal system-calls

147
推荐指数
5
解决办法
51万
查看次数

linux GUI 如何在最低级别工作?

我基本上是想弄清楚如何从头开始制作一个 GUI,除了 linux 内核和 C 编程之外什么都没有。

我不打算从头开始创建 GUI 桌面环境,但我想创建一些桌面应用程序,并且在我搜索知识的过程中,我能找到的所有信息都是关于 GUI API 和工具包的。我想知道,至少我对 Linux GUI 是如何制作的基本原理的理解,如何在不使用任何 API 或工具包的情况下制作 GUI 环境或 GUI 应用程序。

我想知道例如:

  1. 现有的 API 和工具包通过对内核的系统调用工作(内核负责在最低级别以像素或其他方式构建 GUI 图像)

  2. 这些工具包执行简单地将信息传递给屏幕驱动程序的系统调用(是否有发送所有屏幕驱动程序都遵守的信息的标准格式,或者 GUI API 是否需要能够根据特定的屏幕/驱动程序以多种格式输出此信息? ) 并且如果这大致正确,原始的 linux 内核是否通常只以 8 位字符的形式将信息发送到屏幕?

我真的很想了解 linux 内核之间发生了什么,以及我在屏幕上看到的内容(通过软件和硬件的控制/信息流,如果您知道,信息采用什么格式等)。我非常感谢详细的解释,我知道这可能很难解释得足够详细,但我认为这样的解释对于其他好奇和学习的人来说将是一个很好的资源。对于上下文,我是一名 3 年级的 Comp sci 学生,他最近开始在我的系统编程课程中使用 C 进行编程,并且我对 linux 和编程有中级(或者我会描述它)的理解。再次感谢所有帮助我的人!!!

linux gui hardware system-calls linux-kernel

51
推荐指数
3
解决办法
7145
查看次数

系统调用“tuxcall”做了什么?

在 中include/x86_64-linux-gnu/asm/unistd_64.h,我看到一个名为 的系统调用tuxcall

#define __NR_tuxcall 184
Run Code Online (Sandbox Code Playgroud)

man tuxcall除了说它是一个未实现的系统调用之外,没有什么关于它的。它做了什么?它从未实施过,还是在古代做过什么?

linux system-calls

49
推荐指数
2
解决办法
5712
查看次数

为什么 UNIX/POSIX 系统调用命名如此难以辨认?

使用诸如 and 之类的难以理解的系统调用名称timecreat不是getCurrentTimeSecsand的原因是什么?createFile or 之,也许更适合 Unixget_current_time_secscreate_file. 这让我想到下一点:为什么有人想要cfsetospeed没有驼峰式大小写或至少下划线之类的东西以使其可读?当然,调用会有更多字符,但我们都知道代码的可读性更重要,对吗?

system-calls history posix

43
推荐指数
4
解决办法
5263
查看次数

为什么 x86 和 x86_64 中的 Linux 系统调用号不同?

我知道系统调用接口是在低级别实现的,因此依赖于体系结构/平台,而不是“通用”代码。

然而,我无法清楚地看到为什么 Linux 32 位 x86 内核中的系统调用在类似架构 Linux 64 位 x86_64 中具有不保持相同的编号?这个决定背后的动机/原因是什么?

我的第一个猜测是后台原因是保持 32 位应用程序可在 x86_64 系统上运行,以便通过对系统调用号的合理偏移,系统将知道用户空间是 32 位还是 64 位分别。然而事实并非如此。至少在我看来,在 x86_64 中 read() 是系统调用号 0 不能与这种想法保持一致。

另一种猜测是更改系统调用号可能有安全/强化背景,我无法确认这一点。

由于不知道实现依赖于体系结构的代码部分的挑战,我仍然想知道如何更改系统调用号,当似乎没有必要时(因为即使是 16 位寄存器也会存储更多,而不是当前的 ~346 个数字来表示所有调用),将有助于实现任何事情,除了破坏兼容性(尽管通过库 libc 使用系统调用可以缓解它)。

linux system-calls

38
推荐指数
2
解决办法
5812
查看次数

捕获信号时中断系统调用

从阅读read()write()调用上的手册页来看,这些调用似乎会被信号中断,无论它们是否必须阻塞。

特别地,假设

  • 一个进程为某个信号建立一个处理程序。
  • 一个设备被打开(比如一个终端),O_NONBLOCK 没有设置(即在阻塞模式下运行)
  • 然后该进程进行read()系统调用以从设备读取,结果在内核空间中执行内核控制路径。
  • 当进程read()在内核空间中执行时,先前为其安装处理程序的信号被传递到该进程并调用其信号处理程序。

阅读SUSv3 'System Interfaces volume (XSH)' 中的手册页和相应部分,您会发现:

一世。如果 aread()在读取任何数据之前被信号中断(即它必须阻塞,因为没有数据可用),它返回 -1 并errno设置为 [EINTR]。

ii. 如果 aread()在成功读取一些数据后被信号中断(即可以立即开始服务请求),它返回读取的字节数。

问题 A): 我是否正确地假设在任何一种情况下(阻止/不阻止)信号的传递和处理对read()?

案例一。似乎可以理解,因为阻塞read()通常会将进程置于TASK_INTERRUPTIBLE状态,以便在传递信号时,内核将进程置于TASK_RUNNING状态。

但是,当read()不需要阻塞(情况 ii.)并且正在内核空间中处理请求时,我会认为信号的到达及其处理将是透明的,就像硬件的到达和正确处理一样中断会。特别是我会假设,在传递信号时,进程将被临时置于用户模式以执行其信号处理程序,它最终将从该处理程序返回以完成处理中断的read()(在内核空间中),以便read()运行其过程完成之后,进程返回到调用read()(在用户空间中)之后的点,结果读取所有可用字节。

但是二。似乎暗示read()被中断,因为数据立即可用,但它返回仅返回部分数据(而不是全部)。

这让我想到了我的第二个(也是最后一个)问题:

问题 B): 如果我在 A) 下的假设是正确的,为什么会read()被中断,即使它不需要阻塞,因为有数据可以立即满足请求?换句话说,为什么read()在执行信号处理程序后没有恢复,最终导致所有可用数据(毕竟可用)被返回?

kernel signals system-calls architecture

34
推荐指数
1
解决办法
3万
查看次数

getrusage 系统调用:什么是“最大驻留集大小”

man getrusage 2

ru_maxrss (since Linux 2.6.32)
              This is the maximum resident set size used (in kilobytes). For RUSAGE_CHILDREN, this is the resident set size of the largest
              child, not the maximum resident set size of the process tree.
Run Code Online (Sandbox Code Playgroud)

那么这个数字究竟是什么意思呢?

kernel memory system-calls

27
推荐指数
1
解决办法
2万
查看次数

叉炸弹上的叉()在哪里:(){ :|: & };:?

警告:在大多数 shell 中运行此命令将导致系统损坏,需要强制关闭才能修复

我了解递归函数:(){ :|: & };:及其作用。但是我不知道fork系统调用在哪里。我不确定,但我怀疑在管道中|

linux shell system-calls

27
推荐指数
2
解决办法
4956
查看次数

select系统调用的第一个参数的目的是什么?

man select

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);
Run Code Online (Sandbox Code Playgroud)

nfds 是三个集合中任何一个中编号最大的文件描述符,加 1。

的目的是什么nfds,当我们已经有了readfds,writefdsexceptfds,从中可以确定文件描述符?

system-calls file-descriptors

25
推荐指数
2
解决办法
6663
查看次数