首页 文章
  • 4 votes
     answers
     views

    如何根据Linux系统调用实现后台处理?

    如何在Linux系统调用方面实现后台处理(例如,在Bash中)? 我的问题的目的是我不明白为什么bash手册说 在子shell环境中调用异步命令, (如果我是正确的,"aynchronous commands"表示在后台运行命令),而通过使用 strace ,我发现父shell进程首先调用 clone() 来创建一个子shell,它是自身的副本,然后子shell调用 ex...
  • 10 votes
     answers
     views

    x86_64 Linux函数和系统调用之间的ABI差异

    x86_64 SysV ABI的函数调用约定定义了在 rcx 寄存器中传递的整数参数#4 . 另一方面,Linux内核系统调用ABI使用 r10 用于同样的目的 . 所有其他参数都在函数和系统调用的相同寄存器中传递 . 这会导致一些奇怪的事情 . 例如,检查x32平台的glibc中 mmap 的实现(存在相同的差异): 00432ce0 <__mmap>: 432ce0: ...
  • 2 votes
     answers
     views

    传递给STAT系统调用的结构的精确定义是什么?

    在哪里可以找到 STAT 系列调用所期望的结构的精确定义? 请注意,我指的是在程序集中调用的原始系统调用,(x86_64上的系统调用号 4 , 5 和 6 ),而不是libc通常提供的包装器 . 手册页, stat(2) 以及我可以管理的内容挖出了linux和glibc源代码,给出了令人困惑和矛盾的结果(不同的结构字段排序,额外字段,填充) . 我确信我没有找到我应该去的地方,但我似乎无法找到我所...
  • 6 votes
     answers
     views

    在x86_64 Linux上定义的ioctl系统调用的用户空间包装器在哪里?

    我(出于好奇)一直想知道在x86_64 Linux上定义了ioctl系统调用的用户空间包装器 . 我的第一个想法是glibc - 在我的Fedora 24盒子上检查已安装版本上的暴露符号之后,我可以看到(除非我做错了)libc将ioctl符号暴露为'W'意味着它是一个弱符号默认实现 . misc / ioctl.c中的glibc源代码树中的默认实现似乎是一个存根,只是将errno设置为ENOS...
  • 29 votes
     answers
     views

    如果在64位代码中使用32位int 0x80 Linux ABI会发生什么?

    Linux上的 int 0x80 总是调用32位ABI,无论它调用什么模式: ebx 中的args, ecx ,...和来自 /usr/include/asm/unistd_32.h 的系统调用号 . (或者在没有 CONFIG_IA32_EMULATION 的情况下编译的64位内核崩溃) . 64-bit code should use syscall ,电话号码来自 /usr/include...
  • 0 votes
     answers
     views

    在C中逐行读取文件(不使用fgets)

    我有一个包含3行的文件,我想读取这个文件并将每行保存为一个单独的字符串 . 这是我试图做的,它确实保存了第一行,但它通过保存第一行和第二行来覆盖它而且我无法理解如何将每行保存为单独的字符串,并且我也得到一个错误 - > 堆栈粉碎检测:/ home /ubuntu / workspace / ex12.c.o终止中止 #include <stdio.h> #include &...
  • 5 votes
     answers
     views

    NASM猜数字游戏错了

    我决定创建一个使用Linux系统调用的简单猜测数字游戏,以及一些C函数来提供更简单的界面 . 当我将int转换为字符串并在屏幕上打印正确答案时,我似乎遇到了分段错误 . 这是输出: Enter A Number One Through Ten:" : 3 Response did not match! The Answer Is:Segmentation fault 这是C代码: /...
  • 1 votes
     answers
     views

    当linux系统调用被阻止时,如何以及何时设置-EINTR

    如果系统调用被阻止,则进程状态将设置为 TASK_INTERRUPTIBLE ,并且该进程将从运行队列中删除 . 当信号传递到该进程时,内核将信号添加到待处理信号列表并将进程状态设置为 TASK_RUNNING . 当下次调用 schedule() 时,执行此过程 . 我不明白的是,究竟阻塞的系统调用如何将 -EINTR 返回给用户空间?任何被阻止的系统调用都可以返回 -EINTR ?设置 -E...
  • 13 votes
     answers
     views

    SYSCALL / SYSRET指令如何跨x86 CPU执行?

    SYSCALL 和 SYSRET (以及它们仅32位的英特尔对应物 SYSENTER 和 SYSEXIT )通常被描述为在x86处理器中进入和退出管理员模式的“通常更快”的方式,而不是调用门或软件中断,但这个声明的确切数字仍然很大程度上没有证件 . 特别是,我能找到的所有英特尔或AMD优化指南都没有提及这些指令 . 所以: 最近的英特尔64微架构 SYSCALL 和 SYSRET 需要多少个周期...
  • 1 votes
     answers
     views

    如何仅使用系统调用在C中组合ppm图像文件?

    我在互联网上发现了一些类似的问题,但没有系统调用 . 我正在我的系统编程课上练习 . 它要求您仅使用系统调用以二进制形式( P6 ,而不是 P3 )组合ppm图像文件 . 输入来自命令行 . 第一个输入是较大的图像文件,第二个输入是较小的图像文件,在输入之后,文件被组合并写入第三个文件,您可以将其指定为第三个输入的名称 . 较小的文件将写入较大文件的右上角 . 因为我们假设我们主要使用的是 ope...
  • 1 votes
     answers
     views

    如何在Windows的x86程序集中编写系统调用? [重复]

    这个问题在这里已有答案: Windows system calls [duplicate] 1回答 我需要在针对Windows平台的x86汇编代码中进行系统调用(syscall) . 在Linux上,我会做类似于 int 0x80 的事情,但这在Windows上不起作用 . 在Windows上执行系统调用的代码应该是什么样的? (我使用AT&T语法并编写64位代码,如果重要,但对于Intel语...
  • 29 votes
     answers
     views

    如果在64位代码中使用32位int 0x80 Linux ABI会发生什么?

    Linux上的 int 0x80 总是调用32位ABI,无论它调用的是什么模式: ebx 中的args, ecx ,...和来自 /usr/include/asm/unistd_32.h 的系统调用号 . (或者在没有 CONFIG_IA32_EMULATION 的情况下编译的64位内核崩溃) . 64-bit code should use syscall ,电话号码来自 /usr/inclu...
  • 0 votes
     answers
     views

    具有跳转和系统调用读取功能的汇编代码(x86)

    我想请求任何人帮助理解汇编代码 . 我的问题是:标签L2之后的代码很重要,它调用子程序功能 . 但在我看来,程序永远不会到达标签L2之后的代码,因为根据我的说法,syscall读取(在L1之后)总是读取0并且在将它比较为1.但零从不等于1,所以在我看来程序永远不会跳到L2 . 我想我一定是错的 . 我真的很感激任何帮助 jmp L1 L2: movzbl -0x11(%ebp), %eax mov...
  • 2 votes
     answers
     views

    系统调用指令的目的是什么?

    或者,换句话说: syscall 和 int <kernel-interrupt-number> 之间有什么区别? 我能想到的唯一明显的原因是中断号在操作系统中不同,并且拥有一个新的,唯一的指令可以提供更高的一致性 . 但是,系统调用数字和参数在操作系统中仍然不同,因此一致性的增益非常低 . 可能拦截中断需要更多的内核工作? (因此使用 syscall 可获得性能提升)
  • 0 votes
     answers
     views

    检查文件是否是c文件并进行编译

    我想以递归方式运行目录及其文件和子目录 . 假设该目录可以包含任何文件王(c,txt,python ....),检查当前文件是否为c文件,如果是,则进行编译 . 这是我到目前为止: #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #i...
  • 0 votes
     answers
     views

    仅使用read()和open()系统调用获取文件/目录的路径,并遍历目录和子目录中的所有文件

    我正在尝试给我的程序一个目录路径并循环遍历此目录中的所有文件以及子目录中的文件以仅查找c文件并编译它们 . 我不想使用readdir \ opendir这样做 . 我能够使用以下命令打开目录: (fd = open(".", O_DIRECTORY | O_RDONLY)) 现在为了访问目录及其子目录中的文件,我想使用read()系统调用 . 但是我怎么能这样做呢?当我想读取...
  • 1 votes
     answers
     views

    实现系统调用:无法从用户接收参数值

    我正在Linux中实现系统调用 . 我有一个问题:无法从用户接收参数值 . 我的内核版本4.19.5 这是用户代码: int main(){ char *name = (char*)malloc(sizeof(char)*32); int fd1; char buf[128]; fd1 = open("/usr/src/linux-4.19.5/abc&...
  • 2 votes
     answers
     views

    JVM JIT是否生成系统调用指令?

    我想知道Java代码如何进行系统调用,JIT编译器是直接生成系统调用指令,还是只调用libc函数(或其他基本库函数)?
  • 0 votes
     answers
     views

    在我的c shell上管道后,程序直接终止

    我们正在尝试使用系统调用在C中实现我们的自定义shell . 当我们尝试添加管道系统功能时,程序在打印管道操作的输出后直接终止 . 管道按原样运行 . 但通常我们的shell永远不会在enterin常规命令后终止 . 这是我们的管道代码: while(1){ if (childpid == 0) { dup2(pipefd[1], 1); close(pip...
  • 0 votes
     answers
     views

    msgrcv没有等待具有errno 22(EINVAL)的特定消息类型的消息

    我试图在标准C库中使用msgsnd和msgrcv系统调用,但没有达到预期/期望的性能 . 我的问题是,当我调用msgrcv时,它不会等待具有指定mtype(4)的消息 . 我首先发送一个mtype为1的消息 . 想法是另一个进程然后会收到此消息并发回一个mtype为4的确认消息 . 从documentation,我期望"if msgtyp is greater than zero, th...
  • 0 votes
     answers
     views

    为什么我无法使用msgrcv()访问消息队列中的消息文本?

    我已经构建了一个程序,允许我创建和删除消息队列以及发送和接收消息 . 除接收消息外,一切似乎都正常工作 . 当我收到结构时,我可以访问该类型(我一直用来表示“收件人”)并打印它,但是存储在结构的msg字段中的字符串将不会打印 . 在使用msgrcv()之后,printf()似乎成功访问了mbuf.type字段,但没有访问mbuf.msg . 我已经尝试过调试以找出问题所在,但到目前为止我还没有成功...
  • 0 votes
     answers
     views

    Open()系统调用目录和访问子目录中的文件

    我正在尝试打开一个目录并访问它的所有文件和子目录以及子目录文件等(递归) . 我知道我可以通过使用opendir调用来访问文件和子目录,但我想知道是否有办法通过使用open()系统调用(以及如何?),或者是否打开系统调用只是指文件? #include <stdio.h> #include <dirent.h> int main(void) { struct di...
  • 12 votes
     answers
     views

    sched_setaffinity()如何工作?

    我试图了解linux系统调用sched_setaffinity()的工作原理 . 这是我的问题here的后续内容 . 我有this guide,它解释了如何使用系统调用并且有一个非常整洁(工作!)的例子 . 所以我下载了Linux 2.6.27.19 kernel sources . 我对包含该系统调用的行进行了'grep',得到了91个结果 . 没有前途 . 最后,我试图了解内核如何为特定内核(...
  • 56 votes
     answers
     views

    Linux reboot()系统调用的幻数

    The Linux Programming Interface在第3章中有一个练习如下: 当使用特定于Linux的reboot()系统调用来重新引导系统时,必须将第二个参数magic2指定为一组幻数(例如,LINUX_REBOOT_MAGIC2)之一 . 这些数字有什么意义? (将它们转换为十六进制提供了线索 . ) 手册页告诉我们 magic2 可以是LINUX_REBOOT_MAGIC2(...
  • 0 votes
     answers
     views

    可以通过带有fsync(2)的OS中断写入(2)的调用

    我有一个循环write(2)与任意数量的数据EOL和fsync(2)逐行附加到文件 . 这个过程的崩溃是否会让我有一个文件,其中一半的write(2)调用数据被写入文件?我的理论是,如果操作系统偶尔会调用fsync,那么在调用期间可能会出现巧合,写入(2)将文件的一半写入,而没有结束新行 .
  • 1 votes
     answers
     views

    strace:如何确定系统调用是否已调用另一个系统调用?

    “strace是一个系统调用跟踪器,即一个调试工具,它打印出另一个进程/程序所做的所有系统调用的跟踪 . ”如果系统调用以递归方式工作或一个系统调用调用另一个系统调用,该怎么办?我怎样才能获得这些信息? 可能的解决方案 - 我们可以创建一个简单的变量缩进,我们在进入系统调用时递增,在退出时递减 . 现在只需在每次调用之前打印“缩进”空格数 . 所以我们可以得到这样的东西 - 05:31:09.44...
  • 5 votes
     answers
     views

    将参数传递给系统调用

    我做了一个没有参数的基本helloWorld系统调用示例,只是: int main() { syscall(__NR_helloWorld); return 0; } 但现在我想弄清楚如何将实际参数传递给系统调用(即 long ) . 我试过的格式是什么: int main() { long input = 1; long result = syscall(__NR_so...
  • 16 votes
     answers
     views

    如何从用户空间访问系统调用?

    我读了LKD1中的一些段落,我无法理解下面的内容: 从用户空间访问系统调用通常,C库提供对系统调用的支持 . 用户应用程序可以从标准头中提取函数原型并与C库链接以使用您的系统调用(或者库例程,而该例程又使用您的系统调用) . 但是,如果您刚刚编写了系统调用,那么glibc已经支持它是值得怀疑的!值得庆幸的是,Linux提供了一组用于包装对系统调用的访问的宏 . 它设置寄存器内容并发出陷阱指令 ....
  • 1 votes
     answers
     views

    系统调用实现

    我正在尝试扩展 my_time 的系统调用 . 我正在延长timekeeping.c . 但它给了我随机的时间 . struct timeval tv; // get the current time do_gettimeofday(&tv); current_time->tv_sec=tv.tv_sec; current_time->tv_nsec=tv.tv_usec*1...
  • 4 votes
     answers
     views

    系统调用实现

    如果用户应用程序进行系统调用,则会触发软件中断/异常 . 如何查看生成软件中断的源代码?

热门问题