我编写了一个示例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怎么知道呢?我无法说出任何选择.
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提供的头文件中没有定义这些?