linux-kernel 相关问题

此标记用于解决Linux内核本身的内部问题 - 特别是关于编写在内核上下文中运行的代码(如内核模块或驱动程序)。关于在Linux中编写用户空间代码的问题通常应该标记为[linux]。由于Linux内核的内部不断变化,因此包含您感兴趣的精确内核版本会很有帮助。

Linux中两个进程之间的上下文切换会发生什么?

假设进程 p1 正在使用自己的地址空间(堆栈、堆、文本)执行。当上下文切换发生时,我知道所有当前的CPU寄存器在加载过程之前都被推入PCB......

回答 2 投票 0

如何识别所需的linux内核模块的名称

我正在尝试按照这些说明构建 linux Parted 工具。 构建 Parted 后,您可以对其运行测试,这些说明指出: 如果出现以下情况,则需要运行大约 20% 的测试......

回答 1 投票 0

无法使用 kretprobe 挂钩 execve 的 argv

我尝试用 kretprobe 挂钩系统调用 __x64_sys_execve。因此,在条目处理程序中,我尝试获取其参数,并使用 strncpy_from_user 获取 char* 文件名 (char**)argv。但是在编译之后

回答 1 投票 0

用户进程换出页面时,该页面的虚拟地址是在用户空间还是内核空间?

我是Linux初学者,一直对内核空间和用户空间的区别感到困惑。 我目前正在研究内存管理,想知道虚拟...

回答 1 投票 0

在`spin_lock_init`和`DEFINE_SPINLOCK`之间更喜欢什么以及什么时候?

DEFINE_SPINLOCK 比 spin_lock_init 更好吗?前者比后者有哪些优点,可能有哪些缺点?

回答 1 投票 0

向 Yocto 生成的自定义 Linux 映像添加新的内核参数

我正在尝试使用 Yocto 项目为我的嵌入式设备生成自定义 Linux 映像。 我需要将持久的自定义内核参数添加到通用的 /etc/sysctl.conf 中...

回答 3 投票 0

对 sys_stat 感到困惑,sys_statfs 系统调用有效

我正在尝试在 stat 系统调用上设置 kprobe 来捕获一些信息。在检查 /proc/kallsyms 时,我有很多相似的名称,这有点令人困惑,哪个名称也适合我使用。 我很...

回答 1 投票 0

在 debian 上安装 linux-headers 无法找到包

我正在尝试为我的内核版本 3.4.61+ 和 Debian 版本 7.1 安装 linux-headers 我输入了这个命令: apt-get 更新 apt-get 安装 linux-headers-$(uname -r) 在最后一个命令中我

回答 7 投票 0

在正常工作模式下通过 BlueZ 进行蓝牙配对失败 - 确认值失败

内核:Linux 4.9.84 armv7l 蓝兹:5.65 对等:Android 12 和 IOS 16.6 应用: 使用btmgmt打开蓝牙设置 btmgmt 关闭电源 btmgmt 可连接 btmgmt 可配对 btmgmt p...

回答 1 投票 0

我的内核模块不挂钩系统调用,如何解决这个问题?

