自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 Android Studio Flutter真机调试错误

Consider running "flutter create ." to create one.2.启动cmd,用flutter doctor检查, 如果提示未接受许可证,则按提示输入flutter doctor --android-licenses命令接受许可证,一路输入y并确认,问题解决。Android Studio的Tools->SDK Manager->Android SDK->SDK Tools, 勾选上Android SDK Build-Toos,应用并安装。

2023-10-11 17:20:02 1184

原创 TortoiseGit配置SSH key

1.总体流程1)你得先生成一对公私密钥;2)公钥配置到服务端gitlab、私钥配置在本地;2.使用到的工具1)PuTTYgen: 用于生成密钥;2)Pageant:配置本地的私钥;两个工具均可在“开始”菜单TortoiseGit文件夹下找到。3.具体步骤1)使用PuTTYgen,选择RSA 算法生成密钥并且配置密码:2)保存私钥到本地用户目录/.ssh下,需创建.ssh文件夹:3) 在gitlab setting -> SSH Keys,复制粘贴

2022-03-17 09:31:43 5789

原创 (linux)qt应用程序无法输入中文

1.问题 linux 环境下,qt应用程序文本输入控件如QLineEdit,无法切换中文输入法来输入中文;2. 原因 qt应用程序没成功加载到输入法插件。linux有两种输入法框架:fictx和ibus,对应的插件:libfcitxplatforminputcontextplugin.so和libibusplatforminputcontextplugin.so;可使用: lsof -p pid 确认应用程序是否已加载对应的so:3.解决1)将插件文件拷贝到...

2021-10-29 22:00:10 7514 1

原创 Windbg调试笔记-查看stl结构数据

1.要使用版本对的windbg版本(如32位进程产生的dump得使用x86版本?,这个不太确定);2>.load stlkit3>!set setInfo //查看set4>!stl vectorInfo //查看vector5>!std_map mapAddress //查看map?6>dt structInfo //查看结构体...

2021-01-30 20:20:24 430 1

转载 DllMain

转自:https://docs.microsoft.com/zh-cn/windows/win32/dlls/dllmain

2021-01-19 08:13:28 118

原创 GetPrivateProfileString 读带双引号字符串的坑

一个GetPrivateProfileString读配置文件的坑,避免再次踩坑:1)期望读到的内容是:operation="%product%\A.exe" -reinstall:"-name:a-id:123"2)实际上读到的内容是:operation=%product%\A.exe" -reinstall:"-name:a-id:1233)MSDN的有描述:If the string associated with lpKeyName is enclosed in single or do..

2020-08-11 11:06:03 501

原创 链接、装载与库 - 编译与链接 - 编译器做了什么

编译过程一般分为6步: 扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成和目标代码优化,每个过程所做的事情及输出总结如下:步骤 做的事情或输出 扫描(词法分析) 将源代码的字符序列分割成一系列记号 语法分析 对记号进行语法分析,产生语法树 语义分析 编译期间用的是静态语义分析,对语法树的表达式标记类型 源代码优化 将一些可以确定的...

2019-06-13 08:35:39 117

原创 链接、装载与库 - 静态链接 - 编译与链接

一个程序源码从编译到生成可执行文件,主要经过了4个步骤:预处理、编译、汇编、链接。1. 预处理 预处理是主要是处理源文件中以“#”开关的预编译指令,如:#include, #define等;2.编译 编译是对经过预处理的文件进行词法分析、语法分析、语义分析和优化后产生的汇编代码文件。3.汇编 汇编过程是汇编器将汇编代码转变成机器可以执行的指令,每一个...

2019-06-05 23:45:21 109

原创 代理服务器

代理,可以理解为是一种网络服务,主要是转发客户端的请求到目标服务器,并转发服务器的返回结果到客户端。在客户端与目标服务器中间起桥梁作用,也增加了终端的安全性。提供这种代理服务的机器可称为代理服务器,一般的网关、路由器都提供代理服务。1.http代理服务器 可以简单理解是浏览器与目标Web服务器之间一台服务器,客户端首先会与HTTP代理服务器建立连接,然后将HTTP请求转发给...

