首先,大致有以下一些地方需要用到Linux内核编程:
- 驱动开发,linux下的大部分驱动都是以内核模块的形式执行的。
- 使用了一些特权指令的程序,比如wrmsr这些指令,这些指令需要在ring0下执行,一般这种程序也是以内核模块的形式执行。
下面简要介绍一下,一个Hello world的内核模块开发并且添加的过程(其实网上很多教程,但是发现都是针对比较老的内核,有些已经不适用了,因此,在此处,我在罗唆一下,也当是个备忘)。
- 首先需要安装开发库和头文件。
$:sudo apt-get install linux-kernel-devel
$:sudo apt-get install linux-headers-`uname -r`
- 写个hello_kernel.c(我保留了我代码中的获取cpuID的代码,所以严格不算helloword了),下面代码中printk是内核中的printf,打印的信息回打到内核log中,可以通过dmesg或者cat /var/log/kern.log查看。module_init以及module_exit分别为内核进入以及退出的函数。
#include
//#include //这个头文件在老的内核中有,新的内核已经没有了,因此注释调
#include
void bcopy(unsigned char *src,unsigned char *des,int count)
{
int i=0;
for (i=0;i
- 编译:编译的话,首先写哥makefile:
obj-m += hello_kernel.o
CUR_PATH := $(shell pwd)
KERN_VER := $(shell uname -r)
KERN_PATH := /usr/src/linux-headers-$(KERN_VER)
all:
make -C ${KERN_PATH} M=${CUR_PATH} modules
clean:
make -C ${KERN_PATH} M=${CUR_PATH} clean
- make,没有错误的话,可以通过下面命令将模块加载到内核。
sudo insmod hello_kernel.ko
- 可以在dmesg或者cat /var/log/kern.log查看printk打印的信息。需要卸载模块的话,可以:
sudo rmmod hello_kernel
更多更仔细的介绍的可以参看
这篇文章(虽然中间有些说法现在直接用的话会有些问题。)