内核模块代码 #包括 #包括 #包括 #包括 #包括 #包括 内核模块代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/kprobes.h> #include <linux/syscalls.h> #include <linux/uaccess.h> #include <linux/fs.h> MODULE_LICENSE("GPL"); static void my_write_cr0(long value) { __asm__ volatile("mov %0, %%cr0" :: "r"(value) : "memory"); } #define disable_write_protection() my_write_cr0(read_cr0() & (~0x10000)) #define enable_write_protection() my_write_cr0(read_cr0() | 0x10000) unsigned long* sys_call_table_address; asmlinkage int (*original_chmod)(const char __user*, umode_t); static struct kprobe kp = { .symbol_name = "kallsyms_lookup_name" }; typedef unsigned long (*kallsyms_lookup_name_t)(const char* name); unsigned long* get_sys_call_table_address(void) { kallsyms_lookup_name_t kallsyms_lookup_name; int ret = register_kprobe(&kp); if (ret < 0) { printk(KERN_ERR "InterceptChmod: register_kprobe failed, returned %d\n", ret); return NULL; } kallsyms_lookup_name = (kallsyms_lookup_name_t)kp.addr; unregister_kprobe(&kp); if (!kallsyms_lookup_name) { printk(KERN_ERR "InterceptChmod: kallsyms_lookup_name not found\n"); return NULL; } unsigned long* address = (unsigned long*)kallsyms_lookup_name("sys_call_table"); if (!address) { printk(KERN_ERR "InterceptChmod: sys_call_table not found\n"); } else { printk(KERN_INFO "InterceptChmod: sys_call_table address: %p\n", address); } return address; } asmlinkage int custom_chmod(const char __user* filename, umode_t mode) { char fname[256]; // Copy the filename from user space to kernel space if (strncpy_from_user(fname, filename, sizeof(fname)) > 0) { fname[sizeof(fname) - 1] = '\0'; // Ensure null termination printk(KERN_INFO "InterceptChmod: chmod intercepted for file: %s, mode: %o\n", fname, mode); } else { printk(KERN_INFO "InterceptChmod: chmod intercepted, failed to get filename, mode: %o\n", mode); } // Call the original chmod system call return original_chmod(filename, mode); } static int __init intercept_chmod_init(void) { printk(KERN_INFO "InterceptChmod: Loading module\n"); sys_call_table_address = get_sys_call_table_address(); if (!sys_call_table_address) { printk(KERN_ERR "InterceptChmod: Failed to get sys_call_table_address\n"); return -EFAULT; } printk(KERN_INFO "InterceptChmod: sys_call_table address: %p\n", sys_call_table_address); original_chmod = (void*)sys_call_table_address[__NR_chmod]; printk(KERN_INFO "InterceptChmod: Original chmod address: %p\n", original_chmod); disable_write_protection(); sys_call_table_address[__NR_chmod] = (unsigned long)custom_chmod; enable_write_protection(); printk(KERN_INFO "InterceptChmod: Hooked chmod system call, new address: %p\n", (void*)sys_call_table_address[__NR_chmod]); return 0; } static void __exit intercept_chmod_exit(void) { if (sys_call_table_address) { disable_write_protection(); sys_call_table_address[__NR_chmod] = (unsigned long)original_chmod; enable_write_protection(); printk(KERN_INFO "InterceptChmod: Restored original chmod system call, address: %p\n", (void*)sys_call_table_address[__NR_chmod]); } printk(KERN_INFO "InterceptChmod: Module unloaded\n"); } module_init(intercept_chmod_init); module_exit(intercept_chmod_exit); 我使用 Linux 6.8.11-amd64、OracleVM VirtualBox 和 X86_64 处理器。 我使用以下方式加载模块: sudo insmod lkm_chmod.ko 然后我测试他的使用命令 sudo chmod 755 testfile他没有记录这个。 我的日志看起来像这样。 [ 9245.540511] InterceptChmod: Loading module [ 9245.561100] InterceptChmod: sys_call_table address: 00000000d760dd16 [ 9245.561105] InterceptChmod: sys_call_table address: 00000000d760dd16 [ 9245.561106] InterceptChmod: Original chmod address: 0000000014a7fad1 [ 9245.561110] InterceptChmod: Hooked chmod system call, new address: 00000000ce1988d5 [ 9330.452750] InterceptChmod: Restored original chmod system call, address: 0000000014a7fad1 [ 9330.452766] InterceptChmod: Module unloaded 我不明白为什么他不工作,我的日志中没有错误。我尝试将 __NR_chmod 更改为 __NR_open 或 __NR_close,但他不起作用。 我尝试使用 ChatGPT,他只说废话,只是重复我的代码。 好吧,我在这个答案中找到了解决方案answer。感谢 Ian Abbott 指出在 6.9 及更早版本中 sys_call_table 不再有效。 现在我修复了代码,他开始使用kprobes工作。 #include <linux/kprobes.h> #include <linux/ptrace.h> static int sys_read_kprobe_pre_handler(struct kprobe* p, struct pt_regs* regs) { printk(KERN_NOTICE "ROOTKIT: read(%ld, 0x%lx, 0x%lx)\n", regs->di, regs->si, regs->dx); return 0; } struct kprobe syscall_kprobe = { .symbol_name = "__x64_sys_read", .pre_handler = sys_read_kprobe_pre_handler, }; static int __init startup(void) { int err; err = register_kprobe(&syscall_kprobe); if (err) { pr_err("register_kprobe() failed: %d\n", err); return err; } printk(KERN_NOTICE "ROOTKIT: Starting of due"); return 0; } static void __exit shutdown(void) { unregister_kprobe(&syscall_kprobe); printk(KERN_NOTICE "ROOTKIT: Ending"); } module_init(startup); module_exit(shutdown); MODULE_LICENSE("GPL");