2019-06-04 00:21:43 2157

原创 zlib库的编译与使用

1)Windows平台下MSVC编译  使用VS(x86)命令行工具进入到zlib根目录,执行nmake -f win32/Makefile.msc ,在根目录下生成:zlib.lib(静态库) zdll.lib(动态库的导入库) zlib1.dll(动态库) 。2. zlib的Demo 必要的头文件有zlib.h和zconf.h, 库文件zlib.lib...

2019-05-30 23:55:26 5293

原创 环境变量

环境变量是操作系统运行时用到的一些参数,分为系统环境变量与用户定义的环境变量。1.Windows环境变量1)系统环境变量位于注册表:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment2)用户环境变量位于注册表:HKEY_CURRENT_USER\Environment...

2019-05-29 23:52:39 317

原创 Windows核心编程 - 总结

2019-05-28 23:54:16 310

原创 Windows核心编程 - 线程调度、优先级和关联性(2)

1. 线程的执行时间 一个能够返回线程已获得CPU时间量的函数 :GetThreadTimes(), 要获取高精度的性能函数:QueryPerformanceFrequency()、QueryPerformanceCounter()2.在实际上下文中谈CONTEXT结构 系统使用CONTEXT结构记住线程的状态,这样线程在下一次获取CPU运行时间时,就可从上一次...

2019-05-27 23:33:25 161

原创 Windwos核心编程 - 线程调度、优先级和关联性(1)

1. 上下文 每个线程都有一个上下文(Context),上下文保存在线程的内核对象中,这个上下文反映了线程上一次执行时的CPU寄存器状态。Window大约每隔20ns会扫描所有的线程的内核对象,然后在可调度的线程中挑一个,并将该线程上次保存在线程上下文的值转入CPU寄存器,这一过程称为上下文切换。2.线程的挂起和恢复 在线程内核对象中有一个值表示线程的挂起计数,当线程...

2019-05-26 23:52:25 121

原创 Windows核心编程 - 线程基础

1. 线程介绍 每个进程至少有一个线程,线程有两个组成部分:1)线程内核对象, 操作系统用它来管理线程,同时用来存放线程统计信息。2)线程栈,用于维护线程执行时所需的所有函数参数和局部变量。 假设进程有多个线程,那么这些线程共享该进程的地址空间。进程比线程使用更多的系统资源,例如创建一个虚拟的地址空间需要大量系统资源,加载.exe和.dll到地址空间,需要占用系统 的文件...

2019-05-23 00:35:28 95

原创 Windows核心编程 - 作业

有时候我们需要将一组进程当作一个单体来处理,另外,也可能需要限制某个进程所能访问的资源。Windows提供了一个称为作业 (job)的内核对象,它允许我们将进程组在一起并创建一个“沙箱”来限制进行能够做些什么。 那么我们可以将作业理解成一个进程的容器。如果一个进程已经与一个作业关联,则该进程及它的所有子进程都无法从作业中去除掉,这个安全特性可以保证进程无法摆脱对它施加的限制。 ...

2019-05-22 00:33:18 199

原创 Windows核心编程 - 进程

1. 进程,一般定义为是一个可执行程序的运行实例,它由以下两部分组成:1)一个内核对象,操作系统利用它来管理进程;2)一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据,此外,还包括了动态分配的内存,比如线程堆栈和堆。 一个进程可以有多个线程,所有的线程都在进程的地址空间中执行代码。因此,每个线程都有它自己的一组CPU寄存器和堆栈。每个进程至少要有一个线程来...

2019-05-19 23:01:55 325

原创 Centos5.11 问题总结

