标签: linux-kernel

Linux系统调用的内部

当线程通过引发中断80进行系统调用时会发生什么(详细)?Linux对线程的堆栈和其他状态做了哪些工作?对处理器进行了哪些更改以使其进入内核模式?运行中断处理程序后,控制如何恢复到调用进程?

如果系统调用无法快速完成,例如从磁盘读取,该怎么办?中断处理程序如何放弃控制,以便处理器在加载数据时可以执行其他操作,以及如何再次获取控制权?

linux operating-system linux-kernel

30
推荐指数
2
解决办法
9584
查看次数

如何创建新的Linux内核调度程序

通过调度程序源代码(2.6.34,kernel/sched.c),我可以看到如何使用"可插拔"调度程序,我相信我理解要实现的接口.我还不明白的是如何将我的代码内置到内核中.至少,指向其他网站的指针将不胜感激.

现在,我正在内核源代码树中查找SCHED_FIFO,SCHED_RR和SCHED_NORMAL,所以我真的在寻找一种更有见地的方式来看待它:-)

编辑:作为一些背景,我对FreeBSD调度程序(以及一般的FreeBSD内核)非常熟悉,所以我不是在寻找关于如何进行进程/线程级调度的指针.我正在寻找一种方法来添加我自己的调度程序和普通的linux调度程序(类似于SCHED_FIFO).

编辑#2:下面的BFS指针是一个很好的开始,但它仍然将CFS从内核中删除.sched.c现在看起来像:

#ifdef CONFIG_SCHED_BFS
#include "sched_bfs.c"
#else
   // original sched.c 
#endif // CONFIG_SCHED_BFS
Run Code Online (Sandbox Code Playgroud)

我很乐意看到答案或指针如何更好地做到这一点(即保持CFS,至少目前为止).

编辑#3:我已经在下面回答了我自己的问题,因为我认为我已经弄明白了.

c linux scheduling scheduler linux-kernel

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

用户空间与内核空间驱动程序

我正在寻找一个PWM驱动程序.我知道有两种方法可以控制硬件驱动程序:

  1. 用户空间驱动程序
  2. 内核空间驱动程序

如果一般(不考虑PWM驱动程序的情况),我们必须决定是去用户空间还是内核空间驱动程序.那么除了这些因素我们还要考虑哪些因素?

  1. 用户空间驱动程序可以直接将mmap()/ dev/mem内存存储到其虚拟地址空间,无需上下文切换.
  2. 用户空间驱动程序不能实现中断处理程序(它们必须轮询中断).
  3. 用户空间驱动程序无法执行DMA(因为可以从内核空间分配具有DMA功能的内存).

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

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

printk()打印到哪里?

关于内核级别的printk()函数的一个快速问题,如果我调用它将消息打印到哪里?(我在i386 arch上使用Ubuntu并使用最新的内核下载)

找不到任何地方,

如果有人也可以指出我正确的方向为printk()函数的某种手册,它会很棒!

linux debugging linux-kernel

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

Linux SCHED_OTHER,SCHED_FIFO和SCHED_RR - 差异

有人可以解释SCHED_OTHER,SCHED_FIFO和SCHED_RR之间的区别吗?

谢谢

linux scheduling scheduler linux-kernel cfs

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

在编写linux驱动程序时,ERESTARTSYS使用了什么?

我正在学习用于编写linux设备驱动程序的阻塞I/O函数,我想知道它的用法是什么ERESTARTSYS.考虑以下:

全局变量:

wait_queue_head_t my_wait_q_head;
int read_avail = 0;
Run Code Online (Sandbox Code Playgroud)


device_init():

init_waitqueue_head(&my_wait_q_head);


device_read():

printk("I'm inside driver read!\n");
wait_event_interruptible(&my_wait_q_head, read_avail != 0);
printk("I'm awaken!\n");
Run Code Online (Sandbox Code Playgroud)


device_write():

read_avail = 1;
wake_up_interruptible(&my_wait_q_head);
Run Code Online (Sandbox Code Playgroud)


当我调用read()from用户空间时,命令提示符会挂起,直到我write()按预期调用.的printk消息相应地出现,以及在dmesg.但是,我看到一些像这样编写的驱动程序:

另一个版本的device_read():

printk("I'm inside driver read!\n");
if(wait_event_interruptible(&my_wait_q_head, read_avail != 0))    
{return -ERESTARTSYS;}
printk("I'm awaken!\n");
Run Code Online (Sandbox Code Playgroud)

我测试了device_read()在用户空间中使用相同方法的第二个版本,结果完全相同,那么,ERESTARTSYS的用途是什么?

p/s:我已经阅读了这本书上的Linux设备驱动程序,但是我没有得到它,有人可以举例来说明吗?:

一旦我们通过那个电话,有些东西唤醒了我们,但我们不知道是什么.一种可能性是该过程接收到信号.包含wait_event_interruptible调用的if语句将检查此情况.这个陈述确保了对信号的适当和预期的反应,这可能是唤醒过程的原因(因为我们处于可中断的睡眠状态).如果信号已到达并且尚未被进程阻止,则正确的行为是让内核的上层处理事件.为此,驱动程序将-ERESTARTSYS返回给调用者; 此值由虚拟文件系统(VFS)层在内部使用,该层可重新启动系统调用或将-EINTR返回到用户空间.我们使用相同类型的检查来处理每个读写实现的信号处理.

资料来源:http://www.makelinux.net/ldd3/chp-6-sect-2

c linux-device-driver linux-kernel

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

处理ARM TrustZones

ARM有一个名为TrustZone的东西.根据ARM文档,它提供了一个进程可以在安全/非安全世界中运行.

  1. 安全/非安全世界意味着什么.它与处理器执行模式有关,还是与设置内存区域或其他内容的权限有关.
  2. ARM的7种操作模式与安全/非安全世界之间是否存在任何关系.
  3. 如何在ARM中启用TrustZone.
  4. 从哪个版本的ARM引入.
  5. 是否必须使用此TrustZone.Linux内核是否使用此TrustZone扩展.

请帮助我理解这一点.

arm linux-kernel trustzone

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

如何解决"内核恐慌 - 不同步 - 尝试杀死init" - 而不删除任何用户数据

我试图更新我们的Ubuntu服务器中的libc,但它失败了,现在当我重新启动服务器时,我收到一条错误消息:

内核恐慌 - 没有同步 - 试图杀死init!

它只是挂起.

这个问题的解决方案是什么?服务器由10个人使用,所以我不想重新安装擦除他们的数据.

security ubuntu selinux linux-kernel panic

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

是否有宏定义来检查Linux内核版本?

我想知道是否有一个gcc宏会告诉我Linux内核版本,所以我可以适当地设置变量类型.如果没有,我将如何定义我自己的宏呢?

c linux macros gcc linux-kernel

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

module_init()与core_initcall()与early_initcall()的关系

在驱动程序中,我经常看到使用这三种类型的init函数.

module_init()
core_initcall()
early_initcall()
Run Code Online (Sandbox Code Playgroud)
  1. 我应该在什么情况下使用它们?
  2. 另外,有没有其他的init方式?

init linux-device-driver linux-kernel

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