内核知识第六讲,内核编写规范,以及获取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表的更多相关文章

  1. 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理

    内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表. 我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表 我们知道,GDT表中.存储的是存储段信息. 保存了 ...

  2. 内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

    内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析. 我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数 ...

  3. Linux基础知识第六讲,远程管理ssh操作

    目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...

  4. 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试

    目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...

  5. Docker背后的内核知识(一)

    Docker背后的内核知识 当谈论Docker时,常常会聊到Docker的实现方式.很多开发者都知道,Docker容器本质上是宿主机上的进程.Docker通过namespace实现了资源隔离.通过cg ...

  6. Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质

    原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...

  7. 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING

    目录 一丶驱动是如何运行的 1.服务注册驱动 二丶Ring3跟Ring0通讯的几种方式 1.IOCTRL_CODE 控制代码的几种IO 2.非控制 缓冲区的三种方式. 三丶Ring3跟Ring0开发区 ...

  8. 内核第三讲,进入ring0,以及编写第一个内核驱动程序.

    内核第三讲,进入ring0,以及编写第一个内核驱动程序. PS: 请下配置双机调试,下方有可能用到.如果不配置,则你可以不用调试, 博客连接: http://www.cnblogs.com/iBina ...

  9. LINUX内核分析第六周学习总结——进程的描述和进程的创建

    LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

随机推荐

  1. C++字符串结束标识

    用一个字符数组可以存放一个字符串中的字符.如: char str[12]={'I',' ','a','m',' ','h','a','p','p','y'}; 用一维字符数组str来存放一个字符串″I ...

  2. C++ 提取网页内容系列之四正则

    标 题: C++ 提取网页内容系列之四作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4173833.html 欢迎转帖 请保持文本完整并注明出处 将网页内 ...

  3. background-clip 和 background-origin 的区别

    background-origin:指定绘制背景图片的起点. background-clip:是对背景图片的剪裁,指定背景图片的显示范围. 1.background-origin:padding  | ...

  4. Pivot For和UNPivot For

    一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...

  5. JS基础-数组的常用方法-冒泡排序

    1.数组  1.关联数组    以数字作为元素下标的数组,就是索引数组.    以字符串作为元素下标的数组,就是关联数组.  2.js的关联数组    ex:在php中       $array=[& ...

  6. wind量化交易

    https://www.joinquant.com/study?f=home&m=memu https://www.v2ex.com/member/mushroomqiu https://sa ...

  7. python_requests随笔

    #coding=utf-8 import requests url = "http://oj.jxust.edu.cn" #如果需要持续的链接,可以使用里面的Session方法(保 ...

  8. winSocket编程(十)完成端口

    //本篇为转贴 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这篇文档我非 ...

  9. 第四周Access的总结

    一.问;这节课你学到了什么知识? 答:这周我们学习了新的课程:表的建立和管理.这是Access最重要的一部份,需要我们认认真真学习!            字段是表最重要的信息,而数据类型是字段或表中 ...

  10. [转]WordPress“添加媒体”文件时只显示上传到当前文章的附件图片

    使用WordPress的朋友应该都清楚,特别是喜欢图文并茂的网站,肯定离不开的就是WordPress文章编辑页面的“添加媒体”按钮,每次点击就能弹出一个插入多媒体的界面,然后页面默认就会列举加载所有最 ...