免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Buddy_Zhang1
打印 上一主题 下一主题

[内存管理] [73%]正在写一个模拟 Linux 内存管理的系统 [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
11 [报告]
发表于 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

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
12 [报告]
发表于 2016-03-09 21:56 |只看该作者
搞个赞,加油。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
13 [报告]
发表于 2016-03-10 11:14 |只看该作者
回复 1# Buddy_Zhang1

LZ 一直在更新。赞!


   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
14 [报告]
发表于 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;
}
         

   
   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
15 [报告]
发表于 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[2];} pmd_t;
                     由于 PMD 页表的作用是指向 PTE 页表的.内核使用一个 page 来存储 PTE 页表.
                     对于这个 PTE page 的分布是 0 ~ 2K 存储软件 PTE,2K ~ 4K 存储硬件 PTE.
                     内核将 2K ~ 4K 分作了两个入口,每个入口包含 256 个PTE 页表.所以
                     pmd[0] = H/W PTE0.
                     pmd[1] = 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()
                           
            

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
16 [报告]
发表于 2016-03-14 12:17 |只看该作者
技术问题:
由于系统源码的不断增大,头文件数量不断增多,这样导致一个问题:
   "头文件相互嵌套问题"
有什么方法防止头文件相互嵌套问题????

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
17 [报告]
发表于 2016-03-15 16:36 |只看该作者
Feature Update:
支持 ATAG 机制:
    通过 uboot 传递的 ATAG 参数,内核可以设置 struct meminfo 的大小

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
18 [报告]
发表于 2016-03-16 12:03 |只看该作者
基本问题吧

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

/* your header file here */

#endif

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
19 [报告]
发表于 2016-03-16 13:45 |只看该作者
回复 18# nswcfd


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

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
20 [报告]
发表于 2016-03-17 20:27 |只看该作者
Feature Update
实现 Vmalloc Allocator 分配器,实现接口如下:
    1. vmalloc
    2. vfree
    3. vread
    4. vwrite

增加 Mempool 的支持接口
实现 buddy,slab 和 vmalloc 的 Mempool 机制
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP