news 2026/9/26 17:00:50

嵌入式Linux基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式Linux基础

第1章

Linux是一种性能优良、源码公开、多用户、多任务操作系统,目前主要运用在大型服务器领域、网络处理应用和嵌入式系统。为了加强在嵌入式系统领域的优势,Linux 2.6已经在内核中加入了提高中断性能和调度响应时间的改进,加入了对多种微控制器的支持。

1.1 驱动程序的概念

设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。
编写设驱动必须掌握操作系统的工作原理,并对硬件设备的运行机制清楚。开发设备驱动程序必须注意代码的安全性。因为驱动程序的错误往往导致整个操作系统崩溃。另外,同一个设备驱动可能被不同的进程调用,所以开发设备驱动程序必须考虑并发问题的处理。

1.2 Linux驱动程序模型

在Linux操作系统中,设备驱动程序对各种不同设备提供了一致的访问接口,把设备映射为一个特殊的设备,用户程序可以像对其他文件一样对此设备文件进行操作。Linux支持三类硬件设备:字符设备 、块设备及网络设备。
网络设备在做数据包发送和接收时,直接通过接口访问,不需要进行文件的操作;而对字符设备和块设备的访问都需要通过文件操作界面。
Linux系统为每个设备分配了一个主设备号与次设备号,主设备号唯一标识了设备类型,次设备号标识具体设备的实例。
在驱动程序中,可以用下列宏获得驱动的设备号:
MAJJOR(dev_t dev);
MINOR(ddev_t dev);
Linux 2.6内核开发了全新的设备模型,它采用sysfs文件系统,类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式提供详细的内核数据结构信息。
Linux 2.6引入新的设备管理机制Kobject,通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,是构成Linux2.6内核设备模型的核心机构,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。kobject通常通过kset组织成层次化的结构,kset是具有相同类型的kobject的集合。
struct kobject{
char * k_name;
char * name[KOBJ_NAME_LEN];
atomic_t refcount;
struct list_head entry;
struct kobject * parent;
struct kset * kset;
struct kobj_type * ktype;
struct dentry * dentry
};
struct kset{
struct subsystem * sussys;
sturct kobj_type * ktype;
struct list_head list;
struct kobject koj;
struct kset_hotplug_ops * hotplug_ops;;
};
在这些内核对象机制的基础上,Linux的设备模型(include/linux/device.h)包括设备结构devices、驱动结构drivers、总线结构buses、设备类结构classes几个关键组件。Linux中的任一设备在设备模型中都由一个device对象描述,其对应的数据结构struct device定义为:
struct device{
struct list_head node; //在同类设备列表中的节点
struct list_head bus_list; //在总线列表中节点
struct list_head driver_list;
struct list_head children;
struct device * parent; //父设备
struct kobject kobj;
char bus_id[BUS_ID_SIZE]; //父总线上的ID
struct bus_type * bus; //设备挂接的总线类型
struct device_driver * driver //分配本设备的驱动
void * driver_data;//私有数据
void * platform_data; //平台特定数据(包括与设备相关的ACPI,BIOS数据)
struct dev_pm_info power;
u32 power_state; //电源状态,在ACPI中包括D0~D3,D0表示全功能,D3表示停止
unsiged char * saved_state; //设备状态
u32 detach_state; //设备删除时进入的状态
u64 *dma_mask; //DMA掩码
u64 coherent_dma_mask; //类似DMA掩码,用于alloc_coherennt_mappings
struct list_head dma_pools; //DMA池
void (*release) (struct device * dev);
};
//注册与注销函数
int device_register(struct device * dev);
void device_unregister(struct device * dev);
系统中的每个驱动程序由一个device_driver对象描述,对应的数据结构定义为:
struct device_driver{
char * name; //设备驱动程序的名称
struct bus_type * bus; //该驱动所管理的设备挂接的总线类型
struct semaphore unload_sem;
struct kobject kobj; //内嵌kobject对象
struct list_head devices; //该驱动所管理的设备链表头
int (*probe) (struct device * dev); //指向设备探测函数,探测设备是否可以被该驱动程序管理
int (*remove) (struct device * dev); //用于删除设备的函数
void (*shutdown) (struct device * dev); //停止设备的函数
int (*suspennd) (struct device * dev, u32 state, u32 level); //挂起设备的函数
int (*resume) (struct device * dev, u32 level); //恢复设备的函数
};
//注册与注销函数
int driver_register(struct device_driver * drv);
void driver_unregister(struct device_driver * drv);
系统中总线由struct bus_type描述,定义为:
struct bus_type{
char * name; //总线类型的名称
struct subsystem subsys; //与该总线相关的subsystem
struct kset drivers; //所有与该总线相关的驱动程序集合
struct kset devices; //所有挂接在该总线上的设备集合
struct bus_attribbute * bus_attrs; //总线属性
struct device_attribute * dev_attrs; //设备属性
struct drvier_attribute * drv_attrs; //驱动程序属性
int (match) (struct device * dev, struct device_driver * drv);
int (
hotplug) (struct device * dev, char **ennvp, int num_envp, char *buffer, int buffer_size);
int (suspend) (struct device * dev, u32 state);
int (
resume) (struct device * dev);
};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 17:00:47

Nexus vs Hadess:制品管理工具选型与容器镜像仓库对比

1. 先别急着比工具:制品管理工具到底在管什么"制品管理工具"这几个字听起来很后端,实际上天天跟前端、后端、运维、测试都打交道。我之前在一家公司同时跑着 Java、Node、Python 三条业务线,第一周就发现:Jenkins 构建完…

作者头像 李华
网站建设 2026/9/26 16:59:21

SSM+Django混合架构:订餐管理系统全栈实战与调试指南

1. 为什么选订餐管理系统:一个能打通全栈的项目选题 每年毕业季和课程设计高峰期,我都能在技术社区看到大量关于“做什么选题”的求助帖。我的建议一直很明确: 选一个业务闭环完整、技术栈覆盖全面、演示效果直观的系统 。订餐管理系统恰好…

作者头像 李华
网站建设 2026/9/26 16:56:25

从零开始用Docker Compose部署Cloudreve,打造你的私人云盘

最近好几个朋友跑来问我,说网盘空间越来越少,下载还限速,想把文件放在一个真正属于自己的私人云盘里。其实这件事真没有想象中那么高门槛:你不需要专门买一台昂贵的NAS,只要手头有一台能跑Docker的Linux机器&#xff0…

作者头像 李华
网站建设 2026/9/26 16:56:13

Jev:给AI编程助手装一个决策层,让Claude Code和Codex先想再做

最近调 AI Coding Agent 调得比较多,Claude Code 和 Codex 这两个命令行工具给我的感觉是:下限很高,但上限全靠“你能不能把任务说清楚”。你跟它说“帮我重构一下登录模块”,它真可能把整个文件给你重写一遍;你跟它说…

作者头像 李华
网站建设 2026/9/26 16:54:38

硬件看门狗与复位芯片:解决嵌入式系统死机、误启动和上电异常

干嵌入式这行,谁没被系统死机、误启动、上电异常这三件事折腾过。产品调得好好的,一上电偶尔起不来;或者跑着跑着突然死机,只能断电重启;还有那种电压稍微抖一下就错误复位、乱启动的,查起来让人头皮发麻。…

作者头像 李华
网站建设 2026/9/26 16:54:18

SQLiteDatabase 配 TaoToken:settings.json 骨架与连通性验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华