标签: kernel

你拿着自旋锁的时候为什么不能入睡?

在linux内核中,为什么不能在拿着自旋锁时睡觉?

linux kernel

11
推荐指数
3
解决办法
1万
查看次数

在Linux内核中包装函数时遇到问题

我写了一个LKM,它将可信路径执行(TPE)实现到你的内核中:

https://github.com/cormander/tpe-lkm

当我将WRAP_SYSCALLS定义为1时,我偶尔遇到一个内核OOPS(在这个问题的最后描述),并且在我的智慧结束时尝试跟踪它.

一点背景:

由于LSM框架不会导出其符号,因此我必须对如何将TPE检查插入正在运行的内核进行创作.我写了一个find_symbol_address()函数,它给了我所需的任何函数的地址,并且它工作得非常好.我可以调用这样的函数:

int (*my_printk)(const char *fmt, ...);
my_printk = find_symbol_address("printk");
(*my_printk)("Hello, world!\n");
Run Code Online (Sandbox Code Playgroud)

它工作正常.我使用此方法来定位security_file_mmap,security_file_mprotectsecurity_bprm_check函数.

然后我用asm跳转到我的函数来覆盖这些函数来进行TPE检查.问题是,当前加载的LSM将不再执行它对该函数的挂钩的代码,因为它已被完全劫持.

这是我做的一个例子:

