免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7567 | 回复: 17
打印 上一主题 下一主题

[内存管理] BiscuitOS 系统发布【增加内核实践】 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-25 20:34 |显示全部楼层 |倒序浏览
本帖最后由 Buddy_Zhang1 于 2016-03-30 21:20 编辑

BiscuitOS 是一个类 Linux 系统,其实现原理是在 Linux 用户空间分配一定的内存作为 Biscuit 的物理内存.基于 BiscuitOS 的物理内存构建一个操作系统,其实现原理继承 Linux 实现过程.

BiscuitOS 创作的主要目的:
          Linux 内核的学习是一个充满挑战又艰难的过程.对初学 Linux 内核来说,无数的理论以及无法将理论转化为实践的尴尬充斥着整个学习初期.
          这成为很多人无法翻越的大山.俗话说 "实践是检验真理的唯一标准".突然有一天有个想法,如何增加内核实践量,又不用搭建繁杂的开发环境,于是 BiscuitOS 就诞生了.
          BiscuitOS 是为想增加 Linux 内核实践,了解 Linux 内核实现原理的同学设计的操作系统,BiscuitOS 的实现过程完全使用 Linux 实现方法.

BiscuitOS 实现原理:
         BiscuitOS 是通过在用户空间申请两个 256M 的数组,然后将这两个数组当做虚拟物理内存.基于虚拟物理内存构建 BiscuitOS 的物理内存和虚拟内存.BiscuitOS 目前只具备内存管理功能,
         您可以在这个系统上了解 Linux 内存管理系统从内核启动到初始化,最后到一个完整的内存管理系统的整个过程,让你从源码 + 实践级别了解 Linux 内核.


BiscuitOS Feature:
  优点:
         1. BiscuitOS 的实现完全遵循 Linux 内核,在 BiscuitOS 实现的代码可以移植到 Linux.
         2. BiscuitOS 实现在 Linux 用户空间,快速编译内核,轻松测试您的代码.
         3. BiscuitOS 属于 Linux 用户空间程序,可以使用 gdb 等调试工具进行调试.
         4. BiscuitOS 经过一年的开发周期,丰富的测试用例供使用者使用.
         5. 用户可以随意修改代码,并且增加并贡献代码.
         6. BiscuitOS 增加了很多内核接口的使用例子,比如红黑树,buddy system 等使用案例,不仅可以增加您的内核开发经验,也可以降低内核学习的门槛.
         7. BiscuitOS 开发了很多 debug 工具,您可以直接看 BiscuitOS 的物理内存数据.
  缺点:
        1.  BiscuitOS 只是一个模拟器!其硬件模拟基于 ARMv7.
        2.  BiscuitOS 是一个正在开发的系统,第一个版本系统为 MemoryCookOS ,该系统只包含 Linux 内存管理部分.后续会将四大基本模块加载进来.
        3. 由于 BiscuitOS 是一个 32bit 的系统,但 Linux 用户空间是 64bit 系统.所以在源码中存在 64bit 转 32bit 的处理.
        4. 由于 BiscuitOS 是基于 "虚拟物理内存".所以代码中存在内存转换的代码.

BiscuitOS 下载地址:
          BiscuitOS_Debug 为一直开发的系统,目标将 Linux 四大模块 Merge 到这个系统中,有兴趣的同学可以加入一起开发:
                                        git@github.com:BiscuitOS/BiscuitOS_Debug.git
          BiscuitOS_Stable: 为经过调试基本可运行的稳定版 BiscuitOS.
                                        git@github.com:BiscuitOS/BiscuitOS_Stable.git
          MemoryCookOS: 为纯内存管理的 BiscuitOS.
                                        git@github.com:BiscuitOS/MemoryCookOS.git

BiscuitOS 使用方法:
          1. 通过 github 下载源码解压
          2. cd /BiscuitOS
          3. make
          BiscuitOS 的编程入口位于 /BiscuitOS/init/main.c 里面的 kernel_space()
          BiscuitOS 丰富的测试用例位于 /BiscuitOS/tools/TestCase_xxx.c

