我正在编写一个内核模块,用于检查时间是否在两个指定的小时之间,如果是,则禁用输入.这与我想要确保我早点睡觉有关.(我知道我也可以使用任何数量的不同技术,包括cron等,但我想学习内核编程......)
因此,作为第一个版本,我检查当前小时是否在开始和结束之间,这是通过模块的参数设置的.
因此,我的问题是:如何获得当前时间?我无法访问标准库中的常用时间函数,因为我在内核空间中.我猜我应该使用do_gettimeofday()来实现这一点,但这只能给我几秒和几纳秒,而且我在当天需要几个小时.
谢谢.
在编译彼此依赖的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 - 似乎没有人知道答案.在构建内核模块时,这些链接器警告应该是这样的吗?
我正在编写一个需要打开和读取文件的Linux内核模块.实现这一目标的最佳方法是什么?
我有一个应用程序,它有两个外部内核模块和一个用户空间守护程序.我想在启动时从C编写的守护程序代码加载模块,并在干净退出时卸载它们.我可以用比system("modprobe module");使用相应的方式更清洁的方式加载它们rmmod吗?
我正在阅读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) 我想使用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)
知道为什么会这样.
谢谢
printk和pr_info功能之间的确切区别是什么?在什么条件下,我应该选择一个而不是另一个?
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: …
我想编写一个劫持实时时钟(中断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编写的.这个问题也值得研究.
要获得赏金,请发布工作代码,或者至少提供足够的信息以使其运行.
我在Ubuntu工作.我正在尝试制作两个使用彼此功能的内核模块.我的问题是我正确编译了模块,但是其中一个符号没有得到解决.
为简单起见,我们将这些模块称为m1和m2.
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) kernel-module ×10
linux-kernel ×6
c ×5
linux ×5
android ×1
c++ ×1
file-io ×1
insmod ×1
interrupt ×1
ioctl ×1
printk ×1
ubuntu-10.04 ×1