Capa de aplicación de capa de kernel de Linux

La capa del núcleo llama a los programas de la capa de aplicación

Blog de referencia: el
controlador de Linux llama (ejecuta / ejecuta) aplicaciones .
Solo necesita ejecutar esta función en la capa del kernel:

extern int call_usermodehelper(char *path, char **argv, char **envp, int wait);

Programa de capa de núcleo:

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kmod.h>

MODULE_AUTHOR("darui");
MODULE_LICENSE("GPL");

static int __init practiceCall(void)
{
    
    
		int ret = 0;
        char *path = "/home/darui/practice/a";
        char *arv[] = {
    
    path,"",NULL};//无参数,注意要按照这个格式path在 第一个位置,必须NULL结束
        char *env[] = {
    
    "/home/darui","/usr/local/sbin",NULL};//多路径可以用逗号隔开,也可以在一对引号中用分号隔开,必须NULL结束标志

        printk("%s:call_usermodehelper\n",__func__);
        ret = call_usermodehelper(path,arv,env,UMH_WAIT_PROC);
        if(ret < 0)
        {
    
    
        	printk("error");
        	return -1;
        }
        return 0;
}

static void __exit practiceCallExit(void)
{
    
    
        printk("%s:call_usermodehelper\n",__func__);
}

module_init(practiceCall);
module_exit(practiceCallExit);

Tenga en cuenta que hay una trampa, el programa de ejecución no puede ser a.sh y otros programas, solo debe ser un programa compilado y se producirá un error cuando se ejecute el script de shell (ha estado atascado durante mucho tiempo)

Código fuente del programa de la capa de aplicación:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    
    
        int fd = -1;

        fd = open("/home/darui/practice/file.txt",O_RDWR|O_CREAT);
        write(fd,":practice\n",10);
        close(fd);
}

gcc -oa ac se puede compilar y se creará el archivo file.txt

Principio:
call_usermodehelper
——》 call_usermodehelper_setup + call_usermodehelper_exec
————》 queue_work
——————》 __ call_usermodehelper
————————》 do_execve
————————————
1. En la pila de proceso Push en el programa de la capa de aplicación,
2. La instrucción iret guarda el kernel en el sitio para el cambio de pila,
3. Después de que se ejecuta la capa de aplicación, ret_from_sys_call devuelve

Parche el hoyo

Parche el hoyo

Supongo que te gusta

Origin blog.csdn.net/qq_42882717/article/details/114062512
Recomendado
Clasificación