Linux驱动开发1-内核入门之hello模块

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一、Linux内核简介

    现在我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。如下图所示,最上面是用户(或应用程序)空间,这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。C基础库(如glibc、eglibc、uclibc等)也属于应用程序空间,它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。

    Linux 内核可以进一步划分成 3 层。最上面是系统调用接口(SCI,System Call Interface),它实现了一些基本的功能,例如 open()、read()、write()、close()等。系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。


    Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。每种内核都有自己的优点,不过这里并不对此进行讨论。随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供 MMU 的处理器上运行。Linux 内核的 uClinux 移植提供了对非MMU 的支持。


系统调用接口

    SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。

进程管理

    进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSIX] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。进程管理还包括处理活动进程之间共享 CPU 的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O(1) 调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。 O(1) 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于体系结构的源代码。

内存管理

    内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页 方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。Linux系统中,被用于交换的分区叫swap分区,在windows系统下叫做虚拟内存。内存管理的源代码可以在 ./linux/mm 中找到。

文件系统

    虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。在 VFS 上面,是对诸如open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。

网络管理

    网络堆栈在设计上遵循模拟协议本身的分层体系结构。回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在 ./linux/net中找到。

设备管理(驱动程序)

    Linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。设备驱动程序的代码可以在 ./linux/drivers 中找到。

二、Linux内核编程

    Linux是"单块内核"的操作系统,这是说整个系统内核都运行于一个单独的保护域中,但是linux内核是模块化组成的,它允许内核在运行时动态地向其中插入或从中删除代码。这些代码(包括相关的子线程、数据、函数入口

Linux驱动开发1--内核入门hello模块 Linux驱动开发1--内核入门hello模块3.1 创建项目驱动程序工作路径[wudongxu@centos6_master ~]$ cd gitee/fl2440/[wudongxu@centos6_master fl2440]$ ls3rdparty bootloader crosstool LICENSE linux README.md x86_tools[wudongxu@centos... 阅读详情

相关推荐

嵌入式LINUX驱动开发(一)之hello驱动(基于IMX6ULL-MINI开发板)

比如驱动程序中这样包含头文件: #include <asm/io.h>, 其中的asm是一个链接文件,指向asm-arm或asm-mips,这需要先配置、编译内核才会生成asm这个链接文件。开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译的,这两个内核不一致时会导致- -些问题。库可以和系统内核相连接,我们写了一个驱动程序,就需要告诉内核,这个过程叫做注册。其实应用程序到库是比较容易理解的,比如我们刚学习C语言的时候,使用了printf,scanf等等这些函数。而这些函数就在库中。

Lllongroad的博客 1540

Linux驱动开发hello.ko模块编程详解

在本文中,我们将详细介绍如何编写一个简单的Linux内核模块,命名为hello.ko,并提供相应的源代码。此外,为了确保安全性和稳定性,编写的驱动代码应该经过充分的测试和验证。在这段代码中,我们使用了几个重要的Linux内核头文件(init.h,module.h和kernel.h),它们提供了开发驱动所需的函数和宏定义。进入新创建的文件夹后,我们可以使用文本编辑器创建一个名为hello.c的文件,其中包含我们的驱动代码。至此,我们已经完成了一个简单的Linux内核驱动模块的编写、编译、加载和卸载过程。

TechProX的博客 323

[Linux驱动开发一]最简单的内核模块

[Linux驱动开发一]最简单的内核模块

weixin_42857944的博客 3386

三、Linux内核模块编写(一个c文件生成一个ko文件)

Linux模块编写

qq_1033275663的博客 3682

Linux下的hello驱动开发

学习内核编程的最简单的方式也许就是写个内核模块:一段可以动态加载进内核的代码。模块所能做的事是有限的——例如,他们不能在类似进程描述符这样的公共数据结构中增减字段(LCTT译注:可能会破坏整个内核及系统的功能)。但是,在其它方面,他们是成熟的内核级的代码,可以在需要时随时编译进内核(这样就可以摒弃所有的限制了)。完全可以在Linux源代码树以外来开发并编译一个模块(这并不奇怪,它称为树外开发),如果你只是想稍微玩玩,而并不想提交修改以包含到主线内核中去,这样的方式是很方便的。

想坐在电脑前吹空调 536

001_Linux驱动编程_hello.ko

linux驱动开发实践

qq_47325567的博客 245

Linux 内核模块ko在内核源码外部编译的方法

Linux 内核模块ko在内核源码外部编译的方法

zhangsz的博客 3628

Linux PCIe设备驱动开发:从入门到企业级实战 专栏--第一部分:基础篇 - 建立核心概念 第2章:Linux内核模块编程 2.1 Hello World模块:编译、加载、卸载

本文介绍了Linux内核模块开发的基本流程,通过一个"Hello World"模块示例展示了完整开发周期。主要内容包括:1)编写模块代码,定义初始化函数和退出函数;2)创建Makefile文件配置编译环境;3)使用make命令编译生成.ko模块;4)通过insmod/rmmod命令加载和卸载模块;5)使用dmesg查看内核日志输出。文章还提供了常见问题解决方案,强调了模块许可证声明的重要性。这个基础示例为后续更复杂的驱动开发(如PCIe驱动)奠定了基础。

MHD0815的博客 395

基于QEMU的Linux Driver开发环境的配置

Setup Driver development Environment Software: QEMU + Vexpress

Jun's blog 1608

Linux内核驱动模块开发入门Hello模块实战

Linux操作系统中,内核驱动模块是一种特殊的程序,它可以在系统运行时动态地加载到内核中,也可以从内核中卸载,而无需重新启动系统。Linux内核驱动模块的主要作用是扩展内核功能,实现硬件设备的驱动程序、文件系统等核心功能的模块化管理。内核驱动模块可以根据其功能和作用被分类为文件系统模块、设备驱动模块、网络协议模块等。在Linux内核编程中,特定的数据类型和宏定义是必不可少的。这些定义通常包含在特定的头文件中,为内核开发人员提供了丰富的资源。比如,头文件定义了标准的整数类型如u8u16。

weixin_42573757的博客 1118

2-内核开发-第一个内核Hello模块开发案例

以上就是一个最简单的内核模块开发完成。这个hello模块没有干什么事情,只是简单的打印了模块加载卸载过程中,输出日志,标识内核已经调用此方法。通过这个实验,我们知道了如何编写内核模块内核模块Makefile 如何编写,如何加载内核模块,卸载内核模块,如何查找内核模块

jxusthusiwen的专栏 1267

Linux设备驱动开发入门——Hello world

      近期做的工作主要有两个,一是将dvsdk_4中的video_copy项目移植到自己的板子上,在参考资料极其匮乏的情况下,本人继续发扬艰苦奋斗的作风和打不死的小强精神,终于将Omap3530中的DSP成功地跑起来了。另一个工作就是开始学习Linux设备驱动开发,为编写新设备的驱动做准备。dvsdk的内容比较庞杂,所做的工作还在整理之中,后面我会发出来。Linux设备驱动开发的资料很多

liuqiqi677的专栏 8590

Linux设备驱动开发入门之——hello驱动

1. Linux驱动程序的分类 Linux 中主要分为三大类驱动:字符设备驱动、块设备驱动和网络设备驱动1、字符设备驱动:因为软件操作设备是是以字节为单位进行的,是按照字节流进行读写操作的一种设备。典型的如LCD、蜂鸣器、SPI、触摸屏等驱动,都属于字符设备驱动的范畴。大部分的驱动程序都是属于字符设备驱动。 2、块设备驱动:块设备驱动是相对于字符设备驱动而定义的,因为块设备被软件操作时,是以块为单位进行操作的(块指的是多个字节组成一个块)。块设备大多指的都是各种存储类类设备,比如EMMC、SD卡、NAN

luobeihai的博客 3912

linux内核驱动模块开发步骤及实例入门介绍

Linux内核模块简介Linux内核的整体结构已经非常庞大,而其包含的组件也非常多。我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。有没有一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中呢?

不积跬步,无以至千里! 1万+

Linux内核驱动模块开发 - hello world

本文介绍了如何编写一个简单的hello world内核驱动程序,并将其编译为内核模块。在Linux内核驱动程序开发中,开发环境的搭建是非常重要的,因为它们提供了编译和调试所需的工具。同时,编写内核驱动程序时需要遵循一些规则和指导原则,以确保其与Linux内核兼容。在实际的内核驱动开发过程中,可能会遇到更加复杂的问题和需求。因此,需要进一步学习和了解Linux内核驱动程序的开发技巧和方法。Linux内核源代码Linux内核文档Linux内核驱动开发

u014034516的博客 1601

Linux 驱动入门1)—— hello驱动

在这里主要记录学习韦东山老师Linux驱动课程的笔记,韦东山老师的驱动课程讲的非常好,想要学习驱动的小伙伴可以去b站学习他的课程。

wei_Embedded_z的博客 1618

Linux驱动开发基础(Hello驱动)

此篇文章对Linux驱动开发基础做一个入门,了解如何编写驱动程序和应用,对Hello驱动进行编写不涉及硬件操作,所学内容来自百问网

weixin_62822414的博客 2743

Linux驱动开发入门:从Hello World模块理解内核编程基础

操作系统内核是计算机系统的核心,负责管理硬件资源和提供基础服务。内核模块作为内核的扩展组件,遵循特定的生命周期管理机制,通过module_init和module_exit宏定义加载与卸载入口。这种机制使得开发者能够在不重启系统的前提下动态添加或移除功能,极大提升了系统的灵活性和可维护性。在工程实践中,内核模块开发驱动开发、性能优化和系统定制的基础。通过编写最简单的Hello World内核模块开发者可以掌握模块编译、加载、卸载的全流程,理解printk日志输出、内核API调用等核心概念,为后续学习字符设

weixin_33901641的博客 329
上一篇: FL2440 嵌入式Linux根文件系统制作
下一篇: Linux驱动开发2-字符驱动入门之低级LED
zusi_csdn
博客等级 码龄9年 32粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值