WIN32和Kernel直接读写硬盘扇区.

(WIN32和Kernel)直接读写硬盘扇区. 第一篇写技术的文章哦,以前好少写文章,我的文字表达很差劲,大家不要笑哦.前几天仙剑4通关了,感觉好惆怅,什么都不想去做.今天看了一下书发现一篇比较好玩的文章,于是自己静静地实践一番.文章是基于硬盘保留扇区的软件保护方法(作者:熊志勇)>,内容是介绍了怎么读写硬盘保留扇区.以下是我的学习日记.这里是摘自文章里的一个表:硬盘的总体结构****************************** 阅读详情
这里是摘自文章里的一个表 : 硬盘的总体结构
***********************************************************************
编号       名称                                       备注
1         
主引导扇区 ( 含硬盘分区表 )             占用一个扇区空间 ( 一个扇区空间为 512 字节 )
2         
保留扇区 ( 操作系统不使用的扇区 )     占用 62 个扇区空间
3         
第一个分区                               C: 盘
4         
扩展主引导扇区 ( 含扩展分区表 )        一个扇区空间 ( 只有存在扩展分区是才存在 )
5         
保留扇区                                  占用 62 个扇区空间
6         
第 2 个分区                                D: 盘
7         
下一个扩展主引导扇区                   只有分区链没结束才存在
8          ......                                    ......
***********************************************************************
通常的软件保护都会向编号为 2 的保留扇区写一些软件注册信息呀 , 等等的东西 .
而要读写这个没被操作系统利用的部分作者已经给出了代码 ( 幸福呀 , 不用自己找 ).
// 以下是已经做好的一个函数
BOOL ReadPhysicalSector(unsignedlong SectorStart, unsignedlong SectorCount, unsignedchar *p)
{
    unsignedlong BytesPerSector = 512;
    unsignedlong nBytes;
    char Drive[] = "////.//PHYSICALDRIVE0";
    BOOL result = FALSE;
    HANDLE hDeviceHandle = CreateFile(Drive,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,0);
    if(hDeviceHandle)
    {
        long pointer;
        long phigh;
        pointer = SectorStart;
        pointer = pointer*BytesPerSector;
        phigh = pointer>>32;
        SetFilePointer(hDeviceHandle,(unsignedlong)pointer,&phigh,FILE_BEGIN);
        if(ReadFile(hDeviceHandle,p,SectorCount*BytesPerSector,&nBytes,NULL))
            result = TRUE;
        CloseHandle(hDeviceHandle);
    }
    return result;
}
 
// 调用就这样
int main(int argc, char* argv[])
{
    unsignedlong SectorStart = 0;// 比如我要读的是编号为的那个扇区开始的数据,这里写
                                  // 如果读的是从第扇区开始后的数据这里就写
    unsignedlong SectorCount = 1;// 读多少个扇区,这里是个
    unsignedchar p[512];// 一个扇区数据量是字节呀
    ReadPhysicalSector(SectorStart, SectorCount, p);
    for(int i=0;i<512;i++)// 输出的
    {
        printf("%02X ",p[i]);
        if(i%26==0)
            printf(" ");
    }
    return 0;
}
以上的代码都是读的,那如果要写就把ReadFile改成WriteFile呀.要注意的是别乱写了分区表了,很难恢复的.小心用WriteFile呀.
以上的我就实现了,其实也是抄人家的代码,5555555没意思,突然间想把这些功能用驱动来实现.
想就快呀,第一时间上网找ZwWriteFile,ZwReadFile的使用啦,想不到在baidu搜的都是怎么hook ZwWriteFile,ZwReadFile他们的文章,555555那个简单啦,不就改改SSDT然后自己定义函数嘛
.
但是......ZwWriteFile,ZwReadFile怎么用的文章几乎没有的.天呀!好惨!
接着我看好久的DDK文档,看了很久ZwWriteFile,ZwReadFile的函数原型,就一步步写出以下的代码出来,经过了n的n次方次的失败后终于......成功读取了第一个扇区的数据了.
#include <ntddk.h>
 
