此标记用于解决Linux内核本身的内部问题 - 特别是关于编写在内核上下文中运行的代码(如内核模块或驱动程序)。关于在Linux中编写用户空间代码的问题通常应该标记为[linux]。由于Linux内核的内部不断变化,因此包含您感兴趣的精确内核版本会很有帮助。
我需要使用 n_gsm 线路规则创建自己的虚拟 tty 吗?
有一些“如何”页面提供了有关使用 n_gsm 线路规则的说明,其中包括这个来自 Linux 内核知识大部头的页面。 在该页面上,第 4 步给出了说明...
性能计数器未与 perf_open_event() 一起运行
我正在尝试访问大型复杂应用程序中的性能计数器。但是当我读取结果时它总是返回0。我还启用了总运行时间和总启用时间,...
我正在为我的串行键盘编写一个非常简单的Linux内核驱动程序,使用serdev。驱动程序工作原理及功能 静态 size_t serdev_keyboard_recv(struct serdev_device *serdev, ...
我的 CI/CD 管道中的自托管构建代理面临一个重大问题,我需要一个全面的解决方案。详细信息如下: 构建代理和服务 我有 6 个构建代理。 我...
将Linux内核交叉编译到aarch64 Raspberry Pi 3
我正在尝试交叉编译最新的主线 Linux 内核,以便我可以将其用于 RPI3b+ 上的 U-Boot。但是,它无法运行 make。 我已经通过 sudo apt-get 确保我拥有编译器
我在Linux系统中遇到了一个关于以通常方式声明的数组的警告。该警告表示应使用 static const char * const 而不是仅使用 char * 。这是为什么? 怎么...
假设进程 p1 正在使用自己的地址空间(堆栈、堆、文本)执行。当上下文切换发生时,我知道所有当前的CPU寄存器在加载过程之前都被推入PCB......
我正在尝试按照这些说明构建 linux Parted 工具。 构建 Parted 后,您可以对其运行测试,这些说明指出: 如果出现以下情况,则需要运行大约 20% 的测试......
无法使用 kretprobe 挂钩 execve 的 argv
我尝试用 kretprobe 挂钩系统调用 __x64_sys_execve。因此,在条目处理程序中,我尝试获取其参数,并使用 strncpy_from_user 获取 char* 文件名 (char**)argv。但是在编译之后
用户进程换出页面时,该页面的虚拟地址是在用户空间还是内核空间?
我是Linux初学者,一直对内核空间和用户空间的区别感到困惑。 我目前正在研究内存管理,想知道虚拟...
在`spin_lock_init`和`DEFINE_SPINLOCK`之间更喜欢什么以及什么时候?
DEFINE_SPINLOCK 比 spin_lock_init 更好吗?前者比后者有哪些优点,可能有哪些缺点?
向 Yocto 生成的自定义 Linux 映像添加新的内核参数
我正在尝试使用 Yocto 项目为我的嵌入式设备生成自定义 Linux 映像。 我需要将持久的自定义内核参数添加到通用的 /etc/sysctl.conf 中...
对 sys_stat 感到困惑,sys_statfs 系统调用有效
我正在尝试在 stat 系统调用上设置 kprobe 来捕获一些信息。在检查 /proc/kallsyms 时,我有很多相似的名称,这有点令人困惑,哪个名称也适合我使用。 我很...
在 debian 上安装 linux-headers 无法找到包
我正在尝试为我的内核版本 3.4.61+ 和 Debian 版本 7.1 安装 linux-headers 我输入了这个命令: apt-get 更新 apt-get 安装 linux-headers-$(uname -r) 在最后一个命令中我
在正常工作模式下通过 BlueZ 进行蓝牙配对失败 - 确认值失败
内核:Linux 4.9.84 armv7l 蓝兹:5.65 对等:Android 12 和 IOS 16.6 应用: 使用btmgmt打开蓝牙设置 btmgmt 关闭电源 btmgmt 可连接 btmgmt 可配对 btmgmt p...
内核模块代码 #包括 #包括 #包括 #包括 #包括 #包括 内核模块代码 #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");
在 API 31 + / 文件系统访问上以 root 身份执行命令
我目前正在尝试通过工作应用程序获得对文件系统的完全访问权限。 我在 API 级别为 26、27、31、32 的 root AVD 上进行了测试 通过终端手动执行命令是没有 p...
BeagleBone AI-64 miniDP 上的连接显示器无法工作
我和我的同事正在开展一个大学项目,该项目要求我们为 BeagleBone AI-64 板创建一个基于 Linux 的构建系统。创建的构建系统应该能够检测相机
我需要监控我的 kubernetes 集群的网络,我正在使用用 Go 编写的 netlink 包来做到这一点。 https://github.com/vishvananda/netlink 我能够解析
为什么我无法在 QEMU 中的 linux 内核入口处设置断点?
最近,我开始使用QEMU(qemu-system-x86_64)和gdb调试Linux内核5.18.10。我知道QEMU的BIOS在QEMU启动时会加载内核代码到0x10000,并且第一条指令...