将变量从linux内核传递给进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将变量从linux内核传递给进程相关的知识,希望对你有一定的参考价值。

我想创建一个程序来收集有关用户击键的信息(键码,按下和释放时间),并将它们用作生物识别用于连续验证用户。我的方法是使用内核模块收集键击(因为你不能只杀死一个内核模块),而内核模块会将信息发送到另一个进程来分析内核模块收集的数据,它会保存它到数据库并将返回内核的答案(用户是否经过身份验证),如果用户未经过身份验证,内核将锁定计算机。整个模块不会分发。

我的问题是:1。如何从内核调用进程并向他发送数据? 2.如何从进程中向内核返回消息?

答案

@ basile-starynkevitch的回答和他的论点尽管你可以采取一种方法,这是完全正确的,并且技术上允许linux内核。

使用内核模块中的内核调用register_keyboard_notifier()注册键盘通知程序回调函数。事实上,它正是为此而设计的!

您的通知程序回调函数将类似于:

int keysniffer_callback(struct notifier_block *notifier_block,
          unsigned long scancode,
          void *param) 
{
    // do something with the scancode

    return NOTIFY_OK; 
}

首先请参阅https://www.kernel.org/doc/Documentation/input/notifier.txt

另一答案

我想制作一个程序,收集有关用户击键的信息

这应该在你的display server实践中,你没有提到(XorgWaylandMIR,......?)。细节很重要!

我的方法是使用内核模块收集击键

我坚信这是一种错误的方法,你不需要任何内核模块。

我想制作一个程序来收集有关用户击键的数据

然后使用普通的Unix机器。键盘是一些character device(你可以有几个键盘,或没有,或一些虚拟...)你可以从它read(2)。如果你想编码keylogger,请明确说明。

(请注意,在未经许可且未经许可的情况下使用键盘记录程序或任何其他网络间谍活动可能是非法的;在大多数国家/地区,可能会将您送入监狱:在法国,Article 323-1 du Code Pénal将其判处至少2年的监禁;以及大多数其他国家有类似的法律)

内核模块将信息发送到另一个进程[....]它将它保存到数据库

这实际上很难获得(你看起来很困惑)。数据库位于用户区(例如,像PostGresSQL这样的一些RDBMS,或者访问像sqlite这样的文件库)。请注意,内核驱动程序无法(轻松可靠地)访问文件。

Linux上的所有应用程序(以及大多数守护进程和服务器)都是用execve(2)启动的(例如通过一些unix shell进程,或者某些守护进程等等),我认为没有理由让你做出异常。但是,一些程序(主要是init,还有一些其他程序,例如/sbin/hotplug)是由内核启动的,但这是特殊的(应该避免,你不需要它)。

  1. 如何从内核调用进程

你不应该这样做。我认为你的程序没有理由避免被execve从其他进程(也许你的init,例如systemd)开始。

并向他发送数据?

正如所有其他进程一样,您的进程通过system calls(在syscalls(2)中列出)与内核进行交互。因此,您的应用程序可以使用read(2)write(2)poll(2)等。请注意netlink(7)

  1. 如何从进程中向内核返回消息?

你没有。使用由应用程序代码启动的系统调用。

如果用户未经过身份验证,内核将锁定计算机。

这没有任何意义。 Screen locking是一个GUI工件(因此不是由内核代码完成的,而是由ad-hoc守护进程完成的)。当然,启用锁定时,某些进程会继续运行。许多进程是daemonsservers,它们不属于“该”用户(并且在“计算机被锁定”时继续运行)。从本质上讲,Linux和POSIX是一个multi-usermulti-tasking操作系统。即使在单个物理人员使用的桌面Linux系统上,您也有数十个用户(即uid-s中的许多用户专门针对特定功能,查看您的/etc/passwd文件,请参阅passwd(5))和一百多个进程(每个用户都有它的pid),使用top(1)ps(1)作为ps auxw列出它们。


我相信你有错误的方法。从应用程序的角度来看,需要几天或几周才能了解有关Linux的更多信息。所以阅读一些关于Linux编程的书,例如: ALP或更新的东西。阅读类似:Operating Systems: Three Easy Pieces

请注意,在实践中,大多数具有desktop environment的Linux系统都使用了一些display server。所以(物理)键盘由X11Wayland服务器处理。您需要阅读有关显示服务器的更多信息(使用X11,例如EWMH)。

因此,您需要更加具体。您可能需要与显示服务器进行交互,而不是直接与内核进行交互。

最后,一条经验法则是避免使用额外且无用的驱动程序代码使内核膨胀。你很可能完全可以在用户区做你的事。

因此,在编写单行代码之前,花一周或更长时间阅读有关操作系统和Linux的内容。避免内核模块,他们会咬你,你可能不需要它们(但你可能需要破解你的显示服务器或只是你的window manager;当然细节与X11和Wayland不同)。另请阅读有关multiseat Linux系统的信息。

最后,大多数Linux发行版都是由free software构成的,你可以学习它的源代码。因此,请花时间查看相关软件的源代码,以了解(定义不明确的)目标。还可以使用strace(1)来了解命令和进程动态完成的系统调用。

以上是关于将变量从linux内核传递给进程的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量从活动传递到片段不能解决以前的所有问题

将变量传递给现代中继中的片段容器

main函数由哪个进程创建?

Android Java将变量从片段传递到活动[重复]

LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段

Linux内核简介