Articles of 系统调用

在Linux中克隆()系统调用

当我通过传递0作为stack_start调用克隆系统调用时会发生什么? 根据克隆的手册页,它应该返回-EINVAL ,但是当我这样做时,它显示SIGSEGV (11)错误。 clone(func,NULL,0,args); 应该返回-EINVAL,但它与SIGSEGV失败

挂在3.5内核上的sys_execve

我正在尝试在x86_32的Linux内核v3.5中挂接sys_execve系统调用。 我只需将sys_call_table入口地址更改为我的钩子函数 asmlinkage long (*real_execve)( const char __user*, const char __user* const __user*, const char __user* const __user* ); … asmlinkage long hook_execve( const char __user* filename, const char __user* const __user* argv, const char __user* const __user* envp ) { printk( "Called execve hook\n" ); return real_execve( filename, argv, envp ); } … real_execve […]

计数程序的系统调用,并用strace检查结果的有效性

我正在使用ptrace来计算程序的系统调用。 问题是给定一个程序A,我的程序打印出系统调用的数量(打开,closures,读取,写入)。 我的程序和strace(带-c选项)的结果与程序A的参数是一样的,除了开放的系统调用。 我的程序打印15和strace打印3。 但是我猜测,strace也打印了一些其他的系统调用,这些可能总结为我的程序计算的15个开放系统调用。 我在查看ORIG_EAX / RAX寄存器时使用SYS_open来检查ptrace的结果。 strace打印的系统调用在这里。 更新: 我从terminal编译我的程序并从那里运行,结果与strace相同。 我正在开发netbeans。 为什么会发生?

文件/调用replace如LD_PRELOAD

