给予struct task_struct合作。确定进程有多老的最佳方法是什么?
用于task_struct保存指向其下一个最小的兄弟姐妹和最大的孩子的特定指针。这在某些内核版本中似乎不再可用。
我专门使用 Android goldfish 内核。我一直在尝试学习如何使用该list_head结构来迭代进程,但我似乎无法弄清楚如何确定每个子进程或兄弟进程的年龄。
那么,什么成员或用法task_struct可以做到这一点?
我试图理解一些专有代码,其中使用单个参数调用container_of,该参数是返回结构的成员结构。
struct want{
.
.
struct member_used;
};
member_struct *ptr_member_used;
struct want *ret_struct container_of(ptr_member_used);
Run Code Online (Sandbox Code Playgroud)
我检查了以下链接
http://codinghighway.com/2013/08/10/the-magical-container-of-macro-and-its-use-in-the-linux-kernel/
但所有这些链接都使用三个参数,但没有一个使用结构成员来检索相应的结构。
我担心的是,container_of 宏如何仅通过传递结构成员来返回相应的结构?
程序在内核 3.13.0 和 gcc 4.8.4 的 64 位 ubuntu 14.0.4 上正确运行
对于用户模式应用程序,不正确的页面访问除了应用程序崩溃之外不会造成很多麻烦,并且可以通过异常处理来优雅地完成应用程序崩溃。为什么我们不能对内核崩溃做同样的事情呢?因此,当内核模块尝试访问某些无效地址时,就会出现页面错误并导致内核崩溃。为什么不能像卸载故障模块那样优雅地处理它。
更具体地说,我有兴趣知道这是完全不可能还是可能。我不愿意知道它在使用该系统时可能带来的困难。我知道驱动程序崩溃会导致设备无法使用,我对此表示同意。唯一的问题是是否可以优雅地卸载有故障的驱动程序。
在下面的 2 种情况下,“current->pid”打印什么
1) 硬IRQ上下文
2) 软IRQ上下文
我知道 IRQ 上下文和进程上下文是不同的,并且 PID 在 IRQ 上下文的情况下必须无效。但是当尝试在 IRQ 上下文中打印“current->pid”时,它正在打印一些有效的 PID,因此产生了疑问。请澄清。
谢谢你,
戈皮纳斯。
我正在尝试使用 qemu 和 gdb 调试 Linux 内核。问题是 gdb 不会在断点处停止。我搜索了一下,发现关闭 kASLR 可能会有所帮助,因为 kASLR 会混淆 gdb。
-- 在客户机上安装该内核。
+- 在来宾上安装该内核,通过在内核命令行中添加“nokaslr”来关闭 KASLR。
现在我不知道将 nokaslr 添加到命令行意味着什么以及执行此操作的方法。任何想法?
为什么这个文件是用汇编语言编写的,而它可以简单地使用更简单的语言(如 c)?为什么没有人仍然尝试用 c 重写它?
在内核模式下执行时,启用页表隔离(PTI)时有什么方法可以获取用户空间CR3值吗?
我想在构建内核之前,我必须使用 busybox 来填充 init 文件系统,并使用 cpio 来制作 initramfs 映像并将其添加到 Linux 内核源代码树中(例如在 arch/arm64/boot 中?)。但是如果我跳过这个过程并只构建内核,它是否包含一种默认的 initramfs ?或者它有空的 initramfs 吗?(网上的很多例子都没有显示busybox程序..)
具体来说,(*llseek) 术语是对象转换吗?这个语法 < ( * < name > ) (...) > 是否有一个术语,我可以谷歌搜索它以了解更多信息。
为什么“struct file *”没有变量名,以及如何访问它(假设我需要或允许访问它)。同样,其余参数没有变量名“loff_t,int”,这是为什么呢?最后, __user (在这个例子中或 __ 通常)是一个宏吗?
struct file_operations {
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
Run Code Online (Sandbox Code Playgroud)
谢谢!
在 Linux 中开发内核模块时,不允许使用 C 标准库。但是,如果我需要使用一些常用功能,例如system(),我该如何实现?