如何在用户空间程序中使用内核libcrc32c(或相同功能)? [英] How to use kernel libcrc32c (or same functions) in userspace programmes?

查看:56
本文介绍了如何在用户空间程序中使用内核libcrc32c(或相同功能)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在自己的用户空间程序中进行一些CRC检查.而且我发现内核crypto lib已经在系统中,并且具有SSE4.2支持.

I want to do some CRC check in my own userspace programme. And I find that the kernel crypto lib is already in the system, and come with SSE4.2 support.

我试图直接#include <linux/crc32c.h>并用-I/usr/src/linux/include/运行gcc.但是,它不起作用.

I tried to directly #include <linux/crc32c.h> and run gcc with -I/usr/src/linux/include/. However, it doesnot work.

使用某种libcrc32c的任何方式吗?

Any way to use some kind of libcrc32c ?

推荐答案

您可以通过Linux上的套接字家族AF_ALG在用户空间中使用内核加密CRC32c(以及其他哈希/密码函数):

You can use kernel crypto CRC32c (and other hash/cipher functions) from user-space via socket family AF_ALG on Linux:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/socket.h>
#include <linux/if_alg.h>
#include <sys/param.h>
#include <string.h>
#include <strings.h>

int
main (int argc, char **argv) {

    int sds[2] = { -1, -1 };

    struct sockaddr_alg sa = {
        .salg_family = AF_ALG,
        .salg_type   = "hash",
        .salg_name   = "crc32c"
    };

    if ((sds[0] = socket(AF_ALG, SOCK_SEQPACKET, 0)) == -1 )
        return -1;

    if( bind(sds[0], (struct sockaddr *) &sa, sizeof(sa)) != 0 )
        return -1;

    if( (sds[1] = accept(sds[0], NULL, 0)) == -1 )
        return -1;

    char *s = "hello";
    size_t n = strlen(s);
    if (send(sds[1], s, n, MSG_MORE) != n)
        return -1;

    int crc32c = 0x00000000;
    if(read(sds[1], &crc32c, 4) != 4)
        return -1;

    printf("%08X\n", crc32c);
    return 0;
}

如果要散列文件或套接字数据,则可以使用零复制方法来加快速度,从而避免使用sendfile和/或splice进行内核->用户空间缓冲区复制.

If you're hashing files or socket data you can speed it up using zero-copy approach to avoid kernel -> user-space buffer copy with sendfile and/or splice.

快乐的编码.

这篇关于如何在用户空间程序中使用内核libcrc32c(或相同功能)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