操作系统
文章平均质量分 80
QQ276592716
这个作者很懒,什么都没留下…
展开
-
VirtualProtect() 原理(摘自Undocument NT)
<br />VirtualProtect() 函数并不将页标记为可读写,而是保持页的只读属性。 然而,为了将此页与其它的正常只读页取分开来,它被标记为写时拷贝(copy-on-write)。 Windows NT 使用了 PTE 中的一个空闲位来做这个标记。当此页被写入时,因为是只读页,处理器发出页错误异常。页错误处理程序做一份此页的拷贝并相应地修改发生页错误进程的列表。新的拷贝被标记为可读写以使进程可以写入。转载 2011-04-17 17:38:00 · 4391 阅读 · 0 评论 -
互斥锁 条件变量 信号灯
原文地址:http://blog.chinaunix.net/uid-27164517-id-3282111.html互斥操作: 对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁. 在完成了对共享资源的访问后, 要对互斥量进行解锁。 死锁主要发生在有多个依赖锁存在时, 会在一个线程试图以与另一个线程相反顺序锁住互斥量时发生转载 2013-05-14 17:38:59 · 908 阅读 · 0 评论 -
WRK-NtOpenProcess 的流程草图~
NTSTATUSNtOpenProcess ( __out PHANDLE ProcessHandle, __in ACCESS_MASK DesiredAccess, __in POBJECT_ATTRIBUTES ObjectAttributes, __in_opt PCLIENT_ID ClientId ) /*++ Routin原创 2013-07-08 00:22:31 · 915 阅读 · 0 评论 -
提高应用程序启动性能
CLR 全面透彻解析提高应用程序启动性能Claudio Caldato 目录冷启动 确定从磁盘加载的代码 系统程序集和其他进程 NGen 性能 Authenticode 验证 结束语 由于等待应用程序启动是令许多用户都感到沮丧的一件事情,因此,侧重于提高客户端应用程序的启动性能将极大增强客户的第一印象,并转载 2013-07-15 13:42:31 · 1978 阅读 · 0 评论 -
Read-copy-update
From Wikipedia, the free encyclopediaIn computer operating systems, read-copy-update (RCU) is a synchronization mechanism implementing a kind of mutual exclusion[note 1] which can转载 2013-10-14 00:05:57 · 2831 阅读 · 0 评论 -
Linux下的I/O
Linux的I/O机制经历了一下几个阶段的演进:(1)同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。(2)同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。(3)异步阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数转载 2014-02-21 16:50:18 · 794 阅读 · 0 评论 -
一个写优先的读写锁实现
/* g++ -Wall -o rwlock rwlock.cpp -lpthread** 一个写优先读写锁的实现,多线程频繁读,多线程少量写,同时写优先,性能极佳。* 当写锁(独占锁)lock成功的必要条件是:* 1. 将写锁计数++;* 2. 会阻塞后续对读锁(共享锁)的读;* 3. 等待读锁的计数为0;* 4. 等待写锁的计数为1;**/#includ转载 2014-02-23 16:28:55 · 1443 阅读 · 0 评论 -
使用异步过程调用(APC)实现模块注入
摘自:windows编程循序渐进 异步过程调用是一种能在特定线程环境中异步执行的系统机制。往线程APC队列添加APC,系统会产生一个软中断。在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC。 每个线程都拥有自己的APC队列。应用程序可以使用函数把APC添加到指转载 2014-02-13 19:40:07 · 800 阅读 · 0 评论 -
收藏的好文章
1.并发锁方面http://www.cl.cam.ac.uk/research/srg/netos/papers/2007-cpwl.pdfhttp://www.drdobbs.com/parallel/choose-concurrency-friendly-data-structu/208801371?pgno=1http://www.drdobbs.com/parallel原创 2014-03-13 10:27:08 · 698 阅读 · 0 评论 -
z-order引出的问题
在窗口与窗口之间毫无重叠的情况下,根本不需要关心z-order。然而,当窗口之间出现重叠时,系统就需要通过一个标准来确定窗口的显示顺序。这个标准就是z-order。存在多个因素影响一个窗口的z-order: 1、窗口类型是否为TOPMOST; 2、窗口间的父子关系; 3、窗口间的owner关系; 4、是否为active状态。转载 2013-03-12 16:29:05 · 790 阅读 · 0 评论 -
VS与Win7共舞:系统服务的Session 0隔离
隔离,是为了更好的保护。但是,众所周知的,隔离也会给我们的生活带来一些不便。在Windows 7中,操作系统服务的Session 0隔离,阻断了系统服务和用户桌面进程之间进行交互和通信的桥梁。通过Session 0隔离,虽然可以让操作系统更加安全,但是也给系统服务带来了不少兼容性的问题。 系统服务在Windows 7上遇到的问题 操作系统服务是Windows操作系统转载 2012-09-14 21:44:54 · 1219 阅读 · 0 评论 -
windows堆栈段的疑惑~
1.我写了一个溢出程序,简单的win32的,打开OD后,直接去看内存的堆栈段:发现堆栈段并不是可执行的,但是却可以通过溢出执行栈中的代码。这是什么原因?2.从上面看windows(我是XP的)的栈段是可执行的,这样不是会有安全隐患么~ 我查了下好像linux后面就不允许栈段执行了,windows保留这个可执行的原因是什么?1.来个看雪某位朋友的回答:对于x86来说,只有原创 2012-05-13 00:20:31 · 990 阅读 · 0 评论 -
页转换机制(摘自Undocument NT)
<br />要访问内存单元,要指定段和段内偏移。地址转换的第一步就是将段基址加到偏移上。如果没有启用分页的话,这个32位的地址就是物理地址。否则,这个地址叫做逻辑地址或线性地址,这个地址再经过页地址转换机制才成为物理 RAM 地址。页地址转换机制见 1。<br /><br /><br />这种内存管理机制叫做分页,这是因为内存被分成了固定大小的区域,而这些区域就叫做页。 在 Intel 处理器(80386 或更高)上,一页的大小是4KB。32位的地址总线可访问最多 4GB 的 RAM。因此,总共就有1M(4转载 2011-04-16 14:25:00 · 1178 阅读 · 0 评论 -
共享 DLL 中的代码页的实验(摘自Undocument NT)
<br />Listing 4-1: SHOWDIR.C <br /><br />/* Should be compiled in release mode to run properly */<br />#include <windows.h><br />#include <string.h><br />#include <stdio.h><br /><br />#include "gate.h"<br /><br />/* Global array to hold the page directory转载 2011-04-16 16:01:00 · 960 阅读 · 0 评论 -
JIURL玩玩Win2k内存篇 分页机制
<br />基本概念<br /> Windows 2000 使用基于分页机制的虚拟内存。每个进程有4GB的虚拟地址空间。基于分页机制,这4GB地址空间的一些部分被映射了物理内存,一些部分映射硬盘上的交换文件,一些部分什么也没有映射。程序中使用的都是4GB地址空间中的虚拟地址。而访问物理内存,需要使用物理地址。<br /><br />下面我们看看什么是物理地址,什么是虚拟地址。<br /><br />物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上,如果是读,电路根转载 2011-04-19 12:22:00 · 2045 阅读 · 0 评论 -
获取页表项和页目录项VA的汇编代码的解析(整理)
<br />MOV EAX, ESI<br />AND EAX, 0xFFFFF3FF<br />SHR EAX, 0A<br />SUB EAX, 40000000<br /><br />MOV EAX, ESI<br />AND EAX, FFCFFFFF<br />SHR EAX, 14<br />SUB EAX,3FD00000<br /> <br />首先看下PTE的计算公式:<br />PTE_Addr = (VirtualAddr >> 12) * 4 + 0xC0000000<br />上面原创 2011-04-19 12:39:00 · 1273 阅读 · 0 评论 -
WaitForXXX函数的等待对象~
<br />WaitForXXX函数不仅可以等待event,semophore,mutex之外,还可以接受内核句柄,如hProcess,hThread。另外还可以接受所谓的“file change notification HANDLE”,这样的一个HANDLE可以测知某个特定的改变已经在一个已知的磁盘目录及其子目录中发生。不仅如此,还可以接受console input device的file HANDLE。一旦console的输入缓冲区有一个未读取的输入,WaitForXXX就会返回。原创 2011-05-06 12:28:00 · 726 阅读 · 0 评论 -
驱动和应用层的三种通信方式
作 者: sislcb时 间: 2008-01-04,11:57:54链 接: http://bbs.pediy.com/showthread.php?t=57666驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。驱动层和应用层通信,主要是靠DeviceIoControl函数,下面是该函转载 2011-12-01 21:39:03 · 1840 阅读 · 0 评论 -
Windbg里查看Shadow SSDT
内核当中已经导出了KeServiceDescriptorTable,可以直接在Windbg当中使用dd命令查看,对于Shadow SSDT的地址,在WinXP当中,地址是KeServiceDescriptorTable-0x40.为了查看win32k的SYSTEM_SERVICE_TABLE,记得要切换到具有图形界面的进程上下文当中才能正确查看.KeServiceDescriptorTableSh转载 2011-12-06 11:55:09 · 996 阅读 · 0 评论 -
Windows 缓冲区溢出与数据执行保护DEP
缓冲区溢出与数据执行保护DEP介绍先看一个缓冲区溢出的C++实例程序,代码如下(VC6.0下编译通过):[cpp] view plaincopy"font-size:18px;">class="cpp" name="code">//by MoreWindows #include #include #include #include #includ转载 2012-05-11 21:59:06 · 681 阅读 · 0 评论 -
高性能服务开发之定时器
在开发高性能服务器中,定时器总是不可或缺的。 常见的定时器实现三种,分别是:排序链表,最小堆,时间轮。 之前用的定时器是基于最小堆的,在定时器数量不多时可以使用, 目前公司用的框架中的定时器是基于简单时间轮的,但是为了支持大范围的时间,每个齿轮的所维护的链表为有序链表,每次插入时先mod出spoke,再从头遍历链表以便将定时器插入到合适位置, 所以本质上还是基于有序链表的。时间复杂度并未减少。转载 2014-12-30 11:01:53 · 726 阅读 · 0 评论