当线程通过引发中断80进行系统调用时会发生什么(详细)?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:我已经在下面回答了我自己的问题,因为我认为我已经弄明白了.
我正在寻找一个PWM驱动程序.我知道有两种方法可以控制硬件驱动程序:
如果一般(不考虑PWM驱动程序的情况),我们必须决定是去用户空间还是内核空间驱动程序.那么除了这些因素我们还要考虑哪些因素?
关于内核级别的printk()函数的一个快速问题,如果我调用它将消息打印到哪里?(我在i386 arch上使用Ubuntu并使用最新的内核下载)
找不到任何地方,
如果有人也可以指出我正确的方向为printk()函数的某种手册,它会很棒!
有人可以解释SCHED_OTHER,SCHED_FIFO和SCHED_RR之间的区别吗?
谢谢
我正在学习用于编写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返回到用户空间.我们使用相同类型的检查来处理每个读写实现的信号处理.
ARM有一个名为TrustZone的东西.根据ARM文档,它提供了一个进程可以在安全/非安全世界中运行.
请帮助我理解这一点.
我试图更新我们的Ubuntu服务器中的libc,但它失败了,现在当我重新启动服务器时,我收到一条错误消息:
内核恐慌 - 没有同步 - 试图杀死init!
它只是挂起.
这个问题的解决方案是什么?服务器由10个人使用,所以我不想重新安装擦除他们的数据.
我想知道是否有一个gcc宏会告诉我Linux内核版本,所以我可以适当地设置变量类型.如果没有,我将如何定义我自己的宏呢?
在驱动程序中,我经常看到使用这三种类型的init函数.
module_init()
core_initcall()
early_initcall()
Run Code Online (Sandbox Code Playgroud)