//--------------------------------------------------------------------
VOID ReadPhysicalSector(unsignedlong SectorCount, unsignedchar *p)
{
    unsignedlong BytesPerSector = 512;
    WCHAR* name = L"//??//PHYSICALDRIVE0";// 这个找了好久呀,原来要这样写的
 
    NTSTATUS ntStatus;
    HANDLE hDeviceHandle;
    IO_STATUS_BLOCK IoStatusBlock;
    IO_STATUS_BLOCK IoStatusBlockR;
    OBJECT_ATTRIBUTES ObjectAttributesL;
    UNICODE_STRING UniFileNameL;
 
    LARGE_INTEGER ByteOffset;
 
    RtlInitUnicodeString(&UniFileNameL,name);
    InitializeObjectAttributes( &ObjectAttributesL,
                                &UniFileNameL,
                                OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
                                NULL,
                                NULL);
 
    ntStatus = ZwCreateFile(&hDeviceHandle,
                            GENERIC_READ,
                            &ObjectAttributesL,
                            &IoStatusBlock,
                            NULL,
                            0,
                            FILE_SHARE_READ,
                            FILE_OPEN,
                            FILE_SYNCHRONOUS_IO_ALERT,
                            NULL,
                            0);
   
    if( NT_SUCCESS(ntStatus) )
    {
        DbgPrint("Open Success");
 
        ByteOffset.LowPart = FILE_USE_FILE_POINTER_POSITION;
        ByteOffset.HighPart = -1;
 
        ntStatus = ZwReadFile( hDeviceHandle,
                                NULL,
                                NULL,
                                NULL,
                                &IoStatusBlockR,
                                p,
                                SectorCount*BytesPerSector,
                                &ByteOffset,
                                NULL);
 
        if( NT_SUCCESS(ntStatus) )
        {
            DbgPrint("Read Success");
        }
    }
 
    ZwClose(hDeviceHandle);
}
//--------------------------------------------------------------------
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
    DbgPrint("     88 ");
}
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    unsignedlong SectorCount = 1;
    unsignedchar p[512];
    int i;
   
    DriverObject->DriverUnload = OnUnload;
 
    DbgPrint("Hi");
 
    ReadPhysicalSector(SectorCount, p);
    for(i=0;i<512;i++)
        DbgPrint("%02X ",p[i]);
 
    return STATUS_SUCCESS;
}
终于读取成功了,写就Read改成Write呀,哎....其实我都是刚刚学什么都不会,看了好久DDK文档才挤出上面几行代码.....但是现在我最不明白的就是ZwReadFile中怎么定位指针的位置呢,比如我想在第2个扇区开始读应该怎么写呢?55555555不想啦,很烦啊.....有高手路过就批一下啦,最好教一下我.
好啦今天一起床 , 想了想 , 又看了看 DDK 终于将以上的问题解决了 , 可以任意读取某一个扇区了 ~~~~~~~~~~~ 心情当然非常激动啦 ~~~ 啦 ~~~ 啦 ~
原来错误就在这两句里面 ,DDK 误导人的 , 还是我的英文差呢 ~~~~~~ 好啦 ~~~ 其实 DDK 是这么说的 :
ByteOffset
Pointer to a variable that specifies the starting byte offset in the file where the read operation will begin. If an attempt is made to read beyond the end of the file, ZwReadFile returns an error.
If the call to ZwCreateFile set either of the CreateOptions flags FILE_SYNCHRONOUS_IO_ALERT or FILE_SYNCHRONOUS_IO_NONALERT, the I/O Manager maintains the current file position. If so, the caller of ZwReadFile can specify that the current file position offset be used instead of an explicit ByteOffset value. This specification can be made by using one of the following methods:
● Specify a pointer to a LARGE_INTEGER value with the HighPart member set to -1 and the LowPart member set to the system-defined value FILE_USE_FILE_POINTER_POSITION.
● Pass a NULL pointer for ByteOffset.
ZwReadFile updates the current file position by adding the number of bytes read when it completes the read operation, if it is using the current file position maintained by the I/O Manager.
Even when the I/O Manager is maintaining the current file position, the caller can reset this position by passing an explicit ByteOffset value to ZwReadFile. Doing this automatically changes the current file position to that ByteOffset value, performs the read operation, and then updates the position according to the number of bytes actually read. This technique gives the caller atomic seek-and-read service.
 
