Buddy_Zhang1 发表于 2016-03-09 21:10

本帖最后由 Buddy_Zhang1 于 2016-03-10 15:25 编辑

Feature Update
在 64 位系统上模拟 32 位程序技巧分析:
1. 对于基于内存问题的变量,使用 unsigned int !! 而不使用 unsigned long
2. 内存对齐时,使用 unsigned int 对齐,不使用 long 或 unsigned long 对齐。
3. 位操作时候,使用 U 而不使用 UL
4. 64 位指针转换为 32 指针,使用 unsigned long 技巧。
5. void * 位 8 byte
{:yxh45:}

_nosay 发表于 2016-03-09 21:56

搞个赞,加油。

Godbach 发表于 2016-03-10 11:14

回复 1# Buddy_Zhang1

LZ 一直在更新。赞!


   

Buddy_Zhang1 发表于 2016-03-10 15:20

本帖最后由 Buddy_Zhang1 于 2016-03-11 14:18 编辑

Feature Update
重大更新:

1. 支持 TLB.   
    TLB 主要用来存储虚拟地址到物理地址转化的缓存.为了实现这种模拟,我的做法如下:
    1) 使用下面结构来存储一个转换关系.
         struct node {
             struct rb_node node;
             unsigned int phys_addr;
             unsigned int virt_addr;
             unsigned int mem_addr;
         }__attribute((aligned(unsigned int)));
    2) 使用红黑树进行管理,使用虚拟地址作为红黑树的平衡因子.
    3) 引入 TLB 的目的主要是解决该模拟器模拟用户空间地址转换或 vmallc() 分配的虚拟地址,加速转换为物理地址!
    4) struct node 使用 __attribute((aligned(unsigned int))) 进行对齐,这样有助于数据在 TLB 中的管理.
    5) 对 TLB 的管理,后期我会查考相关 TLB 知识,应该会引入 VIPT 或 VIVT 机制.
    6) 用户空间或高端内存虚拟区获取物理地址参照下面例程:
         
unsigned int TLB_virt_to_phys(unsigned int virt)
{
      struct rb_node *node = TLB_root->rb_node;// TLB_root 为 TLB 的红黑树根节点.
      
      while(node) {
             struct node *data = container_of(node,struct node,node);
         
             if(virt> data->virt_addr)
                  node = node->rb_right;
             else if(virt < data->virt_addr)
                  node = node->rb_left;
             else
                  return data->phys_addr;
      }
      return 0xFFFFFFFF;
}
         

   
   

Buddy_Zhang1 发表于 2016-03-11 14:12

Feature Update
支持三级页表机制:
1. PGD 页表:
                     位于 swapper_pg_dir 处 16K 大小,存储 0 ~ 4G 的一级页表.
                     操作函数为:
                     pgd_t *pgd;
                     pgd_offset()
                     pgd_index()
2. PMD 页表:
                     ARM 硬件只支持两级页表,而 Linux 模拟支持该层页表,所以 PMD 页表就是 PGD 页表.
                     但 PMD 页表有其特定的作用.
                     其定义为 typedef struct {unsigned long pmd;} pmd_t;
                     由于 PMD 页表的作用是指向 PTE 页表的.内核使用一个 page 来存储 PTE 页表.
                     对于这个 PTE page 的分布是 0 ~ 2K 存储软件 PTE,2K ~ 4K 存储硬件 PTE.
                     内核将 2K ~ 4K 分作了两个入口,每个入口包含 256 个PTE 页表.所以
                     pmd = H/W PTE0.
                     pmd = H/W PTE1.
3. PTE 页表:
                  从 buddy system 中分配一个物理页用来做 PTE page,正如上面所说,
                  0 ~ 1K 用来存储软件 PTE0, 1K ~ 2K 用来存储软件 PTE1,总共 512 个 PTE 入口.
                  相关函数为:
                  pte_offset_map()
                  pte_offset_kernel()
                  pte_index()
                           
{:yxh45:}            

Buddy_Zhang1 发表于 2016-03-14 12:17

技术问题:
由于系统源码的不断增大,头文件数量不断增多,这样导致一个问题:
   "头文件相互嵌套问题"
有什么方法防止头文件相互嵌套问题????

Buddy_Zhang1 发表于 2016-03-15 16:36

Feature Update:
支持 ATAG 机制:
    通过 uboot 传递的 ATAG 参数,内核可以设置 struct meminfo 的大小
{:yxh45:}

nswcfd 发表于 2016-03-16 12:03

基本问题吧

/* xxx.h */
#ifndef XXX_HEADER_FILE
#define XXX_HEADER_FILE

/* your header file here */

#endif

Buddy_Zhang1 发表于 2016-03-16 13:45

回复 18# nswcfd


    恩恩,这也是一种解决办法,但我测试我的头文件集合的时候,有 80 多个头文件,还是无法避免头文件循环嵌套.
    但经过不断调试之后,我总结出解决头文件嵌套的问题,其中我的主要原则就是不随意引用头文件.
    毕竟头文件和预处理有关,我审视了相关的 C 文件之后解决了这个问题.{:qq23:}

Buddy_Zhang1 发表于 2016-03-17 20:27

Feature Update
实现 Vmalloc Allocator 分配器,实现接口如下:
    1. vmalloc
    2. vfree
    3. vread
    4. vwrite

增加 Mempool 的支持接口
实现 buddy,slab 和 vmalloc 的 Mempool 机制
页: 1 [2] 3 4
查看完整版本: [73%]正在写一个模拟 Linux 内存管理的系统