在linux文件夹

时间:2017-11-15 05:16:45

标签: c linux kernel

我已下载内核,内核位于名为Linux-2.6.32.28的文件夹中,我可以在其中找到/Kernel/Kthread.c 我找到了Kthread.c但是在Linux-2.6.32.28中找不到pthread.c 我在Linux-3.13 / Kernel和Linux-4.7.2 / Kernel

中找到了Kthread.c

找到pthread.c在我安装Ubuntu时出现的Computer / usr文件夹中找到文件pthread.c,但在下载的文件夹Linux-2.6.32.28,Linux-3.13,Linux-4.7.2中找不到pthread.c

更多:有两组函数调用。 1.系统调用2.图书馆电话。

对于要执行任何任务的计算机,它必须使用硬件资源。那么,库调用与系统调用有何不同?

系统调用总是使用内核,这意味着硬件。 库调用意味着不使用内核或硬件?

我知道库调用有时可能会解析为系统调用。

我想知道的是,如果每组函数调用都使用硬件,那么与库调用相比,系统调用将在多大程度上使用硬件资源,反之亦然。

函数调用是系统还是库,至少必须使用像RAM这样的硬件资源。正确?

3 个答案:

答案 0 :(得分:3)

先阅读pthreads(7)。它解释了pthreads在C standard library中实现为nptl(7)

C标准库是Linux系统的基石,您可能有几种变体;但是,大多数Linux发行版只有一个libc,通常是GNU glibc,其中包含NPTL。您可以使用其他C标准库(例如musl-libcdietlibc)。小心,您可以在系统中共存多个C标准库。

C标准库(以及每个user-space程序)正在使用system calls与内核进行交互。它们列在syscalls(2)中。 BTW上的大多数C标准库实现都是free software,因此如果您愿意,可以学习(甚至改进)他们的源代码。您经常在C标准库中通过小包装器C函数(例如write(2))使用系统调用,甚至更经常通过C提供的某些更高级函数(例如fprintf(3))标准库。

使用低级别的东西(如clone(2)futex(7)以及一些汇编代码实现Pthread(在glibc的NPTL层中)。但是你通常不会直接使用这些,除非你实现了一个线程库(如NPTL)。

大多数程序都使用libc并将其与crt0连接)作为共享库,在我的Debian / Sid / x86-64上为/lib/x86_64-linux-gnu/libc.so.6。但是,您可能(但通常不会)通过某些汇编代码直接调用系统调用(例如,使用SYSCALLSYSENTER机器指令)。另请参阅this

编辑问题也要求

  

我想知道的是,如果每组函数调用都使用硬件,那么系统调用将使用硬件资源的程度

请阅读有关operating systems的更多信息。因此,请仔细阅读Operating Systems: Three Easy pieces(可免费下载的教科书)并阅读Instruction Set ArchitectureComputer Architecture。研究其中几个,例如x86-64RISC-V(或ARMPowerPC等......)。阅读CPU modesvirtual memory

您将发现操作系统管理物理资源(包括处理器的RAM和cores)。每个process都有自己的virtual address space。所以从用户空间的角度来看,一个进程不使用直接硬件(例如它在虚拟地址空间运行,而不是在RAM中运行),它运行在由系统调用和ISA(virtual machine机器指令)定义的某些kernel(由操作系统unpriviledged提供)中。

  

函数调用是系统还是库,至少必须使用像RAM这样的硬件资源。正确?

错误,从用户空间的角度来看。所有硬件资源(根据定义)由操作系统管理(通过系统调用提供abstractions)。普通应用程序executable程序使用抽象和软件资源(files,进程,file descriptorssocketsmemory mappings,虚拟地址空间等。 。)由操作系统提供。

(因此需要几本书才能真正回答你的问题;我提供了一些参考资料,请关注它们并阅读更多内容;我们无法在此解释所有内容)

答案 1 :(得分:2)

关于第二组问题:计算机所做的一切最终都是由硬件完成的。但是我们可以在计算机中的不同之间做出一些区分,并且可以用不同的方式对它们进行不同的程序交互。

现代计算机可以分为三个主要部分:中央处理单元(CPU),主存储器(随机存取存储器,RAM)和外围设备"例如磁盘,网络收发器,显示器,图形卡,键盘,鼠标等.CPU和RAM可以自行完成而不涉及任何外围设备的事物被称为计算。涉及至少一个外设的任何操作都称为输入/输出(I / O)。所有程序都执行这两个程序,但有些程序主要执行计算,而其他程序主要执行I / O.

现代操作系统也分为两个主要组件:内核,这是一个独立的程序,具有其他程序没有的特殊功能(例如与之通信的能力)外围设备和控制RAM分配的能力),并负责监督所有其他程序的执行;以及用户空间,这是一组没有特殊能力的无限制程序。

用户空间程序可以自己进行计算,但是为了进行I / O,它们必须要求内核为它们执行此操作。 系统调用是从用户空间程序到内核的请求。许多系统调用是执行I / O的请求,但也可以请求内核执行其他操作,例如提供常规信息,在程序之间设置通信通道,分配RAM等。 library 是用户空间程序的一个组件。它本质上是一系列"功能"别人为你写的,你可以像使用自己编写的那样使用它。有许多图书馆,其中大多数都不做任何与众不同的事情。例如,zlib是一个库(提供压缩和解压缩数据的函数)。

然而,&#34; C库&#34;是特殊的,因为(在所有现代操作系统上,除了 Windows)它负责直接与内核交互。几乎所有的程序,几乎所有的程序库,都不会自己进行系统调用;他们会要求C库为他们做这件事。因此,尝试判断某个特定的C库函数是否自己完成所有工作,或者它是否包含&#34;它往往会让人感到困惑。一个或多个系统调用。特别是pthreads函数往往是两者的复杂纠结。如果您想了解操作系统如何在较低级别组合在一起,我建议您从更简单的开始,例如stdio.h&#34;缓冲I / O&#34;例程(fopenfclosefreadfwriteputs等)最终调用unistd.h / fcntl.h&# 34;原始I / O&#34;例程(openclosereadwrite等)以及后一组函数如何只是包围系统调用。< / p>

(将系统调用包装到C编程语言的运行时库中的任务是一个历史性事故,如果我们要从头开始,我们可能不会再这样做。)

答案 2 :(得分:-1)

pthread是POSIX线程。它是一个帮助应用程序在OS中创建线程的库。内核源代码中的Kthread用于linux中的内核线程。

POSIX是IEEE定义的标准,用于维护不同操作系统之间的兼容性。

因此在Linux内核源代码中看不到pthread源代码。

您可以参考此链接获取pthread源代码http://www.gnu.org/software/hurd/libpthread.html