OS-8

Chapter 8: Memory management: physical and virtual

In the chapter related to the GDT, we saw that using segmentation a physical memory address is calculated using a segment selector and an offset.

In this chapter, we are going to implement paging, paging will translate a linear address from segmentation into a physical address.

Why do we need paging?

Paging will allow our kernel to:

  • use the hard-drive as a memory and not be limited by the machine ram memory limit
  • to have a unique memory space for each process
  • to allow and unallow memory space in a dynamic way

In a paged system, each process may execute in its own 4gb area of memory, without any chance of effecting any other process’s memory, or the kernel’s. It simplifies multitasking.

Processes memories

How does it work?

The translation of a linear address to a physical address is done in multiple steps:

  1. The processor use the registry CR3 to know the physical address of the pages directory.
  2. The first 10 bits of the linear address represent an offset (between 0 and 1023), pointing to an entry in the pages directory. This entry contains the physical address of a pages table.
  3. the next 10 bits of the linear address represent an offset, pointing to an entry in the pages table. This entry is pointing to a 4ko page.
  4. The last 12 bits of the linear address represent an offset (between 0 and 4095), which indicates the position in the 4ko page.

Address translation

Format for pages table and directory

The two types of entries (table and directory) look like the same. Only the field in gray will be used in our OS.

Page directory entry

Page table entry

  • P: indicate if the page or table is in physical memory
  • R/W: indicate if the page or table is accessible in writting (equals 1)
  • U/S: equals 1 to allow access to non-preferred tasks
  • A: indicate if the page or table was accessed
  • D: (only for pages table) indicate if the page was written
  • PS (only for pages directory) indicate the size of pages:
    • 0 = 4ko
    • 1 = 4mo

Note: Physical addresses in the pages diretcory or pages table are written using 20 bits because these addresses are aligned on 4ko, so the last 12bits should be equal to 0.

  • A pages directory or pages table used 1024*4 = 4096 bytes = 4k
  • A pages table can address 1024 * 4k = 4 Mo
  • A pages directory can address 1024 * (1024 * 4k) = 4 Go
How to enable pagination?

To enable pagination, we just need to set bit 31 of the CR0registry to 1:

asm("  mov %%cr0, %%eax; \
       or %1, %%eax;     \
       mov %%eax, %%cr0" \
       :: "i"(0x80000000));

But before, we need to initialize our pages directory with at least one pages table.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值