linux驱动开发介绍上



环境搭建

安装必要的软件

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

环境

  1. 可以自己下载源码自己编译(可以自己百度)
  2. 可以之间使用/usr/src理的文件
  3. 一键小白模式: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

文章作者: D.riven
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 D.riven !
  目录