centos编译32位程序,增加-m32选项时提示的错误:/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory原因:由于缺少32位兼容包.解决:yum –y install glibc-devel (64位)   yum –y install glibc-devel.i686 (...

2019-05-19 14:47:31 378

原创 Windows核心编程 - 结构化异常处理

使用 结构化异常处理(SEH)可以增加程序的健壮性,因为这个机制可以保证我们的程序在运行的过程中,如果出现了问题,系统会捕获这个问题异常,并通知到程序,程序就可作相应的处理。SEH包含两方面的功能:终止处理和异常处理。 终止处理程序的语法如下:__try{ //Guarded body ......}__finally{ //Terminatio...

2019-05-19 00:29:18 221

原创 Windows核心编程 - 堆

堆是什么? 堆,也是一种操控内存的方法,它非常适合分配大量的小型数据,与虚拟内存、内存映射文件相比,是用来管理链表和树的最佳方式。但,堆的缺点是分配和释放内存块比其它方式要慢。在系统内部,堆是一块预订的地址空间区域,堆管理器所调拔的物理存储器是从页交换文件中分配的。释放堆中的内存块时,堆管理器会撤销已调拔的物理存储器。1.进程的默认堆 所谓默认堆是指进程初始化时,...

2019-05-17 08:44:27 261 1

原创 Windows核心编程 - 内存映射文件(3)

1. 用内存映射文件来处理大文件 方法就是只映射文件的一个视图,这个视图只包含文件的一小部分数据。比如一开始时,把文件开关的部分映射到视图中,完成对视图的访问后,撤销这一部分的映射,再把文件的另一部分映射到视图,重复此过程,直至完成对整个文件的访问。2.内存映射文件和一致性 系统允许把同一个文件中的数据映射到多个视图中。例如把一个文件的前10KB映射到一个视图A,把同一...

2019-05-15 23:51:04 214 1

原创 Windows核心编程 - 内存映射文件(2)

2. 映射到内存的数据文件 这种方法最大的优点是让系统为我们处理所有与文件缓存有关的操作,我们不必关心分配内存、 把文件中的数据载入内存,把数据 写回文件、以及释放内存等操作,不过如果 操作过程被打断,比如断电,数据可能被破坏。 要使用内存映射文件,需执行以下步骤: 1) 创建或打开一个文件内核对象, CreateFile() 2) 创建一个文件映射内核对象...

2019-05-14 23:47:17 121

原创 linux编译常见的undefined reference问题

  1.dl库  undefined reference to ‘dlerror’  undefined reference to ‘dlopen’  undefined reference to ‘dlerror’  增加-ldl链接选项 (-l是链接选项的前缀)  2.pthread库  undefined reference to ‘pthread_create’  undef...

2019-05-14 18:46:23 1954

原创 Windows核心编程 - 内存映射文件(1)

内存映射文件主要用于以下三种情况:1)系统使用内存映射文件来载入并运行.exe和动态链接库DLL文件。这大量节省了页交换文件的空间以及应用程序 启动的时间。 2)开发人员可以用内存映射文件来访问磁盘上的数据文件,这可以避免直接对文件进行I/O操作和对文件内容进行缓存。 3)可以在同一台机器上的不同进程之间共享数据。是最高效的方法。1. 映射到内存的可执行文件和DLL...

2019-05-13 23:35:25 296 1

原创 Windows核心编程 - 线程栈

当系统创建线程时,会为线程栈预订一块地址空间(每个线程都有自己的栈), 并给区域调拔一些物理存储器。 默认会预订1MB的地址空间并给区域项部(即地址最高)的两个页面调拔存储器。在让线程开始执行之前,系统会把线程栈的指针指向区域顶部的那个页面的末尾(该地址非常接近0x08100000)。这个页面就是线程开始使用栈的地方。区域顶部往下的第二个页面被称这防护页面,随着线程调用越来越多的函数,调用...

2019-05-12 23:38:50 156

原创 Windows核心编程 - 在应用程序中使用虚拟内存(3)

