Tag: 系统调用

套接字读取和时间戳

当从Linux中的(非流)套接字读取时,我可以通过ioctl(sock, SIOCGSTAMP, &tv)获取最后收到的消息的(硬件生成的)时间戳。 但是,这会带来两个问题: 这是另一个系统调用(我每秒收到大约24000条消息,所以每个系统调用都要通知) 如果使用这种方法,我一次只能read()一条消息,然后是ioctl()来获取时间戳。 (如果我在read() call中读取多条消息,则以下ioctl仅生成最后一条消息的时间戳。) 我的问题是如何在尽可能少的系统调用中实现接收消息及其时间戳。 如果存在一个具有语义的系统调用,例如“读取待处理的消息及其时间戳”,那将是完美的。

以编程方式检查运行时是否存在Linux内核模块

我正在编写一个C守护进程,它依赖于两个内核模块的存在才能完成它的工作。 该程序不直接使用这些(或任何其他)模块。 它只需要它们存在。 因此,我想以编程方式检查这些模块是否已加载,以便在运行时警告用户。 在我开始执行诸如解析/proc/modules或lsmod输出之类的操作之前,某个实用程序函数是否已经存在? 类似于is_module_loaded(const char* name) ; 我很确定以前曾经问过这件事。 但是,我认为我错过了正确的搜索条件。

编写新的系统调用

我一直在尝试在raspberry的内核中编写一个新的系统调用(称为sys_defclose),但是在编译时我得到了这个错误: arch/arm/kernel/built-in.o: In function `__sys_trace_return’: :(.text+0xd50): undefined reference to `sys_defclose’ 我修改了以下文件: -include / linux / syscalls.h:我把我的系统调用的原型放在哪里 -arch / arm / include / asm / unistd.h:我把syscall表的新原始文件放在哪里: #define __NR_sys_defclose (__NR_SYSCALL_BASE+380) -arch / arm / kernel / calls.S:我把它放在哪里: CALL(sys_defclose) -i把sys_defclose的源码放在arch / arm / kernel中,我用新行修改了同一目录下的makefile obj-y +=sys_defclose.o 内核版本是raspberrypi的3.6。 谁能解释一下如何解决这个错误? 谢谢这是我的系统调用的实现 static struct task_struct* get_task_by_pid(pid_t pid) { return pid_task(find_pid_ns(pid, task_active_pid_ns(current)), […]

“阻止系统调用”是什么意思?

“阻止系统调用”是什么意思? 在我的操作系统课程中,我们正在研究multithreading编程。 我不确定当我在我的教科书中阅读时它是什么意思“它可以允许另一个线程在线程进行阻塞系统调用时运行”

在Linux内核源代码中实现系统调用/陷阱

我目前正在学习操作系统使用陷阱来促进Linux内核中的系统调用。 我在traps.c中找到了陷阱表,并在entry.S中实现了许多陷阱。 但是,我被指示在Linux内核中找到两个系统调用的实现,它使用陷阱来实现系统调用。 虽然我可以找到陷阱本身的定义,但我不确定内核中的其中一个陷阱的“调用”是什么样的。 因此,我正在努力寻找这种行为的一个例子。 在有人问之前,是的,这是家庭作业。 作为一个注释,我正在使用Github浏览内核源代码,因为kernel.org已关闭: https : //github.com/torvalds/linux/

如何获取Linux系统调用列表以及它们自动执行的args数量?

我为radare2调试器编写了一个Linux系统调用映射。 这意味着为系统调用名称名称及其所需的参数数量提供一个巨大的静态数组映射系统调用号。 这对于OpenBSD来说很容易,因为系统调用号在sys / syscall.h中定义,并且在上面的注释中每个都是args的数量。 只需要编写一个脚本来解析它并丢弃数组的C代码。 然而,在Linux上,我们没有这种奢侈品。 很容易从内核头文件中获取系统调用号,但是如何获取args的数量呢? 我唯一的想法是: 1)手动输入。 对于每个拱门(它们在linux中的拱门之间变化)。 所有300多件该死的东西。 没门! 2)解析手册页。 3)编写一个脚本,尝试用0,1,2 … args调用每个系统调用,直到程序构建。 不适用于varargs,但系统调用支持吗? 一定有更好的方法。 请帮忙!

C printf%d带前导零的错误值?

C函数printf似乎打印不同的值,具体取决于是否存在前导零。 我试图确定Linux’open’系统调用中mode参数的数值。 printf(“mode:%d\n”,S_IRWXU); printf(“mode:%d\n”,00700); 两个人都给了我448,而 printf(“mode:%d\n”,700); 给我700,正如我所期望的那样。 这里发生了什么? 我正在使用gcc(Ubuntu 5.4.0-6ubuntu1~16.04.5)5.4.0 20160609

使用system命令传递参数

我有一个可执行程序,可以运行在网络中的几个PC中。 首先它获得主机名(pc-001 .. pc-013等)。 然后我需要根据其主机名在偶数PC和(server2)上安装一个网络驱动器(server1)。 我的问题是我使用系统调用来运行dos命令’net use’ system (“net use x: \\\\server1\\shares /user:username pass”); 如何将变量传递给用户名? username是我知道其值的主机名,所有计算机的pass都相同。

xv6添加一个计算系统调用的系统调用

编辑: 得到它了 这是我做的: 在syscall.c中: extern int numSysCalls; 在sysproc.c中: int numSysCalls = -1; 好的,所以我正在努力实现一个简单的系统调用,它返回系统调用的次数。 看起来很简单,但我收到一个我不明白的错误… 基本上,这就是我所做的:在syscall.c中有一个名为syscall()的函数,用于检查它是否是一个系统调用。 我基本上已经声明了一个变量,并且每次调用此函数时都会递增它。 syscall.c中的Var声明: 18: int16_t numSysCalls = -1; //global Syscall()函数: 115: void syscall(void){ 116: numSysCalls++; … 我得到的错误: kernel/syscall.c:116: error: ‘numSysCalls’ undeclared (first use in this function) kernel/syscall.c:116: error: (Each undeclared identifier is reported only once kernel/syscall.c:116: error: for each function it […]

使用ptrace进行系统调用跟踪

我编写了一个程序来列出命令执行的所有系统调用(比如/ bin / ls)。 现在我要做的是找到所有系统调用参数,环境变量,可以传递给它的命令行参数 示例:如果我打开文件。 系统调用sys_access会打开文件吗? 但是如何获得这些价值呢? 想要打开,读取,写入,关闭等系统调用。 根据我的研究,这些必须在寄存器中(ebx – edx)如果是这样,这些寄存器值表示什么? 我有这个链接 。 但我真的无法从那里得到太多。 此外,任何进一步的参考将是非常有帮助的。