有没有办法添加系统调用动态,比如通过模块?我找到了可以用模块覆盖现有系统调用的地方,只需更改sys_call_table[]数组以获取我的重写函数而不是安装我的模块时的本机,但是你可以用新的系统调用和模块吗?
我需要从我编写的一个小型Linux内核模块中获取给定文件描述符中的文件名.我尝试了在C中从文件描述符获取文件名时给出的解决方案,但由于某种原因,它打印出垃圾值(在解决方案中提到的使用readlink时/proc/self/fd/NNN).我该怎么做?
我一直在查看net/core/dev.c和其他文件,试图找出如何获取当前配置的网络设备列表,并证明它有点难以找到.
最终目标是能够使用dev.c中的dev_get_stats获取网络设备统计信息,但我需要知道当前接口,以便我可以获取net_device结构来传入.我必须在内核中执行此操作,因为我我正在编写一个模块,它添加了一个新的/ proc /条目,它与当前网络设备的一些统计信息有关,所以我可以从内核中完成这个.
如果有人能指出我如何获得接口,那将非常感激.
remap_pfn_rangefunction(用于mmap调用驱动程序)可用于将内核内存映射到用户空间.怎么做?谁能解释一下精确的步骤?内核模式是特权模式(PM),而用户空间是非特权(NPM).在PM中,CPU可以访问所有内存,而在NPM中,某些内存受到限制 - CPU无法访问.当remap_pfn_range被调用时,用户空间现在可以访问仅限于PM的内存范围?
看remap_pfn_range代码有pgprot_t struct.这是与保护映射相关的结构.什么是保护映射?这是上述问题的答案吗?
kernel-module linux-device-driver linux-kernel virtual-address-space
当我尝试rmmod模块时,我收到错误消息"错误:正在使用的模块",lsmod | grep <module name>显示计数.
有没有办法告诉我哪些进程正在使用这个特定的内核模块/驱动程序?
我想在我的c代码中使用system()函数stdlib.h.我实际上在研究内核编程.
每当我想在其中使用system()时,它stdlib.h说错误说没有找到这样的文件.
Linux内核代码中的EXPORT_SYMBOL_GPL是什么?
下面是一段代码,其中包含EXPORT_SYMBOL_GPL
62 struct resource *platform_get_resource(struct platform_device *dev,
63 unsigned int type, unsigned int num)
64 {
65 int i;
66
67 for (i = 0; i < dev->num_resources; i++) {
68 struct resource *r = &dev->resource[i];
69
70 if (type == resource_type(r) && num-- == 0)
71 return r;
72 }
73 return NULL;
74 }
75 EXPORT_SYMBOL_GPL(platform_get_resource);
Run Code Online (Sandbox Code Playgroud)
该宏在内核代码中多次出现......
所以我正在尝试编写一个使用linux/timer.h文件的内核模块.我让它在模块内部工作,现在我试图让它从用户程序开始工作.
这是我的内核模块:
//Necessary Includes For Device Drivers.
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/timer.h>
#include <linux/ioctl.h>
#define DEVICE_NAME "mytimer"
#define DEVICE_FILE_NAME "mytimer"
#define MAJOR_NUM 61
#define MINOR_NUM 0
MODULE_LICENSE("Dual BSD/GPL");
static struct timer_list my_timer;
struct file_operations FileOps =
{
//No File Operations for this timer.
};
//Function to perform when timer expires.
void TimerExpire(int data)
{
printk("Timer Data: %d\n", data);
}
//Function to set up timers.
void TimerSetup(void)
{
setup_timer(&my_timer, TimerExpire, …Run Code Online (Sandbox Code Playgroud) 我试图在Linux内核模块中获取电池电量(模块通过modprobe插入).理想情况下,我希望使用内核API调用来获取电池信息.我在网上搜索了解决方案,我还探索了Linux内核源代码和Michael Meskes的程序源代码"acpi"的想法.
这些是我认为我可以使用的一些技术:
/proc/acpi/battery/BAT0/state和/proc/acpi/battery/BAT0/info/sys/class/power_supply/BAT0/charge_now并且charge_full不涉及解析.acpi_battery_get_status和acpi_battery_get_infoacpi_battery_read,就在它上面有一个评论说"Driver Interface".如果有人知道如何使用它,这可能是另一种方式.我认为在内核模块中读取文件可能是一个坏主意,但我不确定这些文件如何映射到内核函数调用,所以它可能没问题.
那么,你们能给我一些建议/建议吗?
编辑:我在下面的答案中包含了我的解决方案.
如何获取触发我的内核模块file_operation.read例程的用户进程的PID (即哪个进程正在读取/dev/mydev)?
kernel-module ×10
linux-kernel ×8
linux ×7
c ×3
kernel ×3
acpi ×1
driver ×1
gumstix ×1
macros ×1
ubuntu ×1