我正在编写一个使用动态计时器的内核(2.6.28)模块.我正在使用timer_list结构,如下所示:
struct timer_list our_timer;
init_timer(&our_timer);
our_timer.function = handleFlowTimer;
our_timer.expires = jiffies + 2000;
our_timer.data = 0;
add_timer(&our_timer);
void handleFlowTimer(unsigned long data)
{
//do nothing
}
Run Code Online (Sandbox Code Playgroud)
这可以正常工作约2秒,直到计时器到期.然后系统崩溃了.我也尝试过这样的结果:
struct timer_list our_timer = TIMER_INITIALIZER(handleFlowTimer, 0, 0);
mod_timer(&our_timer, jiffies + 2000);
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
我通常只在FreeBSD内核上工作,它有点不同.我开始制作和安装模块的阶段,但是你如何实际启动刚刚构建的内核?
这应该很简单.然而,它给了我地狱.
问题
我编译了最新的内核,当我重启我的盒子时,它会产生与文件系统相关的内核恐慌.
问题
如何让新内核识别VMWare文件系统?某些地方必须有一些设置让Linux安装知道"硬盘驱动器"不是真正的驱动器,而是实际上代表虚拟机的文件.
背景
首先,我不是Linux大师.这是我第一次编译内核.我为解决这个问题做了什么:
重启后,它失败并出现以下错误:
No volume groups found
Volume group "VolGroup00" not found
Unable to access resume device (/dev/VolGroup00/LogVol01)
mount: could not find filesystem '/dev/root'
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic - not syncing: …Run Code Online (Sandbox Code Playgroud) 我想记录内核中应用程序调用的系统调用(包括参数).有人告诉我,我可以挂钩所有系统调用或钩住sysenter,但是,我不知道该怎么做.顺便说一句,我已经尝试了strace实用程序,但似乎strace为我提供了比我预期更多的系统调用.例如:我构建了一个只包含"open,lseek,read,write和close"系统调用的程序,用于简单的文件操作,但strace返回了更多的系统调用,例如"access,fstat64等",而不是那些以上.为什么?
在一个操作系统课程中,我花了一段时间才开始研究一个旧的,非抢占式的Linux内核(2.4.X).但是,我们被告知内核中可能同时存在多个控制路径.这与内核的非抢占性质相矛盾吗? 编辑:我的意思是,没有上下文切换内部的内核.上次我尝试提出这个问题时,得到了回答"好吧,Linux内核是先发制人的,所以没有问题".
我需要创建2个新的系统调用来设置并通过给定的pid从进程获取属性.我更改了task_struct,添加了int z_value(这是我需要设置/获取的)
我还设法为每个创建的进程设置默认的z_value(200).
当我运行get system call时,我可以看到默认的z_value正确.但是当我尝试设置z_value时没有任何反应.
没有编译错误,没有分段错误等.
这是我的系统调用.
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
asmlinkage void sys_set_z_value ( int user_value , pid_t pid )
{
rcu_read_lock();
struct task_struct *p = find_task_by_vpid(pid);
p->z_value = user_value;
rcu_read_unlock();
}
Run Code Online (Sandbox Code Playgroud) 我相信我可能会过度思考这个问题......我的文件系统上有一个文本文件,我在启动时解析它并将结果存储到一个结构数组中.我需要将这个数组从用户空间复制到内核空间(copy_from_user),并且必须随时由内核访问这些数据.内核空间中的数据需要由Sockets.c文件访问.是否有一个特殊的地方可以在内核空间中存储数组,或者我可以简单地在Sockets.c中添加对该数组的引用?我的C有点生疏......
谢谢你的建议.
标题说明了一切:)。
但是,让我扩展一个具体案例。
到目前为止,我已经研究了所有需要与硬件进行交互的系统调用(例如 read()、write() 等),因此在执行这些系统调用(陷阱指令)之前切换到内核模式是有意义的。
据我了解,信号纯粹是软件构造,这意味着它们不是由硬件直接生成的(与中断不同)。我将它们理解为进程(内核-内核、内核-用户或用户-用户进程)之间的消息传递机制。
Kill是一个系统调用,用于向进程发送信号。它不直接与硬件交互。那么为什么我们需要昂贵地切换到内核模式来执行该系统调用呢?我还没有发现任何“特殊”系统调用在开始执行之前不会陷入内核模式的证据。因此,问题。
当Linux内核使用insmod加载新模块时,它将调用
finit_module
do_init_module
do_one_initcall
Run Code Online (Sandbox Code Playgroud)
然后将调用模块中定义的 init 函数。
finit_module
do_init_module
do_one_initcall
Run Code Online (Sandbox Code Playgroud)
但是在搜索了linux内核的所有代码后,我没有找到mod->init分配的地方,有人可以帮助我吗?
提前致谢。
我知道一个进程在用户态和内核态之间切换运行。我很困惑,对于每一行代码,我们都可能需要内核。下面是示例,我能否得到内核在执行以下代码行中的作用的解释。以下是否确实需要内核模式。
如果(a<0)a++