6.改变保护属性 如果想要在应用程序中定位一个比较难发现的缺陷,可利用改变已调拔的物理存储页面的保护属性的方式。例如有一段管理链表的代码,并且链表中的节点数据是保存在一个已预订的区域中。可以这样来设计链表相关的处理函数:在处理函数的开关将物理存储页的保护属性置为PAGE_READWRITE, 在处理函数结束前将保护属性置为PAGE_NOACCESS。这样可避免链表的数据受到程序中...

2019-05-08 23:41:41 138

原创 Windows核心编程 - 在应用程序中使用虚拟内存(2)

接着上一篇Windows核心编程 - 在应用程序中使用虚拟内存(1)4. 何时调拔物理存储器 假设正在实现一个电子表格的应用程序,需要一个CELLDATA结构来描述单元格的内容。一种最简单的方式使用二维数组这种数据结构来实现,数组的优点是访问速度快,但缺点是意味着程序一开始运行就需要从页交换文件中分配大量的物理存储器,但实际上用户通常只会使用少数的单元格,造成内存的浪费。 ...

2019-05-07 23:31:44 130

原创 Windows核心编程 - 在应用程序中使用虚拟内存(1)

Windows提供了以下三种机制来对内存进行操控:1)虚拟内存:最适合用来管理大型对象数组或大型数据结构数组;2)内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据;3)堆:最适合用来管理大量的小型对象。 Windows提供了一些用来操控虚拟内存的函数,通过这些函数可以直接预订地址空间区域、给区域调拔(来自页交换文件的)物理存储...

2019-05-07 08:15:53 323

原创 ubuntu下vi编辑模式不能正常使用键盘的问题

问题现象: 使用vi打开文件后,输入命令i进入编辑模式,但使用方向键(上下左右)进行移动光标时不正常,会输入AB等的字母,删除键也不正常。原因:ubuntu默认安装的是vim-tiny版本解决方法: 安装vim-full版本步骤:1)卸载vim-tiny, 命令:sudo apt-get remove vim-common 2)安装vim-full,命令:su...

2019-05-05 17:49:17 4898 1

原创 Windows核心编程 - 探索虚拟内存

1. 系统信息 操作系统中有很多参数是由系统所运行的主机所决定的,如页面大小和分配粒度等,可使用GetSystemInfo函数来获取与主机相关的参数。为了让32位应用程序能够在64位版本Windows上运行,Microsoft提供了一个称为Windows 32-bit On Windows 64-bit的模拟层,称为WOW64。当32位应用程序在WOW64上运行时,调用GetSystem...

2019-05-04 23:44:17 163

原创 Windows核心编程 - Windows内存体系结构(4)

1. 写时复制 PAGE_WRITECOPY和PAGE_EXECUTE_WRITECOPY这两个保护属性存在的目的是为了节省内存和使用页交换文件。Windows支持一种机制,允许两个或两个以上的进程共享同一块存储器。让应用程序实例共享相同的存储页极大地提升了系统的性能,但另一方面,也要求所有的应用程序实例只能读取其中的数据 或是执行其中的代码。如果某个应用程序实例修改并写入一个存储页...

2019-05-01 23:18:25 607

原创 Windows核心编程 - Windows内存体系结构(3)

1. 物理存储器和页交换文件 如今的操作系统能让磁盘空间看起来像内存一样,磁盘上的文件一般被称为页交换文件,其中包含虚拟内存,可供任何进程使用。页交换文件以一种透明的方式增大了应用程序可用内存的总量。 当一个线程试图访问所属进程的地址空间中的一块数据时,有可能会出现两种情况: 1)线程要访问的数据就在内存中,这种情况下,CPU会先把数据的虚拟地址映射到物理地址,接...

2019-04-29 23:37:57 410

原创 Windows核心编程 - Windows内存体系结构(2)

1. 地址空间中的区域 当系统创建一个进程时,该进程的地址空间大部分是闲置的或是尚未分配的。如果想使用这部分地址空间,必须调用VirtualAlloc来分配其中的区域(region),分配区域的操作称为预订(reserving)。 当应用程序预订地址空间区域时,系统会确认区域的起始地址正好是分配粒度的整数倍,分配粒度因不现的CPU平台而不同,目前所有CPU平台...

