跟我一起写操作系统(五)——分配物理内存

转载注明出处:http://www.cnblogs.com/lucasysfeng/p/4847662.html

上一讲地址:http://www.cnblogs.com/lucasysfeng/p/5059767.html

项目地址:https://github.com/lucasysfeng/lucasOS

  

  上一讲我们获取到了物理内存,本讲我们来看如何分配物理内存。为简化问题,我们不使用伙伴内存分配算法,而是把可用内存按页存入栈中,每次分配从栈中取就可以了。

  本讲的主要代码在lib/pmm.c中,下面给出部分代码。本讲内容不多,读者看代码即可。

void init_pmm()
{
	mmap_entry_t *mmap_start_addr = (mmap_entry_t *) glb_mboot_ptr->mmap_addr;
	mmap_entry_t *mmap_end_addr = (mmap_entry_t *) glb_mboot_ptr->mmap_addr
			+ glb_mboot_ptr->mmap_length;

	mmap_entry_t *map_entry;

	for (map_entry = mmap_start_addr; map_entry < mmap_end_addr; map_entry++)
	{

		// type为1表示可用内存,其它指保留区域,参考上一讲的multiboot_t结构
		if (map_entry->type == 1 && map_entry->base_addr_low == 0x100000)
		{

			// 可用内存要减去内核本身占用的内存
			uint32_t page_addr = map_entry->base_addr_low
					+ (uint32_t) (kern_end - kern_start);
			uint32_t length = map_entry->base_addr_low + map_entry->length_low;

			while (page_addr < length && page_addr <= PMM_MAX_SIZE)
			{
				pmm_free_page(page_addr);
				page_addr += PMM_PAGE_SIZE;
				phy_page_count++;
			}
		}
	}
}

  

void pmm_free_page(uint32_t p)
{
	assert(pmm_stack_top != PAGE_MAX_SIZE, "out of pmm_stack stack\n");
	pmm_stack[++pmm_stack_top] = p;
}

  

代码获取



  本系列GitHub地址 https://github.com/lucasysfeng/lucasOS,本讲的代码是code/chapter5.

时间: 2024-10-24 08:29:24

跟我一起写操作系统(五)——分配物理内存的相关文章

跟我一起写操作系统(四)——获取物理内存

转载注明出处:http://www.cnblogs.com/lucasysfeng/p/4847662.html 上一讲地址:http://www.cnblogs.com/lucasysfeng/p/5036562.html 项目地址:https://github.com/lucasysfeng/lucasOS 我们知道,内存管理是操作系统的重要组成部分,在学习内存管理之前,首先要解决一个问题:如何获取物理内存?在前几讲我们谈到,内核是由GRUB启动的,因此要在内核中获取物理内存时,我们可以通过

Orange&#39;s 自己动手写操作系统 第一章 十分钟完成的操作系统 U盘启动 全记录

材料: 1 nasm:编译汇编源代码,网上很多地方有下 2  WinHex:作为windows系统中的写U盘工具,需要是正版(full version)才有写的权限,推荐:http://down.liangchan.net/WinHex_16.7.rar 步骤: 1 编译得到引导程序的机器代码.用命令行编译汇编源代码:name boot.asm -o boot.bin,其中boot.bin文件产生在命令行的当前目录中. 2 将引导程序写入到U盘引导盘的第一个扇区的第一个字节处(后),即主引导区.

自己动手写操作系统 -- 环境搭建

目录: 软件和工具下载 Bochs虚拟机配置文件 Hello World编辑编译 1. 软件和工具下载 Bochs虚拟机下载安装 下载地址: http://download.pchome.net/system/sysenhance/down-19486.html dd for windows下载安装 下载地址: http://www.downxia.com/downinfo/17093.html nasm for windows下载安装 下载地址: http://download.csdn.ne

自己动手写操作系统--个人实践

近期開始看于渊的<自己动手写操作系统>这本书,刚開始看就发现做系统的引导盘居然是软盘!心里那个汗啊! 如今都是U盘了,谁还用软盘.于是考虑用U盘. 于是開始下面步骤: 1.既然书上说给先要把软盘做引导盘,那我就相似地把U盘做成引导盘.在网上找了半天,发现USboot,于是就用它给自己的U盘做了一个引导盘. 2.把编译后的boot.bin文件用绝对扇区工具写入U盘就万事大吉了.相同,在网上找到了winhex(还有ultraiSO,这个没有什么用),但是这个关键的一步,自己不知道如何用winhex

跟我一起写操作系统(三)——打印函数和qemu虚拟机

转载注明出处:http://www.cnblogs.com/lucasysfeng/p/4847662.html 上一讲地址:http://www.cnblogs.com/lucasysfeng/p/4847662.html 项目地址:https://github.com/lucasysfeng/lucasOS 本讲主要涉及以下三个方面:1. 打印函数封装:2. qemu的使用:3. 项目目录结构调整. 理由如下:1. 后续开发无疑会遇到打印变量的操作,因此有必要封装打印函数(内核开发阶段,无法

10min手写(五):面试题解析丨Python实现tail -f功能

作者:蜗牛 shengxinjing (woniuppp) · GitHub 写这篇文章的初衷是有人去面试遇到了这个笔试题,不知道怎么做,没有什么思路,就发到了Reboot 的交流群里,让大家一起讨论讨论. 关于这道题,简单说一下我的想法吧.当然,也有很好用的 pyinotify 模块专门监听文件变化,不过我更想介绍的,是解决的思路.毕竟作为面试官,还是想看到一下解决问题的思路,而且我觉得这一题的难点不在于监控文件增量,而在于怎么打印最后面10行. 希望大家在读这篇文章前,对 Python 基础

跟我一起写操作系统(一)---好的开始是成功的一半

讲操作系统理论的书籍很多,看完觉得是那么回事,但总感觉少点什么,少的就是动手.想动手,但无从下手,不知从何做起,是普遍初学者的困惑,为了解决这个困惑,也为了记录自己的学习过程,就写了<跟我一起写操作系统>这个系列.主要参考<一个操作系统的实现>. 10分钟写个操作系统 一. 开发环境. 我们在linux下编译镜像等,因此需要linux开发环境.如果你用windows, 那么在windows下安装VMware, 在VMware中安装ubuntu虚拟机,此ubuntu作为开发环境. 注

读 自己动手写操作系统

用一个月左右的时间读了<自己动手写操作系统>,这是一本让人读着很过瘾,却也特别累的一本书. http://ike.126.com 对操作系统的兴趣由来已久,只是一直未能找到入门之径.操作系统教材是个令人生畏的东西,它可以告诉人有什么,却不能告诉人为什么,从那里了解的操作系统有如盲人摸到的象,得到各个部分,却不能拥有整体,加之缺乏实践的支持,理论显得苍白空洞.如Linux般的开源操作系统,虽然可以让人坐拥全部源码,但一来规模庞大,让人不知从何入手,二来源码背后更多的是业务--操作系统和硬件知识,

自己动手写操作系统(一)环境准备

参考书籍为<自己动手写操作系统>于渊著 VMware12 centOS7.4.1708 1.bochs安装 首先下载安装包: 下载地址 然后解压,解压命令:sudo tar -zxvf bochs-2.6.9.tar.gz cd命令进入解压目录,先进行配置 配置命令:./configure --enable -debugger --enable-disasm 然后:sudo make 当我执行这一步的时候,报错了 没有Xlib的话就安装一下,这里进行全部安装:yum install libX*