- 博客(26)
- 资源 (3)
- 收藏
- 关注
原创 PCI配置空间访问
当0xCF8-CFB作为单独的Byte使用时,往0xCFB的bit0写1意味着使用PCIconf1,写0使用PCI conf2,conf2已经废弃不用 WritePortByte(0xCFB, 0x01);2、I/O Address Space ,io端口,0~0xFFFF(64K),通过in、out 指令直接访问,PCI配置空间访问有4种方式:pci_bios、pci_conf1、pci_conf2、pci_mmcfg。在reactos0.17中有完整的代码。pci_mmcfg应该是MMIO方式,
2024-04-30 21:59:35 347
原创 wdm驱动原理1
也就是说VideoPortInitialize 的前两个参数是vga.sys的DriverEntry收到的两个参数,之后初始化。第三个参数,第四个参数均是0,再调用videoprtr的VideoPortInitialize函数。3、调用 videoprt.sys的函数VideoPortInitialize。操作系统启动时,遍历硬件设备,再找到对应的驱动程序,调用相应的sys文件。videoprtr的DriverEntry没有具体的内容。一个正常的驱动程序,应在该函数做以下事情。IDA分析的函数定义。
2024-04-25 15:42:04 178
原创 山寨windows
5、.bss区段:包含未初始化的全局和静态变量,该区段在文件中不占用空间,只在内存中分配。因此只需要将文件分段加载至内存,再处理好导入表,还有一些重定位等需要处理,就可以正常运行。6、.idata区段:包含导入表,用于存储程序运行时需要动态链接的外部函数和库的信息。现在要处理是驱动程序 sys的加载与调用,主要是内核api的资料比较少,还在试验当中。7、.rsrc区段:包含资源数据,如图标、位图、字符串等。1、文件头,包含DOS文件头、PE文件头、段信息等。以上过程均已通过代码实验成功。
2024-04-08 16:03:39 184
原创 操作系统DC分析1
显示窗口,即将窗口对应的内容写入显卡内存,因此窗口需要指向一个地址,该地址可以是内存也可以是显存。放在系统内存好处是系统刷新窗口不用切换进程,坏处是系统空间只有2G,窗口多了是否够用,是放堆内,还是另外申请空间,还有建立DC时需切换至内核态;2、起点(x0,y0),窗口与DC的不同,顶级窗口起点为屏幕窗口的相对位置,子窗口为顶级窗口的相对位置,如果是孙子窗口,则需考虑父窗口的位置。3、窗口内存与DC内存指向同一块地址,除部分操作(移动,)其他窗口大部分操作都是通过DC操作,本次采用的写内存方法,
2024-03-18 12:12:00 388
原创 pe文件运行过程
一、pe入口为 _WinMainCRTStartup (ida6.5显示的函数名,下面是ida7.5转的C代码),简单来说,就是先调用HeapCreate建立一个可变大小的堆,在该堆上申请几块内存用于管理小内存变量,如果是变量较大则调用HeapAlloc。运行之后 p1=0x00560000 p2=0x01f30000 e=0x005607e0。运行之后,p=0x003f0000,e=0x003f07e0,此时堆应该变大了。分析vc6 生成的hello world 程序,
2024-03-18 11:20:23 397
原创 pe文件资源查找
资源结构表有四层,前三层的偏移地址从本段基地址开始,前三层结构相同,为IMAGE_RESOURCE_DIRECTORY+IMAGE_RESOURCE_DIRECTORY_ENTRY组成。IMAGE_DOS_HEADER+IMAGE_NT_HEADERS +IMAGE_SECTION_HEADER+数据。0x409="utf-8"资源段为IMAGE_DIRECTORY_ENTRY_RESOURCE。IMAGE_SECTION_HEADER为段描述结构。第二层 ID为资源ID,字串ID=真实ID/16+1;
2024-03-18 10:55:26 430
原创 写一个自己作主的操作系统
不记得什么时候开始想自己写一个操作系统,从引导程序开始,到现在快有10年了吧,没做事了,就写一些,忙起来就丢一边了。后来想接着写,结果发现前面写的东西都看不懂,只得又重新学一遍,主要资料难找,一点点往前写,慢慢的形成了一个框架。1、内存分页,4G平坦地址、用户态2G(由进程独占),系统态2G(所有进程、内核共享)2、实现显卡、鼠标、键盘、硬盘、GDT 、IDT、时钟的基本功能。3、进程、线程、窗口、消息、系统调用、用户态函数回调的运行和协调。4、动态DLL,应用程序EXE的加载和运行。5、窗口的正常显示。
2024-02-23 15:21:53 413 1
原创 内存管理——线性内存,进程空间
一个新进程创建后,第一个执行函数为proc_startup,该函数过程如下。1、初始化进程空间管理器,该数据放在0x7FFFF000固定位置。2、建立堆,全局变量,放在系统栈中,3、建立文件列表,全局变量,5、根据主文件加载DLL。
2024-02-21 13:58:44 572 1
原创 栈的分配与管理
原程序运行在用户态,中断时处理器就要到TSS处找到0级的ss和esp,然后切换堆栈,然后处理器把被中断进程的ss,esp,EFLAGS,CS,EIP,压栈,如果有错误码的话,错误码将最后被压栈(iretd指令并不会自动弹出错误码。3、 用户线程有两个状态,需要两个栈,一个是内核栈,由创建线程的程序创建(高2G),主要用于线、进程初始化和sysenter 指令,另一个是用户栈,由线程初始化程序设置(位于低2G线性空间中)。2.将IA32_SYSENTER_CS的值加上0x18+3,将其结果加载到SS中。
2024-02-21 13:50:45 425 1
原创 保护模式利用V86 mode 调用bios中断
进入保护模式后,可以利iret 设置eflags寄存器中VM位 从而进入V86 mode。返回保护模式是用sysenter指令返回。4、使用iret指令前要将eglags中的IOPL设置为3,这样执行iret、sysenter指令不会报错;1、V86 mode是运行在CPL 3特权下的,操作代码是16位;5、寻方式为 段:偏移,1M范围内;3、需先初始化 GDT、IDT;2、分页机制有保护标志;
2023-11-10 14:35:55 178 1
原创 内存管理——malloc
第一 建立线性内存空间管理表,将线性内存分成若干个段,除开一些特殊的段外,存在一些自由的段;第二 从自由段中抽取一块作为堆,堆初始化后,就可以通过malloc函数申请变量的存储空间了。堆可以有多个,,共享系统程序空间应建立至少一个堆,进程中也可以建立多个。malloc函数应给定堆的指针。
2023-11-09 20:34:53 69 1
原创 内存管理——线性空间,系统空间
代码由mem_sys_virtual_init,mem_virtual_alloc,mem_virtual_alloc三个函数完成。将内存分成若干块,每块标注属性,需要申请时找到合适的块,或者从大块中分割小块出来。释放时查找前后块的属性,都为空闲时合并。32位的内存空间是4G,除开些保留的、给硬件的、还有一些特殊用途的将,剩余的前2G分给应用程序,由不同的程序单独使用(用户态),后2G分给系统由所有程序共享(核心态)。系统内存管理顺序表由内核文件编译时决定存放位置,不用额外申请空间。
2023-11-08 22:49:17 92 1
原创 内存管理——物理内存
在线性内存空间里建立一个内存块(这个位置固定在系统映像+系统栈之后),每个字节用来表示一个物理内存块的状态,4KB可以标注16M线性内存,当前块使用一次则增加1,释放则减1,如果该数字为0表示为空闲块。之后为页目录(4K)、页表(13K)、系统映映像(?)、系统栈(16K)、内存map(8K)、空闲(?因为线性空间要分成两部分,一部分为内核所有进程共享,另一部分为用户进程独享,所以需要建立两个管理列表。内存管理分为物理内存管理,线性内存管理。物理内存用Map方式管理,线性内内用分块链接表方式管理。
2023-11-07 21:29:05 128
原创 操作系统启动流程
3、DBR从分区中加载引导程序+初始化程序(这两程序合并成一个文件OSKRNL)到0x20000,按文件大小全部加载。1、电脑加电后,先通过BIOS初始化硬件,然后从硬盘0磁道加载一扇区数据(MBR)到0x7C00~0x7E00内存,然后跳转到x7C00执行。2、MBR让出0x7C00~0x7E00内存,将引导分区的数据(DBR)加载至该段内存。6.5 硬盘初始化, 这之后就可以从硬盘上加载单独的驱动文件。4、OSKRNL由osloader.bin+oskrnl.exe组成。
2023-11-02 21:39:32 85
原创 显存读写
vbe 提供了保护模式的接口,设置 模式可以通过基提供的端口操作。LFBMTRRvoid BgaSetVideoMode(unsigned int Width, unsigned int Height, unsigned int BitDepth, int UseLinearFrameBuffer, int ClearVideoMemory){ // VBE disablin...
2020-02-29 22:32:03 1757
原创 fat32分区引导程序
fat32分区引导程序作用读取分区内的系统初始化文件freeldr.sys/** COPYRIGHT: See COPYING in the top level directory* PROJECT: ReactOS Bootsector* FILE: boot/freeldr/bootsect/fat32.S* P...
2019-05-20 15:53:24 1052
原创 引导
硬盘引导模块主机按下启动键后,CPU读取BIOS,BIOS初始化,将启动盘的第一扇区512B数据读到内存的0x7c00-0x7d00,并跳转至0x7c00。这一段的代码的作用是: 选择要启动的分区,并将要启动分区的数据读至合适的内存位置并跳转。start:// 初始化各寄存器 cli mov ss, ax mov sp, offset start m...
2019-05-19 09:49:49 174
APToolV7200(2020-03-18).rar
2021-05-13
BOCHS 虚拟硬盘工具
2020-03-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人