如何解决您的问题:
          1. 遇到编译报错的问题,请将 /BiscuitOS/obj/compiler.log 内容贴出来.
          2. 遇到运行时段错误问题,请将 /BiscuitOS/obj/a 文件邮件给我.
              FAQ 邮箱: buddy.zhang@aliyun.com


论坛徽章:
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
2 [报告]
发表于 2016-03-25 21:00 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2016-03-30 20:39 编辑

BiscuitOS 开发介绍:
           BiscuitOS 博客:
                          blog.chinaunix.net/uid/30647659.html
           FAQ 邮箱:
                          buddy.zhang@aliyun.com
           BiscuitOS 论坛讨论:
                          ChinaUnix论坛 > 程序设计 > 内核源码
           BiscuitOS gitbub:
                          github.com/BiscuitOS


BiscuitOS  运行截图。





论坛徽章:
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
3 [报告]
发表于 2016-03-26 10:13 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2016-03-26 15:51 编辑

BiscuitOS 开发进度:

- 2016.3.26
    -  vfs_caches_init() Merge

论坛徽章:
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
4 [报告]
发表于 2016-03-27 10:19 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2016-04-02 12:00 编辑

BiscuitOS 应用实例

1. BiscuitOS 上轻松使用红黑树
2. BiscuitOS 上轻松使用哈希散列式
3. BiscuitOS 上构建 GFP_ZONE_TABLE
4. BiscuitOS - SLUB 分配器 slab page 大小计算方法
5. BiscuitOS / 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
5 [报告]
发表于 2016-03-27 19:05 |显示全部楼层
回复 6# Godbach


    谢谢版主!

论坛徽章:
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
6 [报告]
发表于 2016-03-27 21:50 |显示全部楼层
回复 8# Godbach


    我实践过,在上面可以加入很多子系统,实践起来真的很爽,可以把自己很多想法都在上面验证。

    现在正在把 VFS 加入到里面。

论坛徽章:
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
7 [报告]
发表于 2016-03-28 20:56 |显示全部楼层
BiscuitOS 上轻松使用红黑树

红黑树作为 Linux 内核重要的数据结构,负责 Linux 的基本运作,其重要程度和难易程度让人望而却步。
本节通过一个简单例子介绍红黑树在 BiscuitOS 以及 Linux 内核中的使用方法。

红黑树在 Linux 内核很多地方都有使用,比如进程调度的“完全公平调度”,虚拟空间对进程地址管理以及本章重点例子 vmalloc 内存区的管理。
红黑树由于其复杂的构成,这里不过多讲理论,本章侧重讲述如何使用红黑树。

1. 红黑树 API
rb_link_node 将红黑树节点插入到红黑树。
rb_insert_color 红黑树翻转颜色
rb_erase 从红黑树中移除一个节点
rb_first 获得红黑树的第一个节点
rb_next 获得红黑树节点的下一个节点

2. 红黑树在内核中的使用案例
VMALLOC 分配的虚拟地址通过红黑树进行管理,我们可以通过红黑树的 root 和虚拟地址大小来查找 VMALLOC 区的内容。
代码如下:(源码位置 /BiscuitOS/tools/TestCase_vmalloc.c)
  1. void TestCase_vmalloc(void)
  2. {
  3.         unsigned int addr;
  4.         struct rb_node *node;

  5.         addr = vmalloc(PAGE_SIZE);

  6.         addr = vmalloc(PAGE_SIZE);

  7.         addr = vmalloc(PAGE_SIZE);
  8.        
  9.         addr = vmalloc(PAGE_SIZE);
  10.        

  11.         /* Trave all node */
  12.         for(node = rb_first(&vmap_area_root) ; node ; node = rb_next(node)) {
  13.                 struct vmap_area *va;
  14.                 struct vm_struct *area;

  15.                 va = rb_entry(node,struct vmap_area,rb_node);
  16.                 area = va->private;
  17.                 printk(KERN_INFO "VA %p\n",(void *)(unsigned long)va->va_start);
  18.           }
  19.        
  20.         vfree(addr);
  21. }
