Tag: system calls

为什么printf显示unsigned int的负值?

可能重复: 带有负值的无符号长整数 我编写了一个内核模块,它可以中断任何系统调用,打印其当前的user_id和传递给系统调用函数的输入参数。 其中一个是sys_ioctl(),如下所示: asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd,unsigned long arg); 这意味着所有输入参数都是无符号的int数。 但是当我打印输入参数时,我得到以下输出: fd=21, cmd=-1072143871 and arg=3202983648 fd=21, cmd=-1072143871 and arg=3202983648 fd=21, cmd=-1072143871 and arg=3202983648 ———- 这是我的函数定义: asmlinkage long our_sys_ioctl(unsigned int fd , unsigned int cmd , unsigned long arg) { uid_t gtuid ; gtuid = getuid_call(); printk (“our_sys_ioctl —> uid = […]

LD_PRELOAD不能拦截系统调用,而只能拦截libcalls?

我的代码适用于malloc ,但不适用于mmap 。 代码如下: main.c中 #include #include int main(){ int * p = (int*) malloc(sizeof(int)); printf(“in main(): value p = %d\n”, *p); free(p); } preload.c #define _GNU_SOURCE #include #include #include #include void *(*orig_malloc)(size_t size); void *malloc(size_t size){ printf(” Hooked(preload)! malloc:size:%lu\n”, size); return orig_malloc(size); } void * (*orig_mmap)(void *start, size_t length, int prot, int flags, int […]

c和LD_PRELOAD。 拦截open和open64调用,但不是stat64

我做了一个小的共享库,试图拦截open,open64,stat和stat64 sys调用。 当我导出LD_PRELOAD并运行oracle的sqlplus时,我可以看到open和open64调用的痕迹,但没有stat和stat64调用的痕迹。 共享库是一个单独的c文件,其中包含sys调用的所有定义。 为什么有些系统调用被截获而其他系统没有被截获? 谢谢你的帮助。

如何使用Linux内核模块中的Linux系统调用

从Linux内核模块内部调用系统调用时遇到一些困难。 系统调用已经过测试,并且可以从标准的c用户空间程序中正常工作,但我似乎无法获得内核模块来编译和运行它们。 在我的用户程序中,我包含以下代码,系统调用有效: #include #define __NR_sys_mycall 343 extern long int _syscall(long int_sysno,…)__THROW; //and then a simple call is done as such long value = syscall(__NR_sys_mycall); printf(“The value is %ld\n”,value); 但是当我在我的Linux内核模块中尝试相同的事情时,我得到了一堆错误,或者说错误:隐式声明函数’syscall’(如果我不包括_syscall定义)或一长串关于语法的错误if我这样做…所以我的假设是我需要内核空间版本来调用系统调用。 我是对还是错? //My LKM code #include #include #define __NR_sys_mycall 343 static int start_init(void) { long value = syscall(__NR_sys_mycall); printk(“The value is %ld\n”,value); return 0; } static […]

从汇编调用交流function需要“asmlinkage”吗?

我正在编写一个将从汇编代码调用的C函数。 (具体来说,我想在linux内核的系统调用处理路径中做一些检查工作,所以我将在entry_32.S中调度系统调用之前调用c函数) 在定义我的c函数时,我对“asmlinkage”修饰符感到困惑。 我知道asmlinkage是告诉编译器参数将通过堆栈传递。 #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) 问题: (1)在定义将从汇编代码调用的函数时是否需要asmlinkage? (2)gcc中的默认调用约定是什么。 如果我在定义交流function时省略“asmlinkage”,它是否意味着_cdecl或fastcall? (3)如果默认调用约定是cdecl,为什么需要asmlinkage,考虑到cdecl等于asmlinkage修饰符? (我在这里纠正吗?) (4)为什么那些系统调用函数都用asmlinkage声明。 我们可以先将参数复制到寄存器,然后调用那些系统调用函数吗? 从我的角度来看,在x86中,当发出系统调用时,参数很容易保存在寄存器中; 那么为什么还要在堆栈中保存然后通过堆栈约定强制执行这样的传递参数呢? 最后,任何人都可以推荐一些我可以参考混合汇编/ c编程的资源/书籍吗?