2019-04-28 23:57:13 96

原创 Windows核心编程 - Windows内存体系结构(1)

1. 进程的虚拟地址空间 每个进程都会有自己的虚拟地址空间,对于一个32位的进程来说,它拥有4GB(2的32次方, 字节)大小的地址空间。对于一个64位的进程来说,它拥有16EB大小的地址空间。每个进程的地址空间是相互隔离的,当进程内的各个线程在执行时,只能访问自己进程内的内存,无法访问其它进程的内存。即进程A的线程无法访问进程B的地址空间的数据结构,反之亦然。 但实际上,进程并...

2019-04-27 23:47:10 233

原创 Windowns核心编程 - 纤程

纤程的出现是为了将UNIX应用程序移植到Windows,纤程是在用户模式下实现的,所以内核无法对纤程进行调度,只能根据定义的算法对纤程进行调度。一个线程可以包含一个或多个纤程,内核会对线程进行调度,但线程一次只能执行一个纤程的代码。下面是一些纤程的相关函数及用法。1)使用纤程的第一个步骤是将一个已有的线程转换为一个纤程,使用函数 :PVOID ConvertThreadToFibe...

2019-04-26 23:45:21 120

原创 Windows核心编程 - 线程池

Windows提供了一个线程池机制来简化线程的创建、销毁及管理工作。有以下情形可使用线程池:1. 以异步的方式来调用一个函数; 1)首先定义一个回调函数,函数原型: void NTAPI SimpleCallback( PTP_CALLBACK_INSTANCE pInstance, PV...

2019-04-25 23:32:55 176

原创 Windows核心编程 - 异步I/O之完成端口

1. 背景 构建一个服务应用程序,常用的主要有两种模型: 串行模型和并行模型。 1)串行模型: 一个线程等待一个请求,当请求到达时,线程被唤醒对请求进行处理;处理完后再接着等待下一个请求。 缺点:不能同时处理多个请求。 2)并行模型:一个线程等待一个请求,当请求到达时,线程会创建一个新的线程来处理请求。然后线程进入下一次循环等待下一个请求。新...

2019-04-24 23:26:10 188

原创 Windows核心编程 - 异步I/O之接收I/O请求完成通知

在上一篇文章Windows核心编程 - 同步设备I/O 与异步设备I/0 中提到了接收I/O请求通知的以下几种方法:1)触发设备内核对象:允许一个线程发出I.O请求,另一个线程对结果进行处理;2)触发事件内核对象: 允许向一个设备同时发出多个I/O请求, 允许 一个线程发出I/O请求,另一个线程对结果进行处理;3)使用可提醒I/O:允许向一个设备同时发出多个I/O请求, ...

2019-04-23 23:57:18 210

原创 Windows核心编程 - 同步设备I/O 与异步设备I/0

1. I/O设备 Windows支持的常见I/O设备包括有文件、目录、逻辑磁盘驱动器、物理磁盘驱动器、串口、并口、邮槽、管道、套接字、控制台。但对Windows系统层面来说,不太关心具体设备是为哪一种,将设备都抽象成是“文件”,对设备的操作即是对文件进行操作。常用的打开设备的API函数有:CreateFile()、CreateNamedPipe()(命令管道)、CreatePipe()(...

2019-04-23 00:01:19 243

原创 Windows核心编程 - 用内核对象进行线程同步

在上一篇文章Windows核心编程-用户模式下的线程同步中已总结了用户模式下的几种同步机制,它们的特点就是速度快,但也有些局限性。那么与用户模式的同步机制相对的,可以使用内核对象进行同步,既然是内核对象,那么就涉及到用户模式与内核模式切换,所以内核对象同步机制的缺点是会有性能问题,但它们的用途会更广一些,例如可以实现进程间的同步。 同步,其实是一方A需要感知另一方...

2019-04-20 23:11:57 188

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除