复制代码
3. 红黑树的使用案例。
(源码位置 /BiscuitOS/tools/TestCase_RB_tree.c)
  1. #include "linux/kernel.h"
  2. #include "linux/rbtree.h"
  3. #include "linux/debug.h"
  4. #include "linux/mm.h"
  5. #include "linux/gfp.h"
  6. #include "linux/slab.h"

  7. struct node {
  8.         struct rb_node node;
  9.         int num;
  10. };


  11. /*
  12. * Insert a node into RBtree.
  13. */
  14. int insert(struct node *data,struct rb_root *root)
  15. {
  16.         struct rb_node **link = &(root->rb_node);
  17.         struct rb_node *parent = NULL;

  18.         while(*link) {
  19.                 struct node *node = container_of(*link,struct node,node);

  20.                 parent = *link;
  21.                 if(data->num < node->num)
  22.                         link = &((*link)->rb_left);
  23.                 else if(data->num > node->num)
  24.                         link = &((*link)->rb_right);
  25.                 else
  26.                         return -1;
  27.         }
  28.         rb_link_node(&data->node,parent,link);
  29.         rb_insert_color(&data->node,root);
  30.         return 0;
  31. }

  32. /*
  33. * Search a node from RBtree.
  34. */
  35. struct node *search(int num,struct rb_root *root)
  36. {
  37.         struct rb_node *node = root->rb_node;

  38.         while(node) {
  39.                 struct node *data = container_of(node,struct node,node);

  40.                 if(num < data->num)
  41.                         node = node->rb_left;
  42.                 else if(num > data->num)
  43.                         node = node->rb_right;
  44.                 else
  45.                         return data;
  46.         }
  47.         return NULL;
  48. }

  49. /*
  50. * Delete a node from RBtree.
  51. */
  52. void delete(int num,struct rb_root *root)
  53. {
  54.         struct node *node = search(num,root);

  55.         if(node) {
  56.                 rb_erase(&node->node,root);
  57.                 kfree(node);
  58.         } else
  59.                 mm_err("%2d doesn't exits\n",num);
  60. }

  61. /*
  62. * Print all node
  63. */
  64. void print_all(struct rb_root *root)
  65. {
  66.         struct rb_node *node;

  67.         for(node = rb_first(root) ; node ; node = rb_next(node))
  68.                 mm_debug("%2d  ",rb_entry(node,struct node,node)->num);

  69.         mm_debug("\n");
  70. }

  71. /*
  72. * TestCase_RB_user
  73. */
  74. void TestCase_RB_user(void)
  75. {
  76.         struct rb_root root = RB_ROOT;
  77.         struct node *node;
  78.         int num,i,ret;
  79.         int value[30] = { 2  , 84 , 43 , 11 , 7  , 54 , 21 , 1  , 2  , 10 ,
  80.                           34 , 5  , 6  , 45 , 76 , 0  , 12 , 25 , 44 , 11 ,
  81.                           99 , 65 , 38 , 91 , 35 , 16 ,93  , 74 , 33 , 67 };

  82.         num = 30;

  83.         for(i = 0 ; i < num ; i++) {
  84.                 node = (struct node *)kmalloc(sizeof(struct node),GFP_KERNEL);
  85.                 if(!node) {
  86.                         mm_err("No Memory\n");

  87.                         /* Never Waste memory */
  88.                         for(i-- ; i >= 0 ; i--)
  89.                                 delete(value[i],&root);

  90.                         return;
  91.                 }

  92.                 node->num = value[i];

  93.                 /* Insert node into RBtree */
  94.                 ret = insert(node,&root);
  95.                 if(ret < 0) {
  96.                         mm_err("%2d has existed\n",node->num);
  97.                         kfree(node);
  98.                 }
  99.         }

  100.         mm_debug("First Check\n");
  101.         print_all(&root);

  102.         /* Delete a node */
  103.         delete(value[4],&root);
  104.         mm_debug("Second Check [%d]\n",value[4]);
  105.         print_all(&root);

  106.         /* Search a node */
  107.         node = search(value[2],&root);
  108.         mm_debug("Find %d\n",node->num);

  109.     /* Get prev node */
  110.         mm_debug("Prev num is %d\n",
  111.                         rb_entry(rb_prev(&node->node),struct node,node)->num);
  112.         /* Get next node */
  113.         mm_debug("Next num is %d\n",
  114.                         rb_entry(rb_next(&node->node),struct node,node)->num);
  115.         /* The first node */
  116.         mm_debug("Min num is %d\n",
  117.                         rb_entry(rb_first(&root),struct node,node)->num);
  118.         /* The last node */
  119.         mm_debug("Max num is %d\n",
  120.                         rb_entry(rb_last(&root),struct node,node)->num);

  121.         /* Free All node */
  122.         for(i = 0 ; i < num ; i++)
  123.                 delete(value[i],&root);

  124.         mm_debug("Last Check\n");
  125.         print_all(&root);
  126. }