是否有一些常用的function,如execve和打开一些电话的替代? 像调用LD_PRELOAD一样。 例: 我们有prog_A使用prog_B 。 几天前prog_B被更新,现在prog_A失败!( 通常的解决scheme是下一个: $: mv /usr/bin/prog_b /usr/bin/prog_B.new $: ln -s /usr/bin/prog_b.old /usr/bin/prog_b $: ./prog_a # now run 但有时这是不舒服和肮脏的解决scheme。 在一些故事中,正确的做法是: $: util "execve+open+stat:/usr/bin/prog_b=/usr/bin/prog_b.old" ./prog_a execve,open&stat是系统调用。 这个util的名字是什么?

在linux中,如何通过GNU ARM组件来完成系统调用

到目前为止,我只知道如何通过gnu arm assembly退出一个程序。 #exit(0) mov r0, #0 # return code mov r7, #1 # supervisor service number svc # call supervisor service 但是还有很多其他的系统调用,例如read,write,fork ……我想他们每个人都需要不同的服务号码,不同数量的寄存器作为参数,以及如何使用寄存器的不同规则。 我的问题是我可以从哪里获得关于为每个人编写程序集的信息。 我search谷歌,但信息是在这个话题较less。

添加一个新的系统调用到linux内核似乎不工作

我参加了一个操作系统课程,第一个分配是添加一些系统调用内核(Redhat,内核版本2.4)。 我添加了一些我认为需要添加的内容,但仍然无效。 我试图运行testing,我发现包装(我已经添加了一个下面的例子和它的sys_call代码)没有链接系统调用。 我知道这是因为我在系统调用中放置了一个printk,并且它们从不出现(而testing本身并没有给出我期待的结果)。 现在从我所了解的添加系统调用的开发过程是: 在说明中创build一个类似示例包装函数的包装器(让我们称之为服务“)。 将sys_aservice写入一个.c文件,该文件将转到linux-2.4.18-14custom文件夹中的许多文件之一。 它的文件取决于我想添加的服务的types(例如,如果它是一个文件系统服务,我把它放在FS)。 在/usr/src/linuxlinux-2.4.18-14custom/arch/i386/kernel/ entry.S表中添加系统调用条目 这是我一开始做的,但似乎不够(因为它似乎没有工作)。 我在网上查了一下(和阅读: 如何添加一个系统调用 ),我读了我需要添加/更改以下事情为了链接工作。 在系统调用的unistd.h中添加一行。 它会看起来像 定义__NR_aservice 添加aservice到生成文件。 所以,例如,如果我把aservice.c放在fs文件夹中,我会添加aservice.c到fs中的makefile。 创build一个aservice.h文件,它将会转到linux-2.4.18-14custom / include / linux(其中所有的h文件都会显示出来?)。 这个.h文件将包含一个名为“stub”的东西,它是由unistd.h中的一个macros自动生成的(这个.h文件必须包含),以便用户程序可以使用你的系统调用。 存根的声明如下所示:_syscallN(返回types,函数名称,arg1types,arg1名称…)“其中”N“是参数的数目。 在aservice.c的每个sys_X函数前面加上关键字“asmlinkage”(这需要包含linkage.h)。 所以函数声明如下所示:asmlinkage int sys_aservice(…){..}之后将.h文件包含在.c文件中。 这一切是正确的吗? 因为即使做了以下事情,似乎仍然没有调用系统调用。 这里是一个包装器和系统调用实现的例子: int stop_monitor(int pid){ long __res; __asm__ volatile ( "movl $244, %%eax;" << 244 is the entry in the sys_call table in entry.S […]

内核模块与sys_call交互

我是新的在stackoverflow,至less作为一个提问者。 首先我要为我的拼写正确而道歉,因为这不是我的母语,坦白说我已经忘了很久了。 我正在为Debian 6(内核2.6.39.4)编写一个内核模块,它与我所调用的系统进行交互。 他们都很容易,因为我正在学习的目的。 Syscall看起来像是在工作,并向用户输出一个function,允许插入到一个条目列表中,并在这两个函数中进行注册,一个是读取,另一个是写入。 该模块只是一个计数器,其读取和写入function是计数器值和查询当前计数器值的补充。 如果一切正常,写入function将向计数器添加一个,读取function将计数器返回给用户缓冲区。 问题发生在我使用makefile的时候,然后我收到这个消息(西class牙文的所有东西都被直译了) make -C /lib/modules/2.6.39.4.mikernel/build M=/home/dsouser/Escritorio/FuturaEntrega/ModuloUsaKifs modules make[1]: acess to the directory `/usr/src/linux-headers-2.6.39.4.mikernel' Building modules, stage 2. MODPOST 1 modules WARNING: "create_kifs_entry" [/home/dsouser/Escritorio/FuturaEntrega/ModuloUsaKifs/ModuloUsaKifs.ko] undefined! WARNING: "remove_kifs_entry" [/home/dsouser/Escritorio/FuturaEntrega/ModuloUsaKifs/ModuloUsaKifs.ko] undefined! make[1]: get out of the directory `/usr/src/linux-headers-2.6.39.4.mikernel' 而我不知道为什么不支持创build和删除function。 (包括.h和.c,修改了日程安排,添加到系统调用表,内核编译,安装,并用程序testing),我只是certificate了“sys_kifs”系统调用,但不是.h函数。 这是我使用的makefile。 obj-m = ModuloUsaKifs.o all : make -C /lib/modules/$(shell uname -r)/build […]

Syscalls for x86-64 Linux NASM(YASM)的详细说明

我find了x86-64模式(带参数)的系统调用列表: http : //filippo.io/linux-syscall-table/但是我在哪里可以得到这个系统调用的详细描述? 例如下面的例子中,除了0102o(rw,create)之外,哪些标志可以用于'open'系统调用,在其他情况下:只读,只写等。 SECTION .data message: db 'Hello, world!',0x0a length: equ $-message fname db "result" fd dq 0 SECTION .text global _start _start: mov rax, 2 ; 'open' syscall mov rdi, fname ; file name mov rsi, 0102o ; read and write mode, create if not mov rdx, 0666o ; permissions set syscall […]

find_task_by_pid()的替代方法

我需要访问我的系统调用中给定的PID任务。 显然,函数find_task_by_pid()是在较早版本的Linux内核中为此目的服务的。 它似乎只有functionsearch任务与新的内核(如3.13)可用的pid是find_task_by_vpid()。 对于给定的pid,调用此函数是否会返回与前一个函数相同的任务? (虚拟(本地)PID是什么意思?)如果没有,是否有相当于find_task_by_id()的函数?

使用自定义系统调用编译Linux内核模块时出错

我会一步一步的引导你 首先我编辑我的Linux内核目录中的3个文件 打开LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl并添加我正在执行的自定义调用 – 使用适当的格式 在这里声明它们: LINUX_DIRECTORY/include/linux/syscalls.h – 使用适当的格式: 打开LINUX_DIRECTORY/Makefile并将我正在存储新系统调用的目录添加到core-y行: core-y:= usr / my_system_call_directory / 这是我遇到的问题。 在LINUX_DIRECTORY/my_system_call_directory里面,我添加一个C文件,包含我自定义的系统调用定义和相应的Makefile 。 我把定义保留为空,因为在我的内核模块的C文件中,我声明了一个extern函数(我的自定义系统调用)并定义了一个单独的函数,它被设置为我的extern函数: extern long (*start_shuttle)(void); long my_start_shuttle(void) { // stuff here } int init_module(void) { // stuff here start_shuttle = my_start_shuttle; // more stuff } 重新编译内核后,我尝试make内核模块,并得到一个no definition for start_shuttle错误。 这是因为我把my_system_call_directory start_shuttle定义留空了吗? 它应该与我在内核模块中定义的my_start_shuttle完全匹配,还是应该添加一些特殊的东西? 我提前问了一些愚蠢的问题,因为我的机器花了这么长的时间来重新编译Linux,我不确定要改变什么。 谢谢