标签: kernel-module

如何获取linux内核空间中的当前小时(时间)

我正在编写一个内核模块,用于检查时间是否在两个指定的小时之间,如果是,则禁用输入.这与我想要确保我早点睡觉有关.(我知道我也可以使用任何数量的不同技术,包括cron等,但我想学习内核编程......)

因此,作为第一个版本,我检查当前小时是否在开始和结束之间,这是通过模块的参数设置的.

因此,我的问题是:如何获得当前时间?我无法访问标准库中的常用时间函数,因为我在内核空间中.我猜我应该使用do_gettimeofday()来实现这一点,但这只能给我几秒和几纳秒,而且我在当天需要几个小时.

谢谢.

c linux kernel-module linux-kernel

21
推荐指数
2
解决办法
4万
查看次数

linux内核模块链接器警告:"***警告:<function> [<module>] undefined!" - 任何摆脱它们的方法?

在编译彼此依赖的Linux内核模块时,链接器会给出未定义的符号警告

 Building modules, stage 2.
 MODPOST
*** Warning: "function_name1" [module_name] undefined!
*** Warning: "function_name2" [module_name] undefined!
*** Warning: "function_name3" [module_name] undefined!
Run Code Online (Sandbox Code Playgroud)

一旦使用insmod或modprobe将模块插入内核,就会解析未解析的符号.有没有办法摆脱链接器警告?

我已经阅读了3个关于这个问题的Google SERP - 似乎没有人知道答案.在构建内核模块时,这些链接器警告应该是这样的吗?

c++ linux compiler-errors kernel-module

20
推荐指数
3
解决办法
2万
查看次数

Linux内核模块中的文件I/O.

我正在编写一个需要打开和读取文件的Linux内核模块.实现这一目标的最佳方法是什么?

file-io kernel-module linux-kernel

19
推荐指数
2
解决办法
4万
查看次数

如何从C代码加载Linux内核模块?

我有一个应用程序,它有两个外部内核模块和一个用户空间守护程序.我想在启动时从C编写的守护程序代码加载模块,并在干净退出时卸载它们.我可以用比system("modprobe module");使用相应的方式更清洁的方式加载它们rmmod吗?

c linux kernel-module linux-kernel

19
推荐指数
3
解决办法
2万
查看次数

Linux内核模块:何时使用try_module_get/module_put

我正在阅读LKMPG(参见第4.1.4节.取消注册设备),我不清楚何时使用这些try_module_get / module_put功能.一些LKMPG示例使用它们,有些则不使用它们.

令人困惑的是,try_module_get在2.6.24源代码的193个文件中出现了282次,但在Linux设备驱动程序(LDD3)Essential Linux设备驱动程序中,它们甚至没有出现在单个代码示例中.

我想也许它们与旧register_chrdev接口绑定(由cdev接口取代2.6),但它们只出现在同一个文件中8次:

find -type f -name *.c | xargs grep -l try_module_get | sort -u | xargs grep -l register_chrdev | sort -u | grep -c .
Run Code Online (Sandbox Code Playgroud)

那么什么时候使用这些函数是合适的,它们是否与特定接口或一组环境的使用联系在一起?

编辑

我从LKMPG 加载了sched.c示例并尝试了以下实验:

anon@anon:~/kernel-source/lkmpg/2.6.24$ tail /proc/sched -f &
Timer called 5041 times so far
[1] 14594

anon@anon:~$ lsmod | grep sched
sched                   2868  1 

anon@anon:~$ sudo rmmod sched
ERROR: Module sched is …
Run Code Online (Sandbox Code Playgroud)

kernel-module linux-device-driver linux-kernel

17
推荐指数
1
解决办法
1万
查看次数

在内核模式和用户模式之间使用ioctl通信

我想使用ioctl与我的内核模块进行通信.我已经为内核模块编写了两个c程序,其他用于用户模式.编译内核模块时出现此错误:

错误:初始化程序中指定的未知字段'ioctl'

在这一行:

struct file_operations Fops = {
 .read = device_read,
 .write = device_write,
 .ioctl = device_ioctl,  ------> at this point error is occuring.
 .open = device_open,
 .release = device_release,
};
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样.

