内核知识第六讲,内核编写规范,以及获取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. 虚拟机下 centos7 无法连接网络

    [root@localhost ~]# cd /etc/sysconfig/network-scripts [root@localhost network-scripts]# ls ifcfg-ens ...

  2. Linux系统中的tar命令

    时间一长什么东西都容易忘记,尤其是一些不常用的东西忘记的更快,所以避免忘记,就记录下来,可以方面使用的时候查询.Tar命令在linux系统中算是一个比较重要的命令,今天就针对该命令进行总结一下. 1. ...

  3. git 添加分支并与远程连接

    今天由于项目需要,要改版,为了不影响当前网站,所以用分支来管理 首先,在本地添加分支dev git checkout -b dev 提交远程,让同事拉取这个分支,我是直接push了,推到远程. 同事在 ...

  4. vue-computed计算属性

    计算属性:用来封装你想对一个属性进行的操作 computed VS mothod实现的效果和定义一个methods中的function相同,但是他们的区别在于:methods的function当触发重 ...

  5. BootStrap初始

    序言 什么是Bootstrap Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. Bootstrap是 ...

  6. linux下面重启apche 与mysql服务

    1.service httpd restart 重启apache 2.service mysqld restart 重启mysql 开启与停止换成start与stop即可

  7. Could not transfer artifact org.springframework

    无法从中心仓库获取该版本的信息, 从新下载: 1.配置eclipse中的maven  user setting路径为本地maven安装路径 配置阿里云镜像路径 <mirror> <i ...

  8. 网站日志流量分析采集(LuaJIT系统环境部署-node03,相关jar包自己手动上传)

    注:/usr/local/src 是源码包路径,可以自己更改 服务器中安装依赖 yum -y install gcc perl pcre-devel openssl openssl-devel 上传 ...

  9. s2 Docker环境的快速搭建方法

    常规linux下安装 centos7 下配置docker源并安装 cat >/etc/yum.repos.d/docker.repo< [dockerrepo] name=Docker R ...

  10. 51nod1683

    代码参考:http://blog.csdn.net/sdfzyhx/article/details/74359927 //dp[i][j][k]表示到了第i列,最下边的点最短路为j,剩下的点之间的关系 ...