原创

reactos操作系统实现(28)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://mysoft.blog.csdn.net/article/details/3912095

 在内存管理里,绝大部份内存都是分页内存。分页内存就是把内存分成4K页大小的内存块,这些内存块不但可以在物理内存里,也可以切换时保存到硬盘里。这些内存管理里是通过下面的代码进行的,如下:

#001  VOID

#002  INIT_FUNCTION

#003  NTAPI

#004  MmInitializePagedPool(VOID)

#005  {

#006       /*

#007        * We are still at a high IRQL level at this point so explicitly commit

#008        * the first page of the paged pool before writing the first block header.

#009        */

 

分配一页物理内存作为内存管理结构头。

#010       MmCommitPagedPoolAddress ( (PVOID)MmPagedPoolBase, FALSE );

#011 

 

下面就根据内存数据结构初始化分页管理的内存。

#012       MmPagedPool = RPoolInit ( MmPagedPoolBase,

#013              MmPagedPoolSize,

#014              MM_POOL_ALIGNMENT,

#015              MM_CACHE_LINE_SIZE,

#016              PAGE_SIZE );

#017 

#018       ExInitializeFastMutex(&MmPagedPool->Mutex);

#019  }

 

通过上面函数就可以把分页内存初始化,准备好分页内存给其它函数使用。下面的函数就是从分页内存里分配内存出来的,如下:

#001  /**********************************************************************

#002   * NAME       INTERNAL

#003   * ExAllocatePagedPoolWithTag@12

#004   *

#005   * DESCRIPTION

#006   *

#007   * ARGUMENTS

#008   *

#009   * RETURN VALUE

#010   */

#011  PVOID NTAPI

#012  ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType,

#013                              IN ULONG  NumberOfBytes,

#014                              IN ULONG  Tag)

#015  {

#016       int align;

#017 

 

根据分配内存大小来选择不同的对齐方式。

#018       if ( NumberOfBytes >= PAGE_SIZE )

#019              align = 2;

#020       else if ( PoolType & CACHE_ALIGNED_POOL_MASK )

#021              align = 1;

#022       else

#023              align = 0;

#024 

 

使用分页内存的线程都需要低于APC_LEVEL级别。

#025       ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL);

#026 

 

下面调用双向链表的内存管理器。

#027       return RPoolAlloc ( MmPagedPool, NumberOfBytes, Tag, align );

#028  }

#029 

 

分页内存管理的代码主要文件ntoskrnl/mm/ppool.c里。

展开阅读全文

[28] 实现strStr()

06-17

<p>rn 作为要准备踏入码农行业的人来说,怎么能不去刷刷LeetCode呢?LeetCode收录了许多互联网公司、IT企业的笔试题目,被称为刷题神器。同样的,不少非计算机专业的科班出身的学员朋友,做的编程还是挺多的,在编程过程中或多或少觉得自己的“野路子”实在太多,有时不仅写得煎熬,而且书写很多时候都非常不规范。因此,学习、借鉴、模仿高手的代码套路,不仅仅有助于提升职业技能,更进一步的也能增加自己求职的底气和心气。Leetcode是面向职场就业的,而非追求高度思维技巧的ACM竞赛,特别是LeetCode的基础题目并不多,目前大概有358道,而且其题型都非常简单明了,并不需要的复杂的理解,一般都在50行左右就可以解决。这有助于广大的求职朋友建立自信,提升技能。本门课程分类精选了30道题目,从vs code刷题环境搭建起手,手把手的进行了课程引导,以期能帮助广大求职人员,积累知识,提升技能,不过有些题是加锁的,好像有付费才能使用,能做的题应该有150多道吧,这也是完全足够了。<br />rn&nbsp; 另外,如果你写了上百行代码,就肯定说明你想太多了或太复杂,虽然都能用很短的代码就能解决,但并不意味着LeetCode的题目非常简单,实际上LeetCode基本上涉及到了所有常规的算法类型。<br />rn&nbsp; 关于LeetCode的刷题时间:个人认为大概是要一个月左右,如果你是大神的话,也许大概能在两到三个星期间刷 完,不过做为新手,除了埋头做题,更重要的是去讨论区看看别人的代码或思路。一道一道刷题虽然速度慢了点,不过会学到了许多。为了帮助广大学员朋友切实提升程序开发技巧,积累学习信心,克服畏难情绪,丁宋涛和夏曹俊老师共同精心设计了本门课程。希望通过本门课程可以分享知识,掌握技能。<br />rn</p>rn<p>rn <img src="https://img-bss.csdn.net/201906171412298012.png" alt="" />rn</p>

没有更多推荐了,返回首页