首先,大致有以下一些地方需要用到Linux内核编程:
  • 驱动开发,linux下的大部分驱动都是以内核模块的形式执行的。
  • 使用了一些特权指令的程序,比如wrmsr这些指令,这些指令需要在ring0下执行,一般这种程序也是以内核模块的形式执行。
下面简要介绍一下,一个Hello world的内核模块开发并且添加的过程(其实网上很多教程,但是发现都是针对比较老的内核,有些已经不适用了,因此,在此处,我在罗唆一下,也当是个备忘)。
  1. 首先需要安装开发库和头文件。
    $:sudo apt-get install linux-kernel-devel
    $:sudo apt-get install linux-headers-`uname -r`
  2. 写个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
    
  3. 编译:编译的话,首先写哥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
  4. make,没有错误的话,可以通过下面命令将模块加载到内核。
    sudo insmod hello_kernel.ko
  5. 可以在dmesg或者cat /var/log/kern.log查看printk打印的信息。需要卸载模块的话,可以:
    sudo rmmod hello_kernel
更多更仔细的介绍的可以参看这篇文章(虽然中间有些说法现在直接用的话会有些问题。)