目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Handling.pdf . < DAY安全: 软件漏洞分析技术> 2. 数据结构分析 二. KTHREAD KTHREAD(内核层线程对象).再次重复说明一点: windows内核中的执行体(ETHREAD, EPROCESS) 负责各种与管理和策略相关的功能,而内核层(或微内核)(KTHREAD,…
在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结构和与之相关的API函数做一下笔记. 1. 相关阅读资料 <深入解析 windows 操作系统(第4版,中文版)> --- 9章 <windows driver kit 帮助文档> http://support.microsoft.com/kb/115758/zh-cn  IRP 结构中各地址字段的含义 http://www.programlife.net/io_stack_location-i…
继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们知道,windows内核中的执行体层负责各种与管理和策略相关的功能,而内核层(微内核)实现了操作系统的核心机制.进程和线程在这两层上都有对应的数据结构.我们先从执行体层的ETHREAD开始. 一.  ETHREAD ETHREAD(执行体线程块)是执行体层上的线程对象的数据结构.在windows内核中,每个进…
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和windows中进程的表示关系密切,我们在做进程隐藏和进程枚举的时候一定会涉及到这3类数据结构,所以这里有必要及时做一下总结,做个学习笔记,理清思路. 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 <深入解析windows操作系统(第4版,中文版)> --- 潘…
最近在阅读<寒江独钓_Windows内核安全编程>一书的过程中,发现修改类驱动分发函数这一技术点,书中只给出了具体思路和部分代码,没有完整的例子. 按照作者的思路和代码,将例子补充完整,发现将驱动安装在WIN7 32位环境下,键盘失效. 经调试发现,可能的原因是替换了\\Driver\\Kbdclass类驱动的所有分发函数导致,如果只替换分发IRP_MJ_READ的函数,不会有问题,以下为代码 //替换分发函数 来实现过滤 #include <wdm.h> #include <…
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译. 1.进程 进程是正在执行的程序代码的实时结果,包含打开的文件.挂起的信号等.线程是进程中的活动的对象,内核调度的对象是线程.在Linux内核对线程与进程并不加以区分,线程只不过是一种特殊的进程. 2.进程描述符 内核把进程的信息存放在task list的双向循环链表中,链表中的…
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译. 1.操作系统和内核简介 Linux内核是自由公开软件,使用GNU的General Public License(GPL)第二版作为限制条款.大多数软件许可证决意剥夺你共享和修改软件的自由.相比之下,GNU通用公共许可证试图保证你共享和修改自由软件的自由. 通常一个内核负责响应中…
Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对Linux而言,线程是特殊的进程. 二 进程描述符及任务结构 内核使用双向循环链表的任务队列来存放进程,使用结构体task_struct来描述进程所有信息. 1 进程描述符task_struct struct task_struct {}结构体相当大,大约1.7…
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理解:计算机就是通过和用户进行交互,执行用户的指令,这些指令存放在内存中,通过寄存器存储,堆栈变化,来一步步顺序执行. 一.存储程序计算机工作模型 1.冯诺依曼体系结构-存储程序计算机 硬件角度(主板):通过cpu中IP寄存器指向一个代码段运行某些指令: 寄存区,指向内存的某一块区域(代码段) IP:16位cp…
继续上一篇(2)未完成的研究,我们接下来学习 KPROCESS这个数据结构. 1. 相关阅读材料 <深入理解计算机系统(原书第2版)> 二. KPROCESS KPROCESS,也叫内核进程块.我们在开始学习它的数据机构之前,首先要思考的一个问题是,它和EPROCESS名字感觉差不多,那它们之间是什么关系呢?它们在内核区域中都位于那一层呢? 我们先来看一张图: windows内核中的执行体负责各种与管理和策略相关的的功能(在学习笔记(2)有相关的介绍).而内核层(或微内核)实现了操作系统的&q…
转自:http://blog.csdn.net/mumufan05/article/details/45803219 学习笔记与个人理解,如有错误,欢迎指正. 温馨提示:建议跟着注释中的编号顺序阅读代码 测试方法:cat /proc/abc_proc echo 任意字符串 >/proc/abc_pro(需root权限) /************************************************* 使用seq_file接口实现可读写proc文件的例子 适用于3.10以后的内…
1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5.Linux内核之旅 6.时钟管理系统和中断子系统 7. http://www.cnblogs.com/bastard/category/412387.html…
第五章  定时测量 内核必须显式地与三种时钟打交道:实时时钟(Real Time Clock, RTC).时间标记计数器(Time Stamp Counter, TSC)及可编程间隔定时器( ProgrammableIntervalTimer,PIT).前两种硬件设备允许内核跟踪当前的时间;后一种设备由内核编程,以使它能以固定的.预先定义的频率发出中断.对于内核和用户程序使用的定时器来说,这样的周期性巾断是至关重要的. 实时时钟: 所有的PC都包含了一个叫实时时钟(RTC)的时钟.它是独立于CP…
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态.而在相应的低级别执行状态下,代码的掌控范围会受到限制.只能在对应级别允许的范围内活动.从而保证真个系统更稳定. 2.Intel x86的CPU有四种不同执行级别0-3,Linux只使用其中的0和3来分别表示内核态和用户态. 3.Cs寄存器的…
在开始具体的学习之前,你应该先了解freeRTOS的编程标准.这能够方便你在接下来的阅读中快速的了解一些内容 的基本信息,并方便记忆.此外,良好的编程风格也是工作效率的保障. 你可以在https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html中找到英文的原文信息. 尽管此前有人翻译过这份文档,但发布时间在很早以前,一些标准已经发生了改变.这里按照此前翻译的思路根据官方文档进行了更新和修订. 编程标准(Coding…
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页大小8KB 内核用相应的数据结构表示系统中的每个物理页: <linux/mm_types.h> struct page {} 内核通过这样的数据结构管理系统中所有的页,因此内核判断一个页是否空闲,谁有拥有这个页 ,拥有者可能是:用户空间进程.动态分配的内核数据.静态内核代码.页高速缓存…… 系统中…
一 内核组成部分 内核是一个操作系统的核心,主要由五个部分组成:进程调度,内存管理,虚拟文件系统,网络结构,进程间通信. 1.进程调度(SCHED) 控制进程对CPU的访问.当需要选择下一个进程运行时,由调度程序选择最值得运行的进程.可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程.Linux使用了比较简单的基于优先级的进程调度算法选择新的进程. 2.内存管理(MM) 允许多个进程安全的共享主内存区域.Linux的内存管理支持虚拟内存,即在计算机中运行…
1什么是系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口.用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件.关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等. 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间. 系统服务之所以需要通过系统调用来提供给用户空间的根本原…
第四章 中断和异常 中断通常被分为同步中断和异步中断,同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断异步中断是由其他硬件设备依照CPU时钟信号随机产生的.分别称为异常和中断,用中断信号指两者. 中断或异常处理执行的代码不是一个进程,而是内核控制路径,中断满足尽快处理完.允许中断嵌套.临界区禁止 Intel文挡把中断和异常分为以下几类:中断: 可屏蔽中断被送到微处理器的INTR引脚.通过清eflag寄存器的IF标志关闭中断.所有I/O…
第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被挂起(睡眠),直到一些条件变为真,这些条件包括:产生-个硬件巾断,释放进程正等待的系统资源,或传递一个信号,它们都能唤醒进程,即让进程的状态回到TASK RUNNING. 不可中断的等待状态(TASK_ _UNINTERRUPTIBLE) 与前一一个状态类似,但有一个例外,把信号传递到睡眼的进程不能…
第二章 :内存寻址 略.基本同计算机组成原理中的讲述 内核代码和数据结构会存储在一个保留的页框中. 常规Linux安装在RAM物理地址0x00100000开始的地方.因为:页框0是由BIOS使用,存放加电自测期间检查到的硬件配置:0x000a0000-0x000fffff的范围被留在BIOS程序使用,(并映射到ISA显示卡上的存储器).给BIOS或硬件设备保留的第一个物理地址对应的线性地址保存在i386_endbase中(0x0009f000) 关于进程的页表: 从0x00000000到PAGE…
1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内核理论上的很多优点而又不影响性能, Linux内核提供了模块(module).模块是一个目标文件,其代码可以在运行时链接到内核或从内核解除链接.这种目标代码通常由一~组函数组成,用来实现文件系统.驱动程序或其他内核上层功能.与微内核操作系统的外层不同,模块不是作为一个特殊的进程执行的.就向是一个静态…
20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: -I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 -CPU-bound:计算密集型,需要大量的CPU时间进行运算 第二种分类: -批处理进程:不必与用户交互,通常在后台运行:不必响应很快: -实时进程:有实时需求,不被低优先…
20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.进程控制块PCB--task_struct又称进程描述符,是操作系统用于管理控制进程的一个专门的数据结构,记录进程的各种属性,描述进程的动态变化过程,而PCB是系统感知进程存在的唯一标志 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct数据结构很庞大 Linux…
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调用堆栈.中断. 两把宝剑:中断上下文和进程上下文切换. 内核启动相关代码基本都在init目录下. Linux内核的核心代码在kernel目录中. -S:在CPU开始运行之前将其冻结: -s:如果不想使用1234端口,泽可以使用-gdb tcp:xxxx来代替. 重点理解相关目录内容 arch/ 该目录中包含和…
20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加time和time-asm命令 0.更新menu代码到最新版本 1.在main函数中增加MenuConfig 2.增加对应点time函数和timeasm函数 3.Make rootfs 二.在实验楼中增加内核系统调用 1.先执行rm menu -rf,强制删除原有的menu文件夹,使用git命令更新menu代码至最新版…
一.完全公平调度算法 完全公平调度 CFS 的出发点基于一个简单的理念:进程调度的效果应该如同系统具备一个理想中的完美多任务处理器.在这种系统中,每个进程能够获得 1/n 的处理器时间(n 为可运行进程数).同时,我们可以调度给它们无限小的时间周期,所以,在任何可测量周期内,我们给予 n 个进程中每个进程同样多的运行时间. 但是,上述模型并不现实,因为我们无法再一个处理器上真的同时运行多个进程.而且,如果每个进程运行无限小的时间周期也并不高效(调度时的进程抢占会带来一定的代价).因此,虽然我们希…
Linux 中采用了两种不同的优先级范围,一种是 nice 值,一种是实时优先级.在上一篇粗略的说了一下 nice 值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级.linux 内核版本为 linux 2.6.34 . 进程优先级的相关信息,存放在进程描述符 task_struct 中: struct task_struct { ... int prio, static_prio, normal_prio; unsigned int rt_priority; ... } 可以看到,有四…
进程调度程序是多任务操作系统的基础,它是确保进程能有效工作的一个内核子系统,负责决定哪个进程投入运行.何时运行以及运行多长时间.只有通过进程调度程序的合理调度,系统资源才能够最大限度地发挥作用,多进程才会有并发执行的效果.在一组处于可运行状态的进程中选择一个来执行,是调度程序所需完成的基本工作. 在前期的 Linux 版本中,Linux 的调度程序都相当简陋,设计近乎原始,虽然容易理解,但是在可运行进程多或者多处理器的环境下都难以胜任.在 Linux2.5 系列内核中,开始采用一种叫做 O(1)…
进程调用 exit() 退出执行后,被设置为僵死状态,这时父进程可以通过 wait4() 系统调用查询子进程是否终结,之后再进行最后的操作,彻底删除进程所占用的内存资源. wait4() 系统调用由 linux 内核实现,linux 系统通常提供了 wait().waitpid().wait3().wait4() 这四个函数,四个函数的参数不同,语义也有细微的差别,但是都返回关于终止进程的状态信息. 1.wait() 函数: wait() 函数的原型是: #include <sys/types.…