我已经阅读了通用的netlink方法,我发现netlink的唯一主要缺点是协议系列的数量仅限于MAX_LINKS(32),因此他们创建了通用的netlink协议.这是唯一的原因吗?这是否意味着,它建议使用genl而不是netlink,例如作为用户和内核空间之间的通信?genl被认为是一种更具可扩展性和可管理性的传统网络链接吗?
谢谢.
我正在尝试使用以下命令在我的平台上构建内核源代码:
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
如果你知道如何解决这个问题,请告诉我.
谢谢
我试图了解内存障碍并且遇到了下面的维基百科链接 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) PIPES是单向的,可以在通信中同步或异步.
但是如何在一个进程上创建一个双向命名管道,在另一个进程上创建另一个端点,这两个进程共享同一个内存,并且存在于同一操作系统中并异步通信.
有办法吗?
我有一个由多个函数调用的函数.有些函数使用自旋锁定调用它,有些函数没有任何锁定.我怎么知道我的函数是否被保持螺旋锁调用?
我有一段时间写了一大段代码.它有一些函数可以使用和不使用不同代码路径的锁来调用.只考虑没有锁的情况,函数使用GFP_KERNEL标志分配skbs.使用spin_lock()调用时会导致问题.我需要处理这两种情况以避免在spin_lock中睡觉.
linux kernel-module linux-device-driver linux-kernel embedded-linux
我正在读一本书:
32位机器上进程的虚拟地址空间为2 ^ 32,即4Gb空间.并且程序中看到的每个地址都是虚拟地址.4GB的空间进一步通过用户/内核拆分3-1GB.
为了更好地理解这一点,我做了5Gb空间的malloc()并尝试打印所有地址.如果我打印地址,当应用程序只有3GB的虚拟地址空间时,应用程序如何打印整个5Gb地址?我在这里错过了什么吗?
我试图了解如何在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并返回计划-尽管不一定立即进行。只要在流程将自己置于等待队列并更改其状态之后进行测试,事情就可以正常进行。
我有一些汇编代码封装在我的驱动程序代码的静态函数中.我的代码就像
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) 根据我的理解,当触发软件中断时,系统调用会得到服务,因此我认为它不能中断硬件ISR,因为ISR内部的本地CPU irq被禁用,但它看起来可能会中断任何其他任务,例如softirq,tasklet ,工作队列和内核线程?
通常,我们不需要担心在优先级较高的任务中针对较低优先级内核任务的争用.就像我们不需要保护数据免受tasklet或softirq中的内核线程,因为抢占被禁用.
当系统调用在内核模式的进程上下文中运行时,如果它可以中断softirq,我们必须在针对进程的softirq中考虑适当的保护.更糟糕的是,重负载系统调用可以延迟执行softirqs和tasklet至少一次滴答或直到另一个硬件中断到来并且内核再次调度它们.
如果我的理解是错误的,请纠正我.
所以我正在使用一个非常基本的新系统调用来重新编译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)
我尝试改变这一切,但它一直给我这个错误并停止编译.有任何想法吗?