回答 1 投票 0

在 API 31 + / 文件系统访问上以 root 身份执行命令

我目前正在尝试通过工作应用程序获得对文件系统的完全访问权限。 我在 API 级别为 26、27、31、32 的 root AVD 上进行了测试 通过终端手动执行命令是没有 p...

回答 1 投票 0

BeagleBone AI-64 miniDP 上的连接显示器无法工作

我和我的同事正在开展一个大学项目,该项目要求我们为 BeagleBone AI-64 板创建一个基于 Linux 的构建系统。创建的构建系统应该能够检测相机

回答 1 投票 0

ss -it 对于重传(retrans)和丢包的命令说明

我需要监控我的 kubernetes 集群的网络,我正在使用用 Go 编写的 netlink 包来做到这一点。 https://github.com/vishvananda/netlink 我能够解析

回答 1 投票 0

为什么我无法在 QEMU 中的 linux 内核入口处设置断点?

最近,我开始使用QEMU(qemu-system-x86_64)和gdb调试Linux内核5.18.10。我知道QEMU的BIOS在QEMU启动时会加载内核代码到0x10000,并且第一条指令...

回答 1 投票 0

“检测到 .inst 损坏的汇编程序”是什么意思?

当我尝试从源代码安装内核时,我得到 arch/arm64/Makefile:48:检测到 .inst 损坏的汇编程序;拆解会不可靠 我尝试重建 bin-utils 但消息不会出现...

回答 2 投票 0

Mesa 3D:GBM 中的实际像素数据在哪里?

我知道在DRM渲染中,实际的像素数据保存在voidmappeddata中,如下所示: 结构 drm_mode_map_dumb arg; memset(&arg, 0, sizeof(arg)); arg.handle = bo->handle; ret = drmI...

回答 1 投票 0

在linux内核中使用静态库

我正在为Linux内核开发一个模块。它导出一些函数供我的伙伴在系统调用中调用(我的伙伴修改了Linux内核中的系统调用源代码)。 我可以为我的手机构建静态库吗...

回答 1 投票 0

USB 简单内核模块

我正在尝试熟悉Linux内核模块。所以我写了这个在 USB 上工作的最简单的模块。我不确定我错过了什么。正在加载模块。在 dmesg 上我也可以看到...

回答 4 投票 0

如何从内核内部确定其线程组中的线程索引?

对于给定的线程组,我需要获取其每个成员线程的顺序索引以从内核内部存储有关每个线程的一些数据,我可以访问task_struct。类似于&qu...

回答 1 投票 0

使用模块挂接到系统调用表

在我早期的内核编程工作中,我尝试替换/挂钩 ioctl 系统调用,目的是记录并最终检查完成的每个 ioctl 调用。 目标系统是...

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.