int tpe_security_bprm_check(struct linux_binprm *bprm) {

    int ret = 0;

    if (bprm->file) {
            ret = tpe_allow_file(bprm->file);
            if (IS_ERR(ret))
                    goto out;
    }

#if WRAP_SYSCALLS
    stop_my_code(&cs_security_bprm_check);

    ret = cs_security_bprm_check.ptr(bprm);

    start_my_code(&cs_security_bprm_check);
#endif

    out:

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

注意#if WRAP_SYSCALLS部分之间的部分(默认情况下定义为0).如果设置为1,则调用LSM的钩子,因为我将原始代码写回asm跳转并调用该函数,但是我遇到了一个带有"无效操作码"的偶尔内核OOPS:

invalid opcode: 0000 [#1] SMP 
RIP: 0010:[<ffffffff8117b006>]  [<ffffffff8117b006>] security_bprm_check+0x6/0x310
Run Code Online (Sandbox Code Playgroud)

我不知道问题是什么.我尝试了几种不同类型的锁定方法(详情请参见start/stop_my_code的内部)无济于事.要触发内核OOPS,请编写一个简单的bash while循环,无休止地启动后台"ls"命令.大约一分钟后,它就会发生.

我在RHEL6内核上测试它,也适用于Ubuntu …

linux kernel wrapper

11
推荐指数
1
解决办法
2273
查看次数

创建进程时Linux进程内核堆栈状态是什么?

我无法在任何地方找到这些信息.无论我到哪里,我都会发现,一旦你点击"主"(无论你的入口点是什么),这将是程序参数和环境,看起来堆栈的外观,但我正在寻找的是系统如何设置堆栈与switch_to宏配合.第一次切换到任务时,需要有EFLAGS,EBP,GCC保存的寄存器,以及来自"tsk-> thread-> esp"指向的堆栈上schedule()函数的返回地址,但是我无法弄清楚内核是如何设置这个堆栈的,因为它允许GCC保存通用寄存器(使用内联汇编的输出参数).

我指的是x86个人电脑.我正在为我自己的(尝试)编写的小内核研究Linux调度程序/进程系统,而我无法理解我所缺少的内容.我知道我遗漏了一些东西,因为Slackware在我的计算机上运行这一事实证明了调度程序的工作原理:P

编辑:我似乎措辞严厉.我正在寻找有关如何设置任务内核堆栈而不是如何设置任务用户任务的信息.更具体地说,tsk-> thread-> esp指向的堆栈,以及"switch_to"切换到的堆栈.

linux x86 stack state kernel

11
推荐指数
1
解决办法
1446
查看次数

如何获取Android系统上所有活动内核驱动程序的列表?

如何获取Android系统上所有活动内核驱动程序的列表?Android中Linux"lsmod"的等效内容是什么?我使用adb shell并打开了我的Android终端模拟器应用程序,并做了一个"lsmod".我从我的BSP得到了一些蹩脚的两件物品清单.但它没有列出Linux内核主动运行的整个系统上的所有驱动程序.

android kernel device-driver

11
推荐指数
2
解决办法
3万
查看次数

旋转锁有问题吗?

这是我的自旋锁实现,但它似乎无法保护关键代码.我的实施有问题吗?

static __inline__ int xchg_asm(int* lock, int val) 
{
  int ret; 
  __asm__ __volatile__(
    LOCK "movl (%1),%%eax; 
    xchg (%1),%2; 
    movl %%eax, %0" :"=m" (ret) :"d"(lock), "c"(val)
  );
  return ret; 
}
void spin_init(spinlock_t* sl) 
{ 
  sl->val = 0; 
} 
void spin_lock(spinlock_t* sl) 
{ 
  int ret; 
  do { 
    ret = xchg_asm(&(sl->val), 1); 
  } while ( ret==0 ); 
}

void spin_unlock(spinlock_t* sl) 
{
  xchg_asm(&(sl->val), 0);
}
Run Code Online (Sandbox Code Playgroud)

linux x86 assembly kernel linux-kernel

11
推荐指数
1
解决办法
1104
查看次数

在linux内核中添加了一个新的网络协议

我知道在linux内核中我们可以在传输层添加自己的协议,类似于TCP,UDP等.

是否有任何钩子在网络层注册新协议,类似于IP,ARP,它可以将数据包传输到应用程序以及如何在Linux内核中添加此协议?

c linux networking kernel linux-kernel

11
推荐指数
1
解决办法
7135
查看次数

"最佳"IO缓冲 - 程序员或内核的任务?

我的任务很简单:在Linux上用C++读取和解析一个大文件.有两种方法:

  1. 逐字节解析.

    while(/*...*/) {
            ... = fgetc(...);
            /* do something with the char */
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 缓冲区解析缓冲区.

    while(/*...*/) {
            char buffer[SOME_LARGE_NUMBER];
            fread(buffer, SOME_LARGE_NUMBER, 1, ...);
            /* parse the buffer */
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在,逐字节解析对我来说更容易(不检查​​缓冲区的满载程度等).但是,我听说读大片更有效率.

什么是哲学?是"最佳"缓冲内核的任务,所以当我打电话时它已经被缓冲了fgetc()?或者是否建议我处理它以获得最佳效率?

此外,除了所有哲学:Linux上的现实是什么?

c++ io performance buffer kernel

11
推荐指数
1
解决办法
552
查看次数

Linux内核模块:重新劫持虚拟文件系统的迭代功能

从用户隐藏进程的一种流行方法是劫持/ proc目录的iterate函数.这可以按如下方式完成:

struct file *filep = filp_open("/proc", O_RDONLY, 0));
filep->f_op->iterate = p // We swap the pointer with our hacked iterate
Run Code Online (Sandbox Code Playgroud)

我正在研究一种检测方法,我希望恢复原始的迭代功能(假设它已经被劫持).有没有办法找到用于/ proc目录的原始迭代函数?

c linux kernel rootkit

11
推荐指数
1
解决办法
635
查看次数

在不影响主机的情况下更改docker容器中的系统日期时间

我想知道是否可以在不更改主机本身的情况下更改Docker容器中的系统时间.我们正在使用docker容器进行测试,这些容器有时会对时间敏感.我注意到对主机时间所做的任何更改都会立即反映到docker容器中(这是有意义的,因为它们使用相同的内核).我希望Docker提供一种方法让你以某种方式覆盖容器的开始时间并从那里移动.

谢谢

linux datetime kernel docker

11
推荐指数
1
解决办法
7873
查看次数

Docker加载内核模块

我试着安装一个内核模块xfsprogs.它已成功安装在容器内.这确实令人惊讶,但lsmod没有在容器或主机系统中列出此模块.如何在容器中加载新的内核模块?(CentOS容器,Ubuntu主机)

kernel kernel-module docker

11
推荐指数
2
解决办法
2万
查看次数