环境搭建
安装必要的软件
sudo apt-get update
sudo apt-get install gawk wget git diffstat
unzip texinfo \
gcc-multilib build-essential chrpath socat
libsdl1.2-dev \
xterm ncurses-dev lzop
环境
- 可以自己下载源码自己编译(可以自己百度)
- 可以之间使用/usr/src理的文件
- 一键小白模式:sudo apt-get install linux-headers-$(uname -r)
源码结构
- arch 支持的体系结构
- block 包含存储设备代码,实际上也即是调度算法
- crypto 存放包含命令API和加密算法代码
- Documentation 包含不同内核框架和子系统使用API的描述
- drivers 最重要的目录,设备驱动都在这个目录
- fs 包含内核支持的不通过文件系统的实现
- include 包含内核的头文件
- init 包含初始化和启动代码
- ipc 包含进程间通讯(IPC)机制的实现,入消息队列、信号量和共享内存
- kernel 包含基本内核中与体系架构无关的部分
- lib 包含库函数和一些辅助函数,分别是内核对象处理程序和循环冗余计算函数
- mm 该目录包含网络协议相关代码
- scripts 包含在内核开发过程中使用的脚本和工具,还有其他有用工具
- security 包含安全框架相关代码
- sound 包含音频子系统代码
- usr 目录包含了initramfs的实现
基础
内核驱动和用户空间
内核有是特权的,而用户程序则时受限的。
- 内核空间:内核驻留和运行的地址空间。内核内存(或内核空间)时由内核拥有的内存范围,受访问标志保护,防止任何用户程序有意或无意于内核搞混。另一方面,内核可以访问整个系统内存,因为它在系统上以更高的优先权运行。在内核模式下,CPU可以访问整个内存(内核空间和用户空间)
- 用户空间:正常程序(如gedit等)被限制运行(地址)空间。可以将其视为沙盒或监狱,以便用户程序不能混用其他程序拥有的内存或任何其他资源。在用户模式下,CPU只能访问标有用户空间访问权限的内存。用户应用程序运行到内核空间唯一方法时通过系统调用,其中一些调用是read、write、open、close和mmap等。用户空间代码以较低的优先级运行。当进程系统调用是,软件中断被发送到内核,这将打开特权模式,以便该进程在内核空间中运行。系统调用返回时,内核关闭特权模式,进程再次受限。
模块
手动加载
sudo insmod project.ko
手动卸载
sudo rmmod project.ko
例子
#include
#include
#include
static int __init helloworld_init(void) {
pr_info("Hello world!\n");
return 0;
}
static void __exit helloworld_exit(void) {
pr_info("End of the world\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_AUTHOR("haclm");
MODULE_LICENSE("GPL");
编译
使用make工具进行编译
obj-m = project_name.o
all:
make -C /lib/modules/6.1.0-25-amd64/build M=$(PWD) modules
clean:
make -C /lib/modules/6.1.0-25-amd64/build M=(PWD) clean
或者
ARCH=x86
CROSS_COMPILE=
KVERSION = $(shell uname -r)
KERN_DIR = /lib/modules/$(KVERSION)/build
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += helloworld.o
编译命令
make
现象
编译好后将模块手动加载,使用下列命令可以看到现象
sudo dmesg