windows小知识

1. 冯诺依曼结构计算机工作原理:
  1) 计算机的核心工作部件是CPU, cpu内部上电后执行两个工作:1.寻址 2.执行


2. windows的启动过程: 
  启动自检: 读取BIOS,内存,CPU,硬盘,键盘等设备进行自检。信息会打印在屏幕。
  初始化启动: 找到启动设备,比如硬盘,CD Driver, USB设备等。
  Boot加载阶段:  从启动分区(C:) 加载Ntldr程序(windows 7是bootmgr), Ntldr做如下设置, 1)设置内存模式:区分x86和x64处理器,设置为32位还是64位内存模式
                  2)启动文件系统  3)读取boot.ini文件
  内核加载阶段: Ntldr, 加载系统内核 Ntoskrnl.exe, 内核对硬件底层进行抽象隔离,对操作系统提供统一的调用接口。
                 Ntldr从HKEY_LOCAL_ MACHINE\SYSTEM\CurrentControlSet下读取这台机器安装的驱动程序。
  驱动加载完成后: 1.windows创建环境变量
                   2.启动win32.sys  windows的内核模式部分。
                   3.启动csrss.exe  windows的用户模式部分
                   4.启动winlogon.exe 登陆模块
                   5.创建虚拟内存页面文件
                   6.屏幕显示windows logo界面。
3. 登陆阶段过程
   1.启动需要自启动的windows服务。
   2.启动本地安全认证Lsass.exe
   3.显示登陆界面


4. windows的一些概念:
   1. windows NT 和 windows 95开始, windows开始使用Intel 386,Pentium处理器的32位指令。当前普遍使用的是32位版本的windows ,win32.
   2. 内核对象:由内核分配的,只能由内核访问的一个内存块. e.g: 事件对象,文件对象,文件映射对象,作业对象,管道对象,进程对象。windows为了安全,不允许应用程序
                直接修改内核对象,内核对象中的成员来维护对象的信息。 这个机制可以让windows在不破坏任何应用程序的情况下在这些结构中添加,删除修改成员。
   3. 句柄: 问题:系统不允许应用程序直接修改数据结构,那么应用程序如何才能使用这些内核对象呢?
             解决方法: 当内核创建对象后,产生该对象的句柄,通过window API接口来操作这些句柄,实现需要的操作。 
             每一个进程被初始化之后,系统为它分配一个句柄表,保存该进程使用的内核对象的信息。
             句柄值可以映射到对象地址,对象地址可以映射到对象,保证了对象的安全。所以句柄是进程中讨论的。
                |句柄值|    项目          |
| 索引 |  内核对象地址    |
   4. 内核对象由内核拥有,因此进程之间可以共享内核对象的,一个进程停止使用某个内核对象,内核对象并不会立刻销毁,每个内核对象中都有一个计数器,标记有多少进程
      在使用它。当计数为0时,操作系统才销毁该对象。


5. 进程虚拟地址空间:
   1. 进程是系统资源的分配的最小单位。
   2. 每一个进程都有自己的私有空间,因此进程之间是地址隔离的。
   3. 操作系统管理 虚拟地址空间到物理空间的映射。
   4. 进程虚拟地址空间分为4个部分:1)null区,malloc分配空间 2)用户模式分区,在windows中,exe和dll都载入到这里 3)隔离区:微软保留 4)内核区: 存放OS 驻留代码,实现线程调度,内存管理,文件系统支持吗,网络支持和所有设备驱动代码都加载到这里


6. 用户模分区(地址由低到高):
   1.代码段
   2. 静态数据段
   3. 堆, 结构类似链表,这个部分包含各种导入的dll
   4. 栈, 由编译器自动分配释放,存放函数的参数值,局部变量的值


7. exe导入到执行全过程,以及地址空间的加载
1)系统找到在调用CreateProcess时指定的exe文件。
2)系统创建一个新进程的内核对象。
3)系统为这个新进程创建一个私有的地址空间。
4)系统保留一个足够大的地址空间区域,用来存放exe文件。这个区域的位置在exe文件中设定。默认情况下,exe文件的基地址是0x0400000. (1.编译器处理每个源代码模块,生成obj文件。2.链接程序将所有obj模块的内容组合在一起,生成一个单独的可执行映射文件即exe,该映射文件包含用于可执行模块的所有二进制代码以及全局/静态数据变量,同时也包含一个导入部分,列出了该可执行模块所需要的所有dll模块的名字,对于每个列出的 dll名,该导入部分指明了那些函数和变量符号是被可执行的二进制代码所引用的)
5)在将exe文件映射到进程的地址空间之后,系统会访问exe 文件中的一个段(这个段列出了一些DLL文件),并列出exe文件代码中调用函数dll文件的部分。然后,系统为每个dll文件调用loadlibrary函数,如果某个dll文件需要调用更多的 dll,那么系统会再次调用loadlibrary函数,来加载这个dll。系统保留一个足够大的地址空间区域,用来存放这个dll文件。默认情况下,微软创建dll文件基地址0x10000000。 windows提供的所有标准系统dll都有不同的基地址,这样,即使加载到单个地址空间,他们之间也不会重叠。(1.编译器处理每个源代码模块,生成一个obj模块。2.链接程序将所有obj模块的内容组合在一起,生成一个单独的dll映像文件,该映像文件包含用于dll的所有二进制代码以及全局/静态数据变量。3.如果链接程序检查到dll的源代码模块至少导出了一个函数或变量,则链接程序同时生成一个单独的lib文件,这个lib文件很小,只是简单地列出了所有被导出的函数和变量的符号名)
6)当把所有的exe文件和dll文件都映射到进程的地址空间之后,系统就会创建一个线程内核对象,并使用该线程以DLL_PROCESS_ATTACH为参数来调用每个DLL的DllMain函数,当所有映射的DLL都对此通知做出相应后,系统将驱使主线程开始执行exe文件的启动代码(winmainCRTStartup 函数),这个函数负责对c/c++运行时库进行初始化和调用函数入口函数(main 或 winmain)。
下面强调一些dll和lib的加载区别:
dll允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息(即将dll附带的lib加载到可执行模块中)。
对于lib文件,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值