![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
写一个自己喜的欢操作系统
麻雀123
这个作者很懒,什么都没留下…
展开
-
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 · 260 阅读 · 0 评论 -
wdm驱动原理1
也就是说VideoPortInitialize 的前两个参数是vga.sys的DriverEntry收到的两个参数,之后初始化。第三个参数,第四个参数均是0,再调用videoprtr的VideoPortInitialize函数。3、调用 videoprt.sys的函数VideoPortInitialize。操作系统启动时,遍历硬件设备,再找到对应的驱动程序,调用相应的sys文件。videoprtr的DriverEntry没有具体的内容。一个正常的驱动程序,应在该函数做以下事情。IDA分析的函数定义。原创 2024-04-25 15:42:04 · 153 阅读 · 0 评论 -
山寨windows
5、.bss区段:包含未初始化的全局和静态变量,该区段在文件中不占用空间,只在内存中分配。因此只需要将文件分段加载至内存,再处理好导入表,还有一些重定位等需要处理,就可以正常运行。6、.idata区段:包含导入表,用于存储程序运行时需要动态链接的外部函数和库的信息。现在要处理是驱动程序 sys的加载与调用,主要是内核api的资料比较少,还在试验当中。7、.rsrc区段:包含资源数据,如图标、位图、字符串等。1、文件头,包含DOS文件头、PE文件头、段信息等。以上过程均已通过代码实验成功。原创 2024-04-08 16:03:39 · 160 阅读 · 0 评论 -
自写系统运行windows程序
运行已经基本正常了。原创 2024-03-21 14:03:48 · 169 阅读 · 0 评论 -
操作系统DC分析1
显示窗口,即将窗口对应的内容写入显卡内存,因此窗口需要指向一个地址,该地址可以是内存也可以是显存。放在系统内存好处是系统刷新窗口不用切换进程,坏处是系统空间只有2G,窗口多了是否够用,是放堆内,还是另外申请空间,还有建立DC时需切换至内核态;2、起点(x0,y0),窗口与DC的不同,顶级窗口起点为屏幕窗口的相对位置,子窗口为顶级窗口的相对位置,如果是孙子窗口,则需考虑父窗口的位置。3、窗口内存与DC内存指向同一块地址,除部分操作(移动,)其他窗口大部分操作都是通过DC操作,本次采用的写内存方法,原创 2024-03-18 12:12:00 · 362 阅读 · 0 评论 -
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 · 388 阅读 · 0 评论 -
pe文件加载0
读取pe文件图标正常,运行过程还存在问题,继续努力!原创 2024-03-15 12:07:42 · 303 阅读 · 1 评论 -
icon格式软解码
说是icon格式,实际上只是将 XOR 图直接画在窗口上,搞清格式就不,有点一相不通为什么要把数据倒过来存储。原创 2024-03-07 20:46:46 · 419 阅读 · 0 评论 -
绘制窗口及窗口位置变化
自制操作系统,如何处理窗口移动、关闭绘制的问题原创 2024-02-28 22:42:59 · 357 阅读 · 1 评论 -
写一个自己作主的操作系统
不记得什么时候开始想自己写一个操作系统,从引导程序开始,到现在快有10年了吧,没做事了,就写一些,忙起来就丢一边了。后来想接着写,结果发现前面写的东西都看不懂,只得又重新学一遍,主要资料难找,一点点往前写,慢慢的形成了一个框架。1、内存分页,4G平坦地址、用户态2G(由进程独占),系统态2G(所有进程、内核共享)2、实现显卡、鼠标、键盘、硬盘、GDT 、IDT、时钟的基本功能。3、进程、线程、窗口、消息、系统调用、用户态函数回调的运行和协调。4、动态DLL,应用程序EXE的加载和运行。5、窗口的正常显示。原创 2024-02-23 15:21:53 · 392 阅读 · 1 评论 -
内存管理——线性内存,进程空间
一个新进程创建后,第一个执行函数为proc_startup,该函数过程如下。1、初始化进程空间管理器,该数据放在0x7FFFF000固定位置。2、建立堆,全局变量,放在系统栈中,3、建立文件列表,全局变量,5、根据主文件加载DLL。原创 2024-02-21 13:58:44 · 544 阅读 · 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 · 405 阅读 · 1 评论 -
PE 资源表-字符串
根据 字串ID查找 PE中对应的资源,字串的ID不是显式存在,需要通过计算得出原创 2024-02-21 10:16:49 · 329 阅读 · 1 评论 -
操作系统启动流程
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 · 48 阅读 · 0 评论 -
内存管理——线性空间,系统空间
代码由mem_sys_virtual_init,mem_virtual_alloc,mem_virtual_alloc三个函数完成。将内存分成若干块,每块标注属性,需要申请时找到合适的块,或者从大块中分割小块出来。释放时查找前后块的属性,都为空闲时合并。32位的内存空间是4G,除开些保留的、给硬件的、还有一些特殊用途的将,剩余的前2G分给应用程序,由不同的程序单独使用(用户态),后2G分给系统由所有程序共享(核心态)。系统内存管理顺序表由内核文件编译时决定存放位置,不用额外申请空间。原创 2023-11-08 22:49:17 · 50 阅读 · 1 评论 -
内存管理——malloc
第一 建立线性内存空间管理表,将线性内存分成若干个段,除开一些特殊的段外,存在一些自由的段;第二 从自由段中抽取一块作为堆,堆初始化后,就可以通过malloc函数申请变量的存储空间了。堆可以有多个,,共享系统程序空间应建立至少一个堆,进程中也可以建立多个。malloc函数应给定堆的指针。原创 2023-11-09 20:34:53 · 51 阅读 · 1 评论 -
内存管理——物理内存
在线性内存空间里建立一个内存块(这个位置固定在系统映像+系统栈之后),每个字节用来表示一个物理内存块的状态,4KB可以标注16M线性内存,当前块使用一次则增加1,释放则减1,如果该数字为0表示为空闲块。之后为页目录(4K)、页表(13K)、系统映映像(?)、系统栈(16K)、内存map(8K)、空闲(?因为线性空间要分成两部分,一部分为内核所有进程共享,另一部分为用户进程独享,所以需要建立两个管理列表。内存管理分为物理内存管理,线性内存管理。物理内存用Map方式管理,线性内内用分块链接表方式管理。原创 2023-11-07 21:29:05 · 64 阅读 · 0 评论