内核知识第六讲,内核编写规范,以及获取GDT表
内核知识第六讲,内核编写规范,以及获取GDT表
一丶内核驱动编写规范
我们都知道,在ring3下,如果我们的程序出错了.那么就崩溃了.但是在ring0下,只要我们的程序崩溃了.那么直接就蓝屏了.
那么有那些规范?
1.最基本的检查要有. 比如检查指针是否为NULL,基本的校验错误必须有
2.对内存进行操作的时候,要进行内存判断.下面提供内存判断的API
BOOLEAN
MmIsAddressValid(
IN PVOID VirtualAddress
);
给定一个缓冲区,然后检查其内存是否有效
VOID
ProbeForWrite(
IN CONST VOID *Address,
IN SIZE_T Length,
IN ULONG Alignment
);
给定一个缓冲区.然后检查是否可以写. 但是注意,检测的是ring3下的内存地址.
3.尽量不要使用太大变量,因为在内核中.内存地址都是共享的.如果你使用了很大.那么相应的内核空间就会变少.
比如不能这样写 char szBuf[0x1000];这样是使用栈内存了.但是编译是不通过了.操作系统不让你这样使用.
但是你可以写成 char szBuf1[0x500], char szBuf2[0x500]; 但是没有任何意义.
4.ring0下不能直接访问ring3的内存
这个是有原因的.因为ring0知道一块物理内存.但是不知道是那个进程的.所以不能直接访问.
二丶分页内存与非分页内存管理
我们在内核下申请空间的API:
PVOID
ExAllocatePool(
IN POOL_TYPE PoolType, //指定内存的类型
IN SIZE_T NumberOfBytes //申请的字节数
);
但是第一个参数是我们制定内存的内容是一个结构体
typedef enum _POOL_TYPE {
NonPagedPool, //非分页管理
PagedPool, //分页管理
NonPagedPoolMustSucceed,
DontUseThisType,
NonPagedPoolCacheAligned,
PagedPoolCacheAligned,
NonPagedPoolCacheAlignedMustS
} POOL_TYPE;
然后类型中有个非分页管理以及分页管理,什么意思?
意思就是在内核中申请一块内存,这块内存可否与磁盘交互.
非分页内存: 不可以进行交互.申请了这块内存就不能动了.
分页内存: 可以进行交互.当内存资源紧张的是否,而这块内存很少是否.可以暂时放到磁盘.
操作系统的代码都是放到非分页内存中的.
三丶设置分页内存
了解了分页内存和非分页内存.那么此时就产生了一个新的问题.
我们的代码.有的只调用一次,不该占着这个空间不放.那么我们就要设置为分页内存中.
关键字:
总共两种方式:
.#pragma code_seg("PAGE") //每个函数都加上,设置到PAGE节中
例如:

但是这种方式,很麻烦,且每写一个函数都要设置.那么此时就有第二种方式
.#pragma Alloc_text("PAGE",函数名,.....) //类似于一个数组一样,可以设置多个.
但是此时就要注意了.我们就需要一个头文件了.把我们的函数声明都放到头文件中.
然后下方设置.

Page节,和INIT节. 内核中,我们编写的sys驱动程序,其实也是一个PE文件. 类似于我们的ring3下的DLL, ring3的DLL是给应用程序使用的.而sys则是给操作系统使用的. 只不过一个是3环一个是0环
Page节: 这个节则是我们说的分页内存节. 我们给了函数指针.那么就代表这块内存很自由了.操作系统可以在资源紧张的时候使用.
INIT节: 这个节则是初始化的节.例如我们的入口函数,只用一次初始化而已,不用占着内存.所以给INIT节中.那么操作系统会初始化之后释放这块内存.这样可以留给其它驱动使用.
四丶设置内核代码运行的CPU在那个核心上跑.并获取出来每个核心的GDT表.
代码:
int shift = ;
char szGDT[];
nCount = KeQueryActiveProcessors();//获取CUP核心个数,按位来算.
while(shift != 0x80000000)
{
if (nCount & shift)
{
KeSetSystemAffinityThread(nCount & shift);//设置在那个线程跑
__asm
{
sgdt szGDT
}
KdPrint(("limit:%p GDT:%p\n", *(short*)szGDT, *(int*)(szGDT + )));
} shift <<= ;
}
内核知识第六讲,内核编写规范,以及获取GDT表的更多相关文章
- 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理
内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表. 我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表 我们知道,GDT表中.存储的是存储段信息. 保存了 ...
- 内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.
内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析. 我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数 ...
- Linux基础知识第六讲,远程管理ssh操作
目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...
- 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试
目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...
- Docker背后的内核知识(一)
Docker背后的内核知识 当谈论Docker时,常常会聊到Docker的实现方式.很多开发者都知道,Docker容器本质上是宿主机上的进程.Docker通过namespace实现了资源隔离.通过cg ...
- Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质
原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...
- 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING
目录 一丶驱动是如何运行的 1.服务注册驱动 二丶Ring3跟Ring0通讯的几种方式 1.IOCTRL_CODE 控制代码的几种IO 2.非控制 缓冲区的三种方式. 三丶Ring3跟Ring0开发区 ...
- 内核第三讲,进入ring0,以及编写第一个内核驱动程序.
内核第三讲,进入ring0,以及编写第一个内核驱动程序. PS: 请下配置双机调试,下方有可能用到.如果不配置,则你可以不用调试, 博客连接: http://www.cnblogs.com/iBina ...
- LINUX内核分析第六周学习总结——进程的描述和进程的创建
LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
随机推荐
- 记一次python的任务调度模块apscheduler只在首次执行任务的情况
最近需要写个日更新的程序,用time.sleep()不能很好的控制任务的执行时间 于是,就使用了python的任务调度模块apscheduler,这个模块功能真的是很强大 具体的就不多讲了 将任务程序 ...
- Mybatis 中实体类的编写
一个实体类对应一个数据表 一个属性对应一个字段 默认情况下类名和属性名都采用 “下划线转驼峰” 的命名方式.但具体采用什么样的命名方式并不重要(方式一致即可),在后面使用这些对象的时候,可以通过 re ...
- Spring MVC 中的输入验证 Vlidator
在 Spring MVC 中有两种方式可以验证输入:1. Spring 自带的验证框架:2. 利用 JSR 303 实现,即 Java Specification Requests Converter ...
- boost asio 学习(一)io_service的基础
原文 http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio/ 编译环境 b ...
- c++11 线程池学习笔记 (一) 任务队列
学习内容来自一下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...
- 深入理解JVM(四)JVM性能监控与故障处理工具
4.2 JVM命令行工具 1.jps(JVM Process Status Tool):JVM进程查看工具,命令行进入到jdk的bin目录下,使用命令:jps -l/-q/-v/-m 2.jstat( ...
- 关于session共享
最近在银行部署项目,一台Nginx做负载均衡,两台Tomcat,两台Oracle互备,一台ftp文件服务器.Tomcat涉及到session共享问题,所以就在这里做一下总结. 首先关于session ...
- 使用itext生成pdf的,各种布局
代码如下,jar包为itext.jar,itextAsia.jar,最好都是最新的 :2张图片也在最后贴出,把图片放到D盘可以直接生成制定格式的pdf. 最后生成的pdf如下: 代码如下: packa ...
- windows server防火墙添加例外的步骤
Windows Server 2012 防火墙如何添加端口例外的方法 在Windows Server 2012系统中,如果用户想在防火墙中开通一个端口,您可以按以下步骤执行: 1. 首先点击桌面左 ...
- .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)
微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...