// 今天不按照它说的来做,
ByteOffset.LowPart = FILE_USE_FILE_POINTER_POSITION;
ByteOffset.HighPart = -1;
// 改成:
ByteOffset.QuadPart = // 第几个字节;
// 终于成功了:
代码如下:
#include <ntddk.h>
 
//--------------------------------------------------------------------
VOID ReadPhysicalSector(unsignedlong SectorStart,unsignedlong SectorCount,unsignedchar *p)
{
    unsignedlong BytesPerSector = 512;
    WCHAR* name = L"//??//PHYSICALDRIVE0";// 这个找了好久呀,原来要这样写的
 
    NTSTATUS ntStatus;
    HANDLE hDeviceHandle;
    IO_STATUS_BLOCK IoStatusBlock;
    IO_STATUS_BLOCK IoStatusBlockR;
    OBJECT_ATTRIBUTES ObjectAttributesL;
    UNICODE_STRING UniFileNameL;
 
    LARGE_INTEGER ByteOffset;
 
    RtlInitUnicodeString(&UniFileNameL,name);
    InitializeObjectAttributes( &ObjectAttributesL,
                                &UniFileNameL,
                                OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
                                NULL,
                                NULL);
 
    ntStatus = ZwCreateFile(&hDeviceHandle,
                            GENERIC_READ,
                            &ObjectAttributesL,
                            &IoStatusBlock,
                            NULL,
                            0,
                            FILE_SHARE_READ,
                            FILE_OPEN,
                            FILE_SYNCHRONOUS_IO_ALERT,
                            NULL,
                            0);
   
    if( NT_SUCCESS(ntStatus) )
    {
        DbgPrint("Open Success");
 
//      ByteOffset.LowPart = FILE_USE_FILE_POINTER_POSITION;
//      ByteOffset.HighPart = -1; 不要用这两句换成下面一句,DDK误导人啊~~~~~
        ByteOffset.QuadPart = SectorStart*BytesPerSector;// 是这句了
 
        ntStatus = ZwReadFile( hDeviceHandle,
                                NULL,
                                NULL,
                                NULL,
                                &IoStatusBlockR,
                                p,
                                SectorCount*BytesPerSector,
                                &ByteOffset,
                                NULL);
 
        if( NT_SUCCESS(ntStatus) )
        {
            DbgPrint("Read Success");
        }
    }
 
    ZwClose(hDeviceHandle);
}
//--------------------------------------------------------------------
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
    DbgPrint("     88 ");
}
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
    unsignedlong SectorStart = 63;// 现在是读扇区啦
    unsignedlong SectorCount = 1;
    unsignedchar p[512];
    int i;
   
    DriverObject->DriverUnload = OnUnload;
 
    DbgPrint("Hi");
 
    ReadPhysicalSector(SectorStart ,SectorCount, p);
    for(i=0;i<512;i++)
        DbgPrint("%02X ",p[i]);
 
    return STATUS_SUCCESS;
}
 
树莓派3系统安装:Win32DiskImager零失败烧录指南 树莓派3作为经典嵌入式平台,其系统安装本质是SD卡级的裸设备写入操作。理解镜像(.img)的原始磁盘格式、物理设备(PhysicalDrive)的直接访问原理,是避免黑屏、彩虹屏等启动故障的技术前提。Win32DiskImager凭借对Windows底层磁盘API的稳定调用,成为兼容性最强的烧录工具,尤其适合无Linux环境的Windows用户。它不依赖图形抽象层,规避了分区识别错误与缓存干扰,确保boot分区和rootfs的原子性写入。典型应用场景包括教学批量部署、老旧笔记本离线配置、工业边缘节点初始化等 阅读详情

相关推荐