复制代码

论坛徽章:
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
8 [报告]
发表于 2016-03-29 19:26 |显示全部楼层
回复 13# chinaandcompute


        HI:
         您好,我需要和您确认,您 gitbub 的版本是否为 MemoryCookOS?
        
         能否描述为什么注释掉 /linux/types.h 里面的 size_t.

         1. 能否将不却掉 size_t 的编译文件给我一下,编译文件位于 /obj/compiler.log
  
         2. 请将去掉 size_t 之后编译生成的 /obj/a 文件邮件发给我分析一下.谢谢
   
              邮箱-> buddy.zhang@aliyun.com
         

论坛徽章:
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
9 [报告]
发表于 2016-03-29 20:01 |显示全部楼层
BiscuitOS 上轻松使用哈希散列式

哈希散列式作为 Linux 内核重要的数据结构,负责 Linux 的基本运作,由于其高效的数据管理能力和实用性,
内核也将哈希散列式作为其基本数据结构.本楼重点介绍如何在 BiscuitOS 和 Linux 使用哈希散列式.

哈希散列式的实现方法多种多样,这里以拉链法做为介绍,至于理论部分可以自行查找.
哈希散列式在内核中比较典型的运用如 inode 和 dentry 的管理,pid 管理以及本楼例子 kmap() 分配的内存管理.

内核中 KMAP 的区域就是使用哈希散列式进行管理.
从 ZONE_HIGHMEM 中的 Buddy System 中获得一个空闲 page 之后,使用 hash_ptr(page,PA_HASH_ORDER) 获得哈希散列式的 key.
内核维护了一个哈希散列表头 page_address_htable[1 << PA_HASH_ORDER]
内核通过 page_slot(page) 可以获得 hash 表头,在通过内部的 list_head 进行遍历.

