标签: linux-kernel

netlink和通用netlink协议

我已经阅读了通用的netlink方法,我发现netlink的唯一主要缺点是协议系列的数量仅限于MAX_LINKS(32),因此他们创建了通用的netlink协议.这是唯一的原因吗?这是否意味着,它建议使用genl而不是netlink,例如作为用户和内核空间之间的通信?genl被认为是一种更具可扩展性和可管理性的传统网络链接吗?

谢谢.

linux-kernel netlink

0
推荐指数
1
解决办法
1340
查看次数

使用aarch64-linux-gnu-gcc构建内核

我正在尝试使用以下命令在我的平台上构建内核源代码:

make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- generic-v8-defconfig
Run Code Online (Sandbox Code Playgroud)

但是,错误消息显示如下:

/bin/sh: 1: aarch64-linux-gnu-gcc: not found
Run Code Online (Sandbox Code Playgroud)

很明显我的笔记本电脑上没有安装这个gcc.

然后我跟着

http://www.howtoinstall.co/en/ubuntu/trusty/main/gcc-4.8-aarch64-linux-gnu/

这个要安装gcc-4.8-aarch-linux-gnu,

但是,我仍然得到相同的错误消息.

Ubuntu版本:14.04

如果你知道如何解决这个问题,请告诉我.

谢谢

gcc linux-kernel ubuntu-14.04

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

互斥可以取代内存障碍

我试图了解内存障碍并且遇到了下面的维基百科链接 http://en.wikipedia.org/wiki/Memory_barrier 这很好地解释了这个概念,但有想法,如果这对我们有mutex()锁定的系统真有帮助记忆部分.

使用维基百科中提到的相同代码,以下方法是否会使用互斥锁解决问题?

[注意:函数名称并非特定于任何编程语言,仅用于简单起见]

处理器#1

mutex_lock(a)
while (f == 0);
print x;
mutex_unlock(a)
Run Code Online (Sandbox Code Playgroud)

处理器#2

mutex_lock(a)
x = 42;
f = 1;
mutex_unlock(a)
Run Code Online (Sandbox Code Playgroud)

memory mutex linux-kernel memory-barriers

0
推荐指数
2
解决办法
1388
查看次数

在OS内的两个进程之间传递双向消息

PIPES是单向的,可以在通信中同步或异步.

但是如何在一个进程上创建一个双向命名管道,在另一个进程上创建另一个端点,这两个进程共享同一个内存,并且存在于同一操作系统中并异步通信.

有办法吗?

linux operating-system kernel multiprocessing linux-kernel

0
推荐指数
1
解决办法
304
查看次数

我们怎么知道我们在旋转锁内?

我有一个由多个函数调用的函数.有些函数使用自旋锁定调用它,有些函数没有任何锁定.我怎么知道我的函数是否被保持螺旋锁调用?

我有一段时间写了一大段代码.它有一些函数可以使用和不使用不同代码路径的锁来调用.只考虑没有锁的情况,函数使用GFP_KERNEL标志分配skbs.使用spin_lock()调用时会导致问题.我需要处理这两种情况以避免在spin_lock中睡觉.

linux kernel-module linux-device-driver linux-kernel embedded-linux

0
推荐指数
1
解决办法
246
查看次数

malloc()32位机器上的5GB内存

我正在读一本书:

32位机器上进程的虚拟地址空间为2 ^ 32,即4Gb空间.并且程序中看到的每个地址都是虚拟地址.4GB的空间进一步通过用户/内核拆分3-1GB.

为了更好地理解这一点,我做了5Gb空间的malloc()并尝试打印所有地址.如果我打印地址,当应用程序只有3GB的虚拟地址空间时,应用程序如何打印整个5Gb地址?我在这里错过了什么吗?

c linux operating-system linux-kernel

0
推荐指数
1
解决办法
792
查看次数

为什么在prepare_to_wait之后必须在wait_event中检查条件?

我试图了解如何在Linux内核中实现wait_event。ldd3中有一个代码示例,其中使用prepare_to_wait(http://www.makelinux.net/ldd3/chp-6-sect-2)解释了内部实现。

static int scull_getwritespace(struct scull_pipe *dev, struct file *filp)
{
    while (spacefree(dev) == 0) {
        DEFINE_WAIT(wait);

        up(&dev->sem);
        if (filp->f_flags & O_NONBLOCK)
            return -EAGAIN;
        PDEBUG("\"%s\" writing: going to sleep\n",current->comm);
        prepare_to_wait(&dev->outq, &wait, TASK_INTERRUPTIBLE);
        if (spacefree(dev) == 0)  // Why is this check necessary ??
            schedule(  );
        finish_wait(&dev->outq, &wait);
        if (signal_pending(current))
            return -ERESTARTSYS; /* signal: tell the fs layer to handle it */
        if (down_interruptible(&dev->sem))
            return -ERESTARTSYS;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在书中,解释如下。

然后是对缓冲区的强制检查;我们必须处理以下情况:在进入while循环(并丢弃了信号灯)之后但在进入等待队列之前,缓冲区中的空间变得可用。如果没有该检查,如果读取器进程能够在那个时候完全清空缓冲区,那么我们可能会错过唯一一次唤醒并永远休眠的唤醒。在满足自己必须睡觉的满足感之后,我们可以拨打时间表了。

我无法理解这一解释。如果if (spacefree(dev) == 0)在调用schedule()之前未完成睡眠,我们将如何进入不确定的睡眠状态?如果不存在此强制检查,则wakeup()仍将过程状态重置为TASK_RUNNING并按下一段所述返回计划。

值得再次研究这种情况:如果在if语句中的测试与计划调用之间发生唤醒,会发生什么情况?在这种情况下,一切都很好。唤醒会将过程状态重置为TASK_RUNNING并返回计划-尽管不一定立即进行。只要在流程将自己置于等待队列并更改其状态之后进行测试,事情就可以正常进行。

linux-device-driver linux-kernel blockingqueue

0
推荐指数
1
解决办法
541
查看次数

为什么这个函数在Linux驱动程序中不能是静态的

我有一些汇编代码封装在我的驱动程序代码的静态函数中.我的代码就像

static int _ARMVAtoPA(void *pvAddr)
{
__asm__ __volatile__(
    /* ; INTERRUPTS_OFF" */
    " mrs            r2, CPSR;\n" /* r2 saves current status */
    "CPSID  iaf;\n" /* Disable interrupts */

    /*In order to handle PAGE OUT scenario, we need do the same operation
      twice. In the first time, if PAGE OUT happens for the input address,
      translation abort will happen and OS will do PAGE IN operation
      Then the second time will succeed.
    */

    "mcr    p15, 0, r0, c7, c8, 0;\n " …
Run Code Online (Sandbox Code Playgroud)

c linux static linux-kernel

0
推荐指数
1
解决办法
73
查看次数

系统调用会中断softirq吗?

根据我的理解,当触发软件中断时,系统调用会得到服务,因此我认为它不能中断硬件ISR,因为ISR内部的本地CPU irq被禁用,但它看起来可能会中断任何其他任务,例如softirq,tasklet ,工作队列和内核线程?

通常,我们不需要担心在优先级较高的任务中针对较低优先级内核任务的争用.就像我们不需要保护数据免受tasklet或softirq中的内核线程,因为抢占被禁用.

当系统调用在内核模式的进程上下文中运行时,如果它可以中断softirq,我们必须在针对进程的softirq中考虑适当的保护.更糟糕的是,重负载系统调用可以延迟执行softirqs和tasklet至少一次滴答或直到另一个硬件中断到来并且内核再次调度它们.

如果我的理解是错误的,请纠正我.

interrupt linux-kernel

0
推荐指数
1
解决办法
487
查看次数

错误:预期')'之前

所以我正在使用一个非常基本的新系统调用来重新编译Linux内核,但每次我尝试编译它时都会出错.

#include <linux/linkage.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/uaccess.h>

SYSCALL_DEFINE2(strcpy1, char *, dest, char *, src) {

 printk(KERN_ALERT "done system call strcpy...\n");

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

无论我做什么,我都会收到此错误.

cmps272/strcpy1.c:6:26:错误:预期')'在'char'之前令牌SYSCALL_DEFINE2(strcpy1,char*dest,char*src)

我尝试改变这一切,但它一直给我这个错误并停止编译.有任何想法吗?

c linux-kernel

0
推荐指数
1
解决办法
1090
查看次数