C++实现跨平台硬盘参数读取工具:底层IOCTL与S.M.A.R.T.数据解析实战

在系统监控和运维自动化领域,获取硬盘的底层参数是一项基础且关键的技术需求。其核心原理是通过操作系统提供的设备接口,直接向硬盘发送标准ATA/SCSI命令来读取固化的识别信息与运行状态数据。这项技术的价值在于能够绕过上层抽象,实现精准的硬件监控、健康度评估与自动化运维,广泛应用于服务器状态巡检、嵌入式设备监控和二手硬件检测等场景。其中,通过Windows的DeviceIoControl函数配合IOCTL_ATA_PASS_THROUGH控制码发送命令,以及解析返回的S.M.A.R.T.原始数据以获取重映射扇区

weixin_33861800的博客 405

018_《Delphi下深入Windows核心编程》

本书是一本介绍Windows核心技术及高级技巧的专著。从系统内核编程出发,使用大量的例子帮助读者理解这些编程技术,讲述了线程同步及隐藏、系统钩子深入分析、读写物理磁盘的关键技术、读写物理内存和其他进程内存的核心技术、Windows 9x下调用16位实模式和保护模式代码的核心技术、直接读写端口技术、可执行文件加壳的技巧、PE结构分析、Ring0的实现、Windows API截取技术、屏幕取词技术等方面的内容。全书对热点源代码进行了深入剖析和讲解,同时本书汇聚了作者利用Soft-ICE跟踪调试经验,作者多年的编

敦格 3770

操作系统核心原理深度解析:从进程管理到内核架构的全面指南

操作系统作为计算机系统的核心软件,其核心原理在于对硬件资源的抽象与管理。通过进程与线程的概念,操作系统实现了CPU资源的调度与多任务并发执行;虚拟内存技术则将有限的物理内存扩展为每个进程独立的地址空间,确保了安全隔离与高效利用。这些底层机制的价值在于为上层应用提供了稳定、高效、安全的运行环境,广泛应用于服务器、桌面系统、移动设备及嵌入式领域。本文聚焦于操作系统的核心模块,深入探讨进程调度、内存管理及系统调用等关键技术,并结合宏内核与微内核的设计哲学差异,解析Linux、Windows等主流系统的实现特点。理

weixin_34396103的博客 346

DeviceIoControl 直接从磁盘扇区读文件

好久没写博客了,最近看了下DeviceIoControl  关于磁盘的应用,特记一文,以备久后查阅。 首先介绍下,文件在磁盘的存储结构(具体可以到网上查询NTFS文件系统相关的教程后者数据恢复方面教程的介绍)。下面介绍的仅与此文相关。 文件属性(头): (Ps: 截图摘自[数据重现文件系统原理精解与数据恢复最佳实践].(马林))

flyingleo1981的专栏 1648

Ubuntu零基础入门到精通【2.7讲】:️安装前的数据备份与风险检查——别让一次安装,毁掉几年的数据

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1744

DELPHI 示范如何读写硬盘物理扇区

示范如何读写硬盘物理扇区,读写.DELPHI

WIN32和Kernel直接读写硬盘扇区