哈希散列式使用例子:
源码位于 /BiscuitOS/tools/TestCase_Hash.c
  1. #include "linux/kernel.h"
  2. #include "linux/debug.h"
  3. #include "linux/types.h"
  4. #include "linux/slab.h"

  5. #define HEAD_NUM    3
  6. #define VALUE_NUM   100

  7. struct node {
  8.         struct hlist_node node;
  9.         int num;
  10. };

  11. struct hlist_head *phash = NULL;
  12. /*
  13. * TestCase_Hash
  14. */
  15. void TestCase_Hash(void)
  16. {
  17.         int i,k;
  18.         struct hlist_node *hnode;
  19.         struct hlist_head *head;
  20.         struct node *node;
  21.         int *value;

  22.         /* Prepare test data */
  23.         value = (int *)kmalloc(sizeof(int) * VALUE_NUM,GFP_KERNEL);
  24.         for(i = 0 ; i < VALUE_NUM ; i++)
  25.                 value[i] = i;

  26.         /* Prepare hash head array */
  27.         phash = (struct hlist_head *)kmalloc(sizeof(struct hlist_head) *
  28.                                         (1 << HEAD_NUM) , GFP_KERNEL);
  29.         /* Initialize hash head */
  30.         for(i = 0 ; i < (1 << HEAD_NUM) ; i++)
  31.                 INIT_HLIST_HEAD(&phash[i]);

  32.         /* Create Test node */
  33.         for(i = 0 ; i < VALUE_NUM ; i++) {
  34.                 node = (struct node *)kmalloc(sizeof(struct node),GFP_KERNEL);
  35.                 if(!node) {
  36.                         mm_err("No memory\n");

  37.                         /* Never water memory */
  38.                         goto bad_memory;
  39.                 }

  40.                 /* Prepare test data */
  41.                 node->num = value[i];
  42.                 /* Initialize the hash node */
  43.                 INIT_HLIST_NODE(&node->node);
  44.                 /* Get the hash head for node */
  45.                 head = &phash[hash_32(node->num,HEAD_NUM)];
  46.                 /* Add node into hash list */
  47.                 hlist_add_head(&node->node,head);
  48.         }

  49.         /* Trave all hash list */
  50.         for(i = 0 ; i < (1 << HEAD_NUM) ; i++) {
  51.                 mm_debug("HEAD %d:",i);
  52.                 if(!hlist_empty(&phash[i]))
  53.                         hlist_for_each_entry(node,hnode,&phash[i],node)
  54.                                 mm_debug("%d->",node->num);
  55.                 mm_debug("NULL\n");
  56.         }

  57.         /* Search data in hash list */
  58.         k = value[34];
  59.         head = &phash[hash_32(k,HEAD_NUM)];
  60.         mm_debug("Search %d in head %d\n",k,hash_32(k,HEAD_NUM));
  61.         if(!hlist_empty(head))
  62.                 hlist_for_each_entry(node,hnode,head,node)
  63.                         if(k == node->num)
  64.                                 mm_debug("Find the data %d\n",k);

  65.         /* Delete all node */
  66.         for(i = 0 ; i < (1 << HEAD_NUM) ; i++)
  67.                 while(!hlist_empty(&phash[i])) {
  68.                         node = hlist_entry(phash[i].first,struct node,node);
  69.                         hlist_del(&node->node);
  70.                         kfree(node);
  71.                 }

  72.         /* Final check */
  73.         for(i = 0 ; i < (1 << HEAD_NUM) ; i++) {
  74.                 if(!hlist_empty(&phash[i])) {
  75.                         mm_debug("HEAD %d REMAIN:",i);
  76.                         hlist_for_each_entry(node,hnode,&phash[i],node)
  77.                                 mm_debug("%d->",node->num);
  78.                         mm_debug("NULL\n");
  79.                 }
  80.         }
  81.         /* Free all and complete test */
  82.         kfree(phash);
  83.         kfree(value);

  84.         return;
  85. bad_memory:
  86.         for(i = 0 ; i < (1 << HEAD_NUM) ; i++)
  87.                 while(!hlist_empty(&phash[i])) {
  88.                         node = hlist_entry(phash[i].first,struct node,node);
  89.                         hlist_del(phash[i].first);
  90.                         kfree(node);
  91.                 }
  92.         kfree(phash);
  93.         kfree(value);
  94. }
复制代码

论坛徽章:
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
10 [报告]
发表于 2016-03-30 09:25 |显示全部楼层
回复 16# chinaandcompute


      HI:
           我在 32bit 的 Ubuntu 上做了测试,遇到您说的问题,将 size_t 注释之后,系统可以正常运行.
           使用您编译生成的 a 进行调试之后,发现 memmap_init_zone() -> set_page_zone() 有问题,请合入邮件中的补丁,进行调试.



diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 9759569..218bc0f 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -366,7 +366,10 @@ void __meminit memmap_init_zone(unsigned long size,int nid,unsigned long zone,
                continue;
        }
        page = pfn_to_page(pfn);
+       mm_debug("page %p\n",page);
+       mm_debug("pfn %p\n",pfn);
        set_page_links(page,zone,nid,pfn);
+       mm_debug("nid %p zone-> %d\n",nid,zone);
        mminit_verify_page_links(page,zone,nid,pfn);
        init_page_count(page);
        reset_page_mapcount(page);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP