首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux下驱动开发_设备驱动开发(内存模拟存储)

一、前言 设备驱动Linux下3大设备驱动框架之一,设备主要是针对存储类型的设备设计的驱动,配合文件系统完成数据存储。...所以大致总结下:设备驱动的目的是给Linux文件系统提供底层接口。 二、编写设备驱动的思路 既然学到了驱动开发,了解到设备开发。...那么为了方便介绍设备的驱动开发,我这里会先用malloc在驱动申请一内存来当做FLASH设备,这样就不需要接任何硬件,降低了难度,纯软件的方式理解驱动框架运作流程。...3.1 驱动代码 这份代码里存储数据的空间是申请了一段内存来模拟的。...看懂设备框架,使用的模拟的内存。 2.​ 加入SD卡的驱动,配合设备框架,完成完整的设备驱动编写。

4.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    7.1 实现进程内存枚举

    在Windows操作系统中,每个进程的虚拟地址空间都被划分为若干内存,每个内存都具有一些属性,如内存大小、保护模式、类型等。这些属性可以通过VirtualQueryEx函数查询得到。...图片接着我们进入本章的重点,实现枚举进程内存,要实现该功能首先读者必须要了解一个结构体_SYSTEM_INFO该结构体是系统信息结构,可用于存储系统硬件和系统配置信息,而我们所需要的内存数据同样可以使用该结构进行存储...当我们需要了解特定进程的内存使用情况时,可以使用VirtualQueryEx()函数枚举进程内存中的所有内存,并按需查询其中的属性值。...= (LPVOID)Addres; DWORD BlockAddress = Addres; DWORD dwBlockSize = 0; // 遍历大内存中的小内存...0;}当上述代码运行后,我们就可以获取到当前内存中有多少个内存,以及每一个内存的属性信息,如下图所示;图片本文作者: 王瑞本文链接: https://www.lyshark.com/post/c09766a2

    42220

    7.1 实现进程内存枚举

    在Windows操作系统中,每个进程的虚拟地址空间都被划分为若干内存,每个内存都具有一些属性,如内存大小、保护模式、类型等。这些属性可以通过VirtualQueryEx函数查询得到。...接着我们进入本章的重点,实现枚举进程内存,要实现该功能首先读者必须要了解一个结构体_SYSTEM_INFO该结构体是系统信息结构,可用于存储系统硬件和系统配置信息,而我们所需要的内存数据同样可以使用该结构进行存储...当我们需要了解特定进程的内存使用情况时,可以使用VirtualQueryEx()函数枚举进程内存中的所有内存,并按需查询其中的属性值。...函数对这个大内存内的子内存进行更加细致的解析效果,这段代码如下所示; #include #include int main(int argc, char...; return 0; } 当上述代码运行后,我们就可以获取到当前内存中有多少个内存,以及每一个内存的属性信息,如下图所示; 本文作者: 王瑞 本文链接: https://www.lyshark.com

    24650

    【C语言】memcpy()函数(内存拷贝函数)

    我们先来看一下cplusplus.com - The C++ Resources Network网站上memcpy()函数的基本信息: 函数功能 可以看到,memcpy()函数的功能是: 从源头指向的内存拷贝固定字节数的数据到目标指向的内存...,它的作用是为函数提供目的地的内存起始地址,以便函数能够准确地将内容拷贝到我们需要的内存空间....,它的作用是为函数提供拷贝源头内存起始地址,以便函数能够准确找到拷贝的源头进行拷贝....让我们再来看一下文章开头时C语言标准对memcpy()函数的定义: 也就是说,C标准是不要求memcpy()函数能够拷贝重叠内存的,如果我们期望使用可以重叠的内存拷贝函数,那么另一个C标准库函数...综上,在memcpy()函数部分,我将不再深入去探讨内存重叠情况的内存拷贝的原理,图示以及模拟实现.而是将这部分的内容转移至对memmove()函数的详解博客中进行探讨.如果有感兴趣的朋友可以移步这篇博客

    91110

    Linux内存描述之高端内存--Linux内存管理(五)

    不管是用户态还是内核态,最终都是通过MMU映射到你的物理上的896M内存 mmap就可以映射物理内存到用户空间,你可以清楚的看到同一物理内在用户态和内核态的不同逻辑地址 两个不同的逻辑地址(一个介于0...~3G,一个介于3-4G) 通过MMU映射到同一物理内存 1.2 linux为什么把内核映射到3G-4G这个地址呢 假如linux把内核映射到0-1G的空间,其他进程共享1-4G的空间不可以吗?...1G) 2.3 Linux内核高端内存的理解 前 面我们解释了高端内存的由来。...内核专门为此留出一线性空间,从PKMAP_BASE 到 FIXADDR_START, 用于映射高端内存 在2.6内核上, 这个地址范围是4G-8M到4G-4M之间....内核专门为此留出一线性空间,从 PKMAP_BASE 到 FIXADDR_START ,用于映射高端内存。在 2.4 内核上,这个地址范围是 4G-8M 到 4G-4M 之间。

    12.5K23

    Linux 内核 内存管理】memblock 分配器 ② ( memblock_type 内存类型 | memblock_type 结构体成员分析 )

    文章目录 一、memblock_type 内存类型 二、memblock_type 结构体成员分析 1、cnt 成员 2、max 成员 3、total_size 成员 4、regions 成员 5、...name 成员 一、memblock_type 内存类型 ---- memblock 分配器 涉及到 内存 类型 , 在 Linux 内核中 , 使用 struct memblock_type 结构体...描述 , struct memblock_type 结构体 定义在 Linux 内核源码的 linux-4.12\include\linux\memblock.h#40 位置 ; struct memblock_type...最大个数 ; unsigned long max; /* size of the allocated array */ 3、total_size 成员 total_size 成员 表示 当前 所有内存..." ; struct memblock_region *regions; 5、name 成员 name 成员 表示 " 内存类型 " 的名称 ; char *name;

    31420

    Linux - Linux内存管理

    物理内存就是系统硬件提供的内存大小,是真正的内存。 虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一逻辑内存,用作虚拟内存的磁盘空间称为交换空间(Swap Space)。...作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的虚拟内存。更详细地说,就是内核会将暂时不用的内存信息写到交换空间,这样,物理内存得到了释放,这块内存就可以用于其他目的。...为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据自动交换到虚拟内存中,而将经常使用的信息保留到物理内存中。...ibs=m表示一次读入m个字节(即一个大小为m个字节)。 obs=m表示一次写m个字节(即一个大小为m个字节)。 bs=m,同时设置读写的大小,以字节为单位,此参数可代替 ibs 和 obs。...count=n仅复制n个。 skip=n表示从输入文件开头跳过n个后再开始复制。 seek=n表示从输出文件开头跳过n个后再开始复制(通常只有当输出文件是磁盘或磁带时才有效)。

    52.4K41

    技术干货 | 漫游LinuxIO

    本篇文章,我们就一起看下Linux中一个IO请求的生命周期。Linux发展到今天,其内部的IO子系统已经相当复杂。...我们知道IO设备可以分为字符设备和设备,字符设备以字节流的方式访问数据,比如我们的键盘鼠标。而设备则是以为单位访问数据,并且支持随机访问,典型的设备就是我们常见的机械硬盘和固态硬盘。...写入数据所在的内存地址 3....do_blockdev_direct_IO -> dio_bio_submit -> submit_bio 通用层 核心结构 1.bio/request bio是Linux通用层和底层驱动的...struct bio_vec *bi_io_vec; //内存page列表 ... ... }; request代表一个独立的IO请求,是通用层和驱动层进行IO传递的结构,它容纳了一组连续的bio

    1.6K30

    Linux内存描述之内存节点node--Linux内存管理(二)

    CPU访问本地内存的速度比访问远程内存的速度要快 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大....因此linux内核需要用一种体系结构无关的方式来表示内存....因此linux内核把物理内存按照CPU节点划分为不同的node, 每个node作为某个cpu结点的本地内存, 而作为其他CPU节点的远程内存, 而UMA结构下, 则任务系统中只存在一个内存node, 这样对于...系统中的NUMA结点都是从0开始编号的 3.1 linux-2.4中的实现 pgdat_next指针域和pgdat_list内存结点链表 而对于NUMA结构的系统中, 在linux-2.4.x之前的内核中所有的节点...-3.x~4.x的实现 node_data内存节点数组 在新的linux3.x~linux4.x的内核中,内核移除了pg_data_t的pgdat_next之指针域, 同时也删除了pgdat_list链表

    7.9K21

    Linux内存描述之内存页面page--Linux内存管理(四)

    1 Linux如何描述物理内存 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个...内存中的每个节点都是由pg_data_t描述,而pg_data_t由struct pglist_data定义而来, 该数据结构定义在include/linux/mmzone.h, line 615, 每个结点关联到系统中的一个处理器...简单来说, 页是一个数据, 可以存放在任何页框(内存中)或者磁盘(被交换至交换分区)中 我们今天就来详细讲解一下linux下物理页帧的描述 2 页帧 内核把物理页作为内存管理的基本单位....3.2 内存页标识pageflags 其中最后一个flag用于标识page的状态, 这些状态由枚举常量enum pageflags定义, 定义在include/linux/page-flags.h?...如果涉及该page的I/O操作发生了错误, 则该位被设置 PG_referenced 表示page刚刚被访问过 PG_uptodate 表示page的数据已经与后备存储器是同步的, 即页的数据已经从设备读取

    8.4K11

    Linux内存管理

    本篇介绍 本篇介绍下Linux内存管理,用系统角度看内存的寻址和分配机制。 内容介绍 内存管理应该是系统中最难的模块之一了,而且历史也悠久,就先来简单回顾下。...计算机刚出现的时候,并没有这些,刚开始是直接使用的物理地址,也就是代码中操作的地址是可以直接和物理地址对应上的,可是后来随着多进程调度的需求,以及有限的物理内存,于是人们就开始做规定,比如对于一内存,...,如果没指定fd,那就是匿名映射,可以简单理解成就是分配了一内存,当malloc大于128kb时候就不用brk了,直接mmap映射分配内存了。...mmap流程如下: image.png 缺页异常 linux 是在不得不使用物理内存的时候才会分配物理内存。这句话该怎么理解呢?...就是我们用malloc或者mmap映射一内存的时候,只是修改了对应的vma,可是具体的页表项和物理地址并不会立马分配映射,而是在需要写请求的时候才会分配,注意是写请求,那就意味着如果是读请求也不会分配物理内存

    13.8K51

    Linux内存描述之概述--Linux内存管理(一)

    2 (N)UMA模型中linux内存的机构 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大. 因此linux内核需要用一种体系结构无关的方式来表示内存....因此当前的多数系统会把内存系统分割成2区域,一是专门给CPU去访问,一是给外围设备板卡的DMA去访问 在UMA系统中, 内存就相当于一个只使用一个NUMA节点来管理整个系统的内存....内核将每个簇所对应的node又被分成的称为管理区(zone)的,它们各自描述在内存中的范围。...函数EXPORT_SYMBOL使得内核的变量或者函数可以被载入的模块(比如我们的驱动模块)所访问. 2.5 内存页page 大多数内核(kernel)的操作只使用ZONE_NORMAL区域,系统内存由很多固定大小的内存组成的...,这样的内存称作为“页”(PAGE), x86体系结构中,page的大小为4096个字节。

    6.9K30

    Linux内存描述之内存区域zone--Linux内存管理(三)

    因此相对于任何一个CPU访问本地内存的速度比访问远程内存的速度要快, 而Linux为了兼容NUMAJ结构, 把物理内存相依照CPU的不同node分成簇, 一个CPU-node对应一个本地内存pgdata_t...Linux使用enum zone_type来标记内核所支持的所有内存区域 3.1 内存区域类型zone_type zone_type结构定义在include/linux/mmzone.h, 其基本信息如下所示...3.2 不同的内存区域的作用 在内存中,每个簇所对应的node又被分成的称为管理区(zone)的,它们各自描述在内存中的范围。...位系统中, Linux内核虚拟地址空间只有1G, 而0~895M这个986MB被用于DMA和直接映射, 剩余的物理内存被成为高端内存....如果count的值超过了high, 则表明列表中的页太多了 batch 如果可能, CPU的高速缓存不是用单个页来填充的, 而是欧诺个多个页组成的, batch作为每次添加/删除页时多个页组成的大小的一个参考值

    9.4K31
    领券