小编Dew*_*mar的帖子

编译器/链接器如何解析内核API,例如从linux上的模块调用的'printk'

我编写了一个示例hello.ko内核模块:

#include <linux/module.h>      /* Needed by all modules */
#include <linux/kernel.h>      /* Needed for KERN_INFO */

int init_module(void)
{
        printk(KERN_INFO "Hello world.\n");
        return 0;
}

void cleanup_module(void)
{
        printk(KERN_INFO "Goodbye world 1.\n");
}
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了"printk"方法,这是Linux公开的内核API.我可以在"/ proc/kallsyms"中看到Linux导出的符号.我很想知道gcc/ld如何链接被调用的内核API?gcc/ld是从"/ proc/kallsyms"或其他文件获取内核方法的地址并执行链接吗?如果是的话,gcc/ld怎么知道呢?我无法说出任何选择.

kernel kernel-module linux-device-driver linux-kernel

3
推荐指数
1
解决办法
1399
查看次数

为什么 &lt;linux/socket.h&gt; 文件没有定义套接字类型?

Linux 提供的头文件“/usr/include/linux/socket.h”包含支持的地址族和协议族的定义:

/* Supported address families. */
#define AF_UNSPEC       0
....

/* Protocol families, same as address families. */
#define PF_UNSPEC       AF_UNSPEC
...
Run Code Online (Sandbox Code Playgroud)

但是为什么不定义套接字类型呢?

我可以在“/usr/include/bits/socket.h”中找到它的定义

enum sock_type {
    SOCK_DGRAM  = 1,
    SOCK_STREAM = 2,
    SOCK_RAW    = 3,
    SOCK_RDM    = 4,
    SOCK_SEQPACKET  = 5,
    SOCK_DCCP   = 6,
    SOCK_PACKET = 10,
};
Run Code Online (Sandbox Code Playgroud)

我想知道为什么Linux提供的头文件中没有定义这些?

c sockets

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