这里是摘自文章里的一个表:硬盘的总体结构 *********************************************************************** 编号       名称                                     备注 1          主引导扇区(含硬盘分区表)            占用一个扇区空间(一个扇区空间为5

八零后 957

delphi 获取计算机硬盘所有分区盘符

用delphi获取计算机硬盘所有分区盘符。

(WIN32和Kernel)直接读写硬盘扇区

第一篇写技术的文章哦,以前好少写文章,我的文字表达很差劲,大家不要笑哦. 前几天仙剑4通关了,感觉好惆怅,什么都不想去做.今天看了一下书发现一篇比较好玩的文章,于是自己静静地实践一番.文章是基于硬盘保留扇区的软件保护方法(作者:熊志勇)>,内容是介绍了怎么读写硬盘保留扇区.以下是我的学习日记. 这里是摘自文章里的一个表:硬盘的总体结构 **************************

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1431

Jetson Orin Nano GPIO 实战,用 devmem 玩转 Pinmux 引脚复用配置

devmem 是一个直接读写寄存器的工具,通过 mmap 将 /dev/mem 中的物理地址区域映射到用户空间进程地址空间,从而实现直接读写,正常情况下在 /dev 下可以看到 mem。可以看到对应 bit5 bit6 分别为 1,对应配置为 E_IO_HV 为 ENABLE 以及 E_INPUT 为 ENABLE。需要 TRM 手册查看相关寄存器,以及安装 busybox,busybox 内置了 devmem。根据 TRM 手册,找到 I2C_SDA 的 pinmux 地址偏移是 0x18。

darcsdn 1644

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

Win32下病毒设计入门详细解说

Win32下病毒设计入门详细解说  本文假定你对dos下的病毒和386PM有一定的了解。   1、感染任何一个病毒都需要有寄主,把病毒代码加入寄主程序中(伴侣病毒除外)   以下说明如何将病毒代码嵌入PE文件中,有关PE文件的结构请看以前的文章。 PE文件的典型结构:MZ Header DOS STUB CODE PE HEADER OPTIONAL HEADER SECTION TABL

kesur的专栏 870

【TM1640】STM32 TM1640芯片驱动程序

以下为.h文件: #ifndef __TM1640_H__ #define __TM1640_H__ #include "stm32f10x.h" #define ADDR_START1640 0XC0 #define DSP1640_DIS 0 #define DSP1640_ENB 1 /* 控制显示 ...

cxw312864660的博客 1万+

从零构建GSmartControl硬盘健康检测工具:CMake编译教程与源码目录结构完整指南

GSmartControl 是一款开源的硬盘与 SSD 健康检测工具,作为 smartmontools 中 smartctl 命令的图形化界面,它能读取 SMART 数据、自动高亮异常指标并运行磁盘自检,帮助你在数据损坏前发现硬盘隐患。本文带你完成 GSmartControl 的 CMake 编译全流程,并详解源码目录结构,适合想从源码构建或阅读代码的开发者与高级用户。 ## 一、先认识 GSm

gitblog_00556的博客 1121

LPC2124定时器实现跑马灯

文章目录一、keil 4新建工程 一、keil 4新建工程 1、Create New Project,注意,最好添加进一个新建好的文件夹里,keil不会帮你新建。 2、添加设备类型:NXP目录下的LPC2124 3、选择启动文件Startu.s 4、new 一个file,保存命名为.c文件 5、添加进project里,右击,add 选中,添加 6、设置编译输出.hex文件 ...

qq_37937830的博客 5753

有史以来最小的GIF/png/jpg/jpeg

昨天我对图像进行了 base64 编码,这样我就可以将它发送到 CouchDB 以测试我正在为客户编写的一些代码。它让我想起了我之前在远程服务器上设置 cookie 时所做的事情。基本上,一个小的 PHP 脚本被放在远程服务器上,它接受几个 GET 参数并根据它们的值设置一些 cookie。然后脚本输出一个 1x1 的透明 GIF。本地服务器上的 PHP 脚本生成了一个 IMG 标签,该标签链接到该图像并根据本地服务器上的 COOKIES 设置参数。

凌凌1301的博客 1417

Linux To Go制作指南:打造可随身携带的完整Linux工作环境

操作系统可移植性一直是系统管理和开发运维领域的热门话题,其核心原理在于将完整的系统环境与硬件解耦,通过移动存储介质实现跨平台部署。这项技术的核心价值在于提供了高度一致、隔离且可定制的计算环境,能有效解决开发环境配置、紧急系统救援、安全测试以及多机工作流同步等工程实践难题。特别是在当前远程协作和混合办公场景下,一个可持久化、高性能的便携系统能显著提升工作效率。本文聚焦于Linux To Go这一具体实现方案,深入探讨了从存储设备选型、系统安装部署到性能调优与跨硬件兼容性处理的全流程实践,其中系统分区与GRUB

weixin_30721077的博客 380

C# MES通信从入门到精通(1)——串口传输文件

本文详细介绍了在Mes通信领域如何使用串口发送文件,由实战经验总结,堪称MES通信领域的葵花宝典!

qq_34059233的博客 3750

Windows Knowledge

Windows Knowledge

汽车以太网和SOA 5448

HFSS实战项目——微带一分四功分器

呕心沥血保姆级教程!!!!手把手教会你做功分器,史上最详细步骤!!!

2401_87464239的博客 2673

数据资产可视化分析:PowerBI在大数据管理中的实战

目的:帮你搞懂“为什么数据资产需要可视化?”“PowerBI能帮企业解决什么问题?”,并掌握用PowerBI做大数据可视化的实战技巧。范围:覆盖数据资产定义、可视化分析原理、PowerBI核心功能(数据连接、建模、可视化)、零售企业实战案例,以及未来趋势与挑战。背景:为什么企业的数据像乱堆的玩具?核心概念:数据资产、可视化分析、PowerBI分别是什么?它们怎么配合?实战步骤:用PowerBI帮零售企业整理“销售玩具箱”,做出能指导决策的仪表盘;应用场景:不同部门怎么用这个“整理好的玩具箱”?

2501_92132293的博客 907

树莓派4安装Ubuntu MATE 20.04 LTS全指南

树莓派4作为主流ARM64开发板,其系统选型直接影响开发效率与稳定性。Ubuntu MATE是基于Ubuntu LTS的轻量级桌面发行版,依托标准apt包管理、完整ARM64原生支持及MATE经典桌面架构,在资源占用、硬件兼容性与软件生态间取得关键平衡。它天然适配树莓派4的GPU加速(VC4/V3D)、硬件视频解码(VAAPI)、USB 3.0与PCIe外设桥接等特性,显著优于Raspberry Pi OS的32位限制和Ubuntu Server的无图形短板。在教育实训、边缘计算原型开发、轻量Web服务及P

weixin_34054866的博客 347

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MFC: DeviceIoControl 通过API访问设备驱动程序

转载:http://m.blog.csdn.net/article/details?id=21602051 DeviceIoControl的其实和ReadFile和WriteFile是一样的, 不过这个功能更强, 一次交互能够输入数据, 也可以输出数据. DeviceIoControl内部创建的IRP是IRP_MJ_DEVICE_CONTROL类型的IRP, 然后操作系

kkkmmmjjjj的博客 3520

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# DriveInfo类详解:获取驱动器信息与磁盘监控实战

在C#系统编程中,文件管理与资源监控是常见需求,而驱动器信息获取是其中的基础操作。其核心原理是通过操作系统提供的API接口,以面向对象的方式封装驱动器的逻辑属性,如类型、容量、文件系统等。这项技术的价值在于简化了底层系统交互,使开发者无需直接调用复杂的Windows API,就能高效实现磁盘状态监控、存储空间管理等关键功能。在应用场景上,它广泛用于安装程序、文件管理器、备份工具及系统监控软件中,帮助开发者检查U盘插入状态、预警磁盘空间不足。本文以C#中的DriveInfo类为核心,结合U盘检测和磁盘空间监控

weixin_34060741的博客 453

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Ubuntu MATE 20.04 LTS 树莓派3B+深度适配指南

Linux桌面系统在ARM嵌入式设备上的运行,本质是内核驱动、GPU加速、内存约束与固件协同的系统工程。Ubuntu MATE作为轻量级GNOME替代方案,凭借其低内存占用(约380MB)和对VC4 GPU硬件加速的原生支持,成为树莓派3B+等资源受限平台的理想选择。其底层依赖于Linux 5.4内核对BCM2837B0处理器的完整支持,并通过Full KMS驱动模式释放OpenGL ES 3.0性能,显著提升桌面流畅度与多媒体体验。在家庭媒体中心、物联网网关及轻量开发服务器等典型场景中,该组合兼顾稳定性、

weixin_34101229的博客 359
上一篇: Microsoft Internet Explorer FTP含命令注入漏洞
下一篇: 大型电信运营业务支撑系统安全评估方法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值