谢谢

ioctl kernel-module ubuntu-10.04

17
推荐指数
1
解决办法
2万
查看次数

printk和pr_info之间的区别

printkpr_info功能之间的确切区别是什么?在什么条件下,我应该选择一个而不是另一个?

c kernel-module linux-kernel printk

17
推荐指数
2
解决办法
8919
查看次数

How do you create a loadable kernel module for Android?

I know there a number of walkthroughs and tutorials floating around out there which describe this activity, but after having read many of them I still can't get this working. If anyone has the patience to wade through the steps I've taken (posted below) and suggest where I may have gone off track I'd be very appreciative. I've spent about a day and a half staring at make files and reading walkthroughs so literally any suggestions would be helpful.

Environment: …

android kernel-module android-source

16
推荐指数
2
解决办法
4万
查看次数

在linux中劫持实时时钟

我想编写一个劫持实时时钟(中断8)的LKM(Linux内核模块).所以我希望将中断设置为我的函数,并在某些时候将其发送回旧函数.

我试图使用该request_irq函数没有任何成功,可能是因为那里的内核函数不愿意共享中断(我猜这是一个很好的决定).
根据我发现的一些页面,我还尝试编辑IDT(中断描述符表).他们没有工作,大多数甚至没有编译,因为他们为内核2.6编写,我正在使用3.10.

这是一个简化的代码,我只是想让你知道我在做什么.

kpage =__get_free_page( GFP_KERNEL);
asm("sidt %0": : "m"(*idtr) : );
memcpy(kpage, idtr, 256*sizeof(kpage));
newidt = (unsigned long long *)(*(unsigned long*)(idtr+1));
newidt[8] = &my_function;
asm("lidt %0": "=m"(newidt):);
Run Code Online (Sandbox Code Playgroud)

我的所有尝试都是在分段故障的好时候结束,并且在内核崩溃的困难时期迫使我重新启动(幸运的是我使用虚拟机和快照).

那么我怎么能劫持实时中断所以它能完成我的工作呢?(然后将其发送回原始函数以执行.)

是一些很好的代码来改变IDT上的pagefault函数.我无法使它工作,因为它也是为内核2.6编写的.这个问题也值得研究.

要获得赏金,请发布工作代码,或者至少提供足够的信息以使其运行.

c linux interrupt kernel-module

16
推荐指数
1
解决办法
710
查看次数

对于在另一个模块中定义的符号,insmod以"模块中的未知符号"失败

我在Ubuntu工作.我正在尝试制作两个使用彼此功能的内核模块.我的问题是我正确编译了模块,但是其中一个符号没有得到解决.

为简单起见,我们将这些模块称为m1m2.

m2是出口功能void func_m2(void).在m1调用此函数.两个模块都正确编译.

在它全部编译之后,我需要先加载m2模块(因为它有导出的func_m2函数)和之后的m1模块.所以,让我们做到:

volodymyr@sv1:~/development/kmodules/m2$ sudo insmod ./m2.ko
Run Code Online (Sandbox Code Playgroud)

现在,让我们m1尝试使用的加载模块func_m2:

volodymyr@sv1:~/development/kmodules/m1$ sudo insmod ./m1.ko
insmod: error inserting './m1.ko': -1 Unknown symbol in module
Run Code Online (Sandbox Code Playgroud)

以下是我在日志中看到的内容:

volodymyr@sv1:~/development/kmodules/m1$ dmesg | tail
[ 3938.166616] Loading m2 module ...
[ 3963.078055] m1: no symbol version for func_m2
[ 3963.078059] m1: Unknown symbol func_m2
Run Code Online (Sandbox Code Playgroud)

因此,似乎func_m2没有解决对符号的引用.有趣.让我们检查它是否存在于符号表中:

volodymyr@sv1:~/development/kmodules$ cat /proc/kallsyms | grep 'func_m2'
ffffffffa00530d0 r __ksymtab_func_m2    [m2]
ffffffffa00530e8 …
Run Code Online (Sandbox Code Playgroud)

c linux insmod kernel-module linux-kernel

16
推荐指数
2
解决办法
5万
查看次数