免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9045 | 回复: 18

[实践] 基于X86写的一个操作系统,有兴趣的一起开发[长期维护贴] [复制链接]

论坛徽章:
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
发表于 2017-05-21 15:53 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2017-05-21 21:11 编辑

For All Friends
  目前基于 Intel X86 写了一个操作系统,内核的基本框架还在开发中,希望有兴趣的一起加入开发。
  这只是我的个人兴趣而开发并开源的一个项目,目的通过动手写一个操作系统去了解更深层次的知识。

  这是一个基于 Intel X86 的 32 位操作系统, 这个操作系统名叫 BiscuitOS,该系统包含了一个操作系统的必要元素:
  1. 进程管理子系统
      就目前开发进度而言, 系统还只支持单进程,但有基本的调度管理机制,以及 TSS,系统门,中断门,陷阱门等机制。
      进程调度子系统还在开发中,目前使用的基本的长调度和短调度,以后会引入完全公平调度。 对进程子系统的朋友可以
      做这个子系统的开发者。
  2. 内存管理子系统
      就目前的开发进度而言,系统还不支持虚拟内存,内存大小被限制在 16M 之内,但后期要实现虚拟内存的支持。
      支持分段保护机制,支持分页保护机制。支持 GDT,LDT,以及全局页目录,支持高速缓存和cache。支持缺页处理。
      后期的目标是实现虚拟内存和主流的内存分配器: Buddy,slab,slub,高端内存分配器和 DMA。
  3. 文件管理子系统
      就目前的开发进度, 系统还不支持虚拟文件系统, rootfs 还未移植完成。该子系统还在开发中。
      后期的目标是实现虚拟文件系统,并至少支持一个 ext 的文件系统,并结合一个 rootfs 制作出完整的发行版系统。
  4. 设备驱动
      就目前开发进度,系统支持 tty 串口驱动, 一个 EGA 彩屏驱动, 以及硬盘驱动和软盘驱动,基本的驱动框架还未建立。
      后期的目标,基于虚拟文件系统构建多种驱动框架。

使用 BiscuitOS
  
      BiscuitOS 是基于 Intel X86 开发的操作系统,所以运行这个操作系统之前需要 Intel X86 的硬件平台。
      由于目前每个开发者有一个 X86 的硬件开发平台是不现实的, 为了解决这个问题以及降低开发门槛,
      各位开发者可以使用 QEMU 进行开发。 QEMU 是一个开源的处理器模拟软件,它支持 X86 CPU 的模拟。
      QEMU 运行 BiscuitOS 的效果图如下:
       BiscuitOS_system1.png
      
            
如何加入开发

     BiscuitOS 的源码我已经同步到 github 上,各位开发者可以在自己的 Linux 主机上(推荐使用 Ubuntu1604),按如下步骤:
     1. 获取源码
  1. git clone https://github.com/BuddyZhang1/BiscuitOS.git
复制代码
    2. 使用前的准备
         由于系统运行之前需要安装必要的开发工具,开发者可以按如下步骤进行安装:
  1. sudo apt-get install qemu
  2. sudo apt-get install figlet gcc make gdb git
  3. sudo apt-get install cflow graphviz gawk
复制代码
        如果你的 Linux 主机是 64 位系统, 那么你还需要安装 32 位的系统库, 开发者可以按如下步骤进行安装:
  1. sudo apt-get install lib32z1 lib32z1-dev
复制代码
    3. 编译并运行 BiscuitOS
         运行之前我们先编译这个系统,以保持系统是最新的,请按如下步骤:
  1. cd */BiscuitOS/
  2. make
  3. make start
复制代码
    4. 添加您的代码并进行调试
         各位开发者可以根据你的想法,对这个系统进行修改,但修改之后要遵循 GPL(大家可以去 google 里搜索 “GNU 通用公共授权条款”)。
         添加好你的源码之后就是调试代码,开发者可以使用如下步骤进行调试:
         1) 在你的源码目录下打开两个终端,第一个终端输入如下命令:
  1. cd */BiscuitOS/
  2. make clean
  3. make
  4. make debug
复制代码
            另外一个终端输入如下命令:
  1. cd */BiscuitOS/tools/build/
  2. gdb system
  3. (>gdb) target remote :1234
  4. (>gdb) b function_name
  5. (>gdb) c
  6. (>gdb) n
复制代码
            内核的调试基于 GDB,具体的调试命令可以查看下面关于调试的章节。 function_name 为你要调试函数的名字。 实际调试如下图:
             debug01.png
             GDB Host
             debug02.png
             GDB Target
             debug3.png
             Qemu

     6. 提交您的代码
         提交代码的方式有两种,第一种,如果您熟悉 github 提交补丁,你可以通过 github 提交给我,这里我不做更多关于 github 提交补丁的方法,自行 google。
         第二种是使用邮件进行提交,你可以将你的补丁,通过邮件发给我,这是我的邮箱 buddy.zhang@aliyun.com.提交之后,我要进行验证,在确认无误之后,我会将您的补丁合入到主线里。

系统特色


    正如开头介绍的,这个系统只是我的兴趣爱好,我不会把它变成一个很复杂的系统, 系统的开发借鉴于 Linux,UNIX,FreeBSD。
    为了让更多的想学内核而不能实践的开发者准备了几个比较有用的功能:
    1. 全部代码都在自己的掌控之中
       在这个操作系统中,你可以调试所有的代码,包括系统一上电, CPU 跳转到 0x7c00 之后的第一条指令。
       具体如何调试,我会继续回帖分享给大家。
   
    2. 系统所有的汇编代码统一使用 ATT 汇编进行编写。
    3. 系统支持 GDT,LDT,分段,分页,IDT,全局目录等,各种主流功能正在开发中。
    4. 支持自动画函数调用图功能
        这个功能很有意思,开发者只需使用命令,输入要画函数的名字,系统就会自动将该函数的调用图画出来。 开发者可以按如下步骤进行操作   
  1. cd */BiscuitOS/
  2. make
  3. make draw FUN=xxx
复制代码
      xxx 为函数的名字,如我使用这个工具画 “die” 这个函数的调用图,如下:
       debug7.png
        

交流

     BiscuitOS 的开发中,如果遇到任何不懂的问题或疑惑,可以发邮件或在 ChinaCU 的论坛发帖,我很高兴帮你解答您的疑问和问题
     这是我经常使用的邮箱
  1. buddy.zhang@aliyun.com
复制代码
  
     欢迎各位喜欢操作系统的朋友,一起交流学习,共同促进操作系统在中国的发展。
     
     Good Luck!






BiscuitARM_SmallLogo.png

论坛徽章:
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
发表于 2017-05-21 15:54 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2017-06-04 23:40 编辑

系统更新日志

  [2017-06-04] 添加 kmalloc() 和 kfree(),以及相应的测试程序
  [2017-06-04] 添加 interrupt6 - interrupt45 测试程序
  [2017-06-03] 添加 interrupt0 - interrupt5 测试程序
  [2017-05-30] 添加 string library
  [2017-05-30] 添加 .config & CONFIG_ 机制
  [2017-05-30] 添加测试代码机制
  [2017-05-25] 添加 fork() 系统调用和基本的内存分配器,支持 get_free_page() 和 free_page() 例程。
  [2017-05-22] 添加 Coding Style 检测机制


论坛徽章:
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
发表于 2017-05-21 15:54 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2017-05-21 20:54 编辑

调试 BiscuitOS 内核

   BiscuitOS 支持 GDB 调试,开发可以使用 GDB 调试 BiscuitOS 的所有代码。
   BiscuitOS 的调试分为两部分,根据 Intel X86 的使用手册,系统上电之后,会将磁盘的第一个扇区加载到内存的 0x7C00 的位置进行运行。
   此时, 系统处于实时模式,实时模式下,寻址的长度 16 位。 实时模式下,系统为内核的加载做准备,但准备好条件之后,
   系统将进入保护模式,保护模式运行在 32 bit 上,因此,两部分由于指令长度不同, GDB 调试的情况不同。
   因此,本节将介绍两种模式下,如何使用 GDB 调试内核。

   调试内核源码之前,请先准备好如下工具:
   gdbobjdump
   请确保源码树中顶层的 Makefile 中, DEBUG 选项已经打开
  1. vi */BiscuitOS/Makefile
  2. ---    DEBUG :=
  3. +++ DEBUG := 1
复制代码
1. 实时模式下内核调试
       系统在上电之后,会将启动磁盘的第一个扇区加载到内存 0x7c00 处开始运行, 所以开发者可以使用 gdb,在地址 0x7c00 处设置一个断点,
       然后从这个断点处开始调试。 具体步骤如下:
       1) 在 PC 机上准备两个终端,第一个终端作为 DEBUG HOST 使用,如下     
  1. cd */BiscuitOS/
  2. make
  3. make debug
复制代码
          运行上面的命令之后,该终端会进入等待状态,等待 DEBUG TARGET 的相应,如下图
            debug01.png
       2) 在另一个终端作为 DEBUG TARGET 使用,如下:   
  1. cd */BiscuitOS/tools/build
  2. gdb .debug_bootsect
复制代码
          执行上面的命令之后,终端会进入 GDB 的 debug 模式, 在 debug 模式下,使用如下命令:
  1. (gdb) target remote :1234
  2. (gdb) b *0x7C00
  3. (gdb) c
  4. (gdb) d
  5. Delete all breakpoints? (y or n) y
  6. (gdb) ni
复制代码
          执行完上面的命令之后,终端就进入 debug 模式,你可以使用 gdb 命令对代码进行调试,如下图, 使用 “info reg” 打印寄存器的信息
            debugA0.png
           在实时模式进行单步调试应该使用 ni 命令,跳转到函数内部,应该使用 si
      3) 实时模式下如何调试中断
          在实时模式下,如果使用单步进行调试,如果遇到 int 中断,估计单步一直下去,永远跳不出这个坑,那么如何调试中断呢?我这里举个例子
          例如在 */BiscuitOS/boot/bootsect.s 中有一段关于中断的代码片段:
         
  1.     mov $0x0000, %dx      # head 0
  2.     mov $DEVICE_NR, %dl   # dirve 0
  3.     mov $0x0002, %cx   # sector 2, track 0
  4.     mov $0x0200, %bx   # address = 512, in INITSEG
  5.     .equ     AX, 0x200+SETUPLEN
  6.     mov     $AX, %ax   # service 2, nr of sectors
  7.     int $0x13          # read it
  8.     mov %ax, %ax
复制代码
         在上面的代码中,内核会通过调用 0x13 中断去读扇区的数据,判断一个中断是否成功,我们必须通过 EFLAGS 寄存器进行判断,
          但是如果使用单步进行调试的话,单步执行到 “int $0x13” 之后,一直无法跳出中断,为此我们可以使用如下的方法进行调试。
          > 首先在 “int $0x13” 之后添加一条汇编指令 “mov %ax, %ax”, 这条汇编指令没有任何实际意义,只是用于调试。
             添加完之后,重新编译系统            
  1. cd */BiscuitOS
  2. make clean
  3. make
  4. make debug
复制代码
        > 此时使用第三个终端,在终端中执行如下命令:            
  1. cd */BiscuitOS/tools/build
  2. objdump -x -s -S -dh .debug_bootsect
复制代码
           此时会将 .debug_bootsect 反汇编出来, .debug_bootsect 是 */BiscuitOS/boot/bootsect.s 的链接文件,
            然后我们在导出的信息中找到上面代码对应的反汇编代码,如下:
            
  1.   28:                 ba 00 00 b2 00               mov    $0xb20000,%edx
  2.                       mov $DEVICE_NR, %dl   # dirve 0
  3.                       mov $0x0002, %cx   # sector 2, track 0
  4.   2d:                 b9 02 00 bb 00               mov    $0xbb0002,%ecx
  5.                       mov $0x0200, %bx   # address = 512, in INITSEG
  6.   32:                 02 b8 04 02 cd 13            add    0x13cd0204(%eax),%bh
  7.                       .equ     AX, 0x200+SETUPLEN
  8.                       mov     $AX, %ax   # service 2, nr of sectors
  9.                       int $0x13          # read it
  10.                       mov %ax, %ax
  11.   38:                 89 c0                        mov    %eax,%eax
  12.                jnc ok_load_setup  # ok -continue
复制代码
           通过上面的信息,可知,我们之前添加的 “mov %ax, %ax” 对应的链接地址是 0x38
            由于下面的步骤需要对链接器和加载器有一定的认识,才知道为什么这么做,这里我不做过多的解释,大家参照我的方法做
            接着,通过系统原来我们知道,系统启动的过程中,将启动磁盘的第一个扇区加载到内存 0x7c00 处,
            根据 Linux 系统的实现逻辑,代码会将代码段加载到内存地址 0x90000 处,此时 CS 寄存器的值也是 0x9000
            因此,我们在打断点时候,段地的地址应该是: 0x90000 + 0x38 = 0x90038.
            此时在第二个终端中输入如下命令:   
  1. cd */BiscuitOS/tools/build/
  2. gdb .debug_bootsect
  3. (gdb) target remote :1234
  4. (gdb) b *0x90038
  5. (gdb) c
  6. (gdb) d
  7. Delete all breakpoints? (y or n) y
  8. (gdb) info reg
复制代码
            此时会将系统寄存器的值都答应出来,我们重点查看 eflags 的值,通过它的值来确定中断的执行是成功或失败。

  2. 保护模式下的调试
      系统在实时模式下初始化完毕之后,就要开始加载内核,保护模式下, gdb 的调试和实时模式下有不同之处,至于原因
      可以归咎与 GDT 段描述符表的机制,此时段寄存器不像实时模式下简单的做地址偏移,保护模式下,段寄存器做为段选择子,
      以此在 GDTLDT 选择描述符来进行代码跳转,因此,调试方法可以按如下步骤,(该调试时候除 boot/bootsect.s 和 boot/setup.s 之外的所有代码)
      1) 一个终端中作为 DEBUG HOST,输入如下命令
  1. cd */BiscuitOS
  2. make
  3. make debug
复制代码
    2) 另外一个终端作为 DEBUG TARGET, 输入如下命令   
  1. cd */BiscuitOS/tools/build
  2. gdb system
  3. (gdb) target remote :1234
  4. (gdb) b main
  5. (gdb) c
  6. (gdb) n
  7. (gdb) s
复制代码
        在保护模式下,可以使用 n 进行单步调试,进入函数内部可以使用 s
         更多 gdb 调试方法可以参考 gdbUser Manual
     3) 调试保护模式下的汇编代码
         我们可以采用和实时模式下的套路,使用 objdump 工具进行反汇编分析, 如下面的例子
         内核加载后执行的第一条命令是从物理地址 0 开始的,汇编代码如下:      
  1. pg_dir:
  2.     .globl startup_32

  3. startup_32:
  4.     movl $0x10, %eax  # 0x10, Global data segment.
  5.     mov %ax, %ds
  6.     mov %ax, %es
  7.     mov %ax, %fs
  8.     mov %ax, %gs
复制代码

         我们使用 objdump 工具,如下:  
  1. cd */BiscuitOS/tools/build
  2. objdump -x -s -S -dh system
复制代码
        从中我们可以获得:
  1. 00000000 <pg_dir>:

  2. pg_dir:
  3.               .globl startup_32

  4. startup_32:
  5.               movl $0x10, %eax  # 0x10, Global data segment.
  6.        0:         b8 10 00 00 00          mov    $0x10,%eax
  7.               mov %ax, %ds
  8.        5:          8e d8                   mov    %eax,%ds
  9.               mov %ax, %es
  10.        7:         8e c0                   mov    %eax,%es
  11.               mov %ax, %fs
  12.        9:         8e e0                   mov    %eax,%fs
复制代码
        由于保护模式下第一行代码是从物理地址开始,所以 startup_32 的断点地址为: 0x0 + 0,
         在 DEBUG TARGET 终端中输入如下命令:   
  1. cd */BiscuitOS/tools/build
  2. gdb system
  3. (gdb) target remote :1234
  4. (gdb) b *0x0
  5. (gdb) c
  6. (gdb) info reg
复制代码
        执行上面的代码,我们就可以单步调试保护模式的汇编代码。      

论坛徽章:
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
发表于 2017-05-21 15:54 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2017-05-22 23:00 编辑

编码风格

    一个高效的项目应该是一个既灵活又遵循一定规则。 BiscuitOS 的开发目前已经支持编码风格控制机制。
    开发者在提交补丁之前,使用编码风格控制机制,可以轻松将自己的代码转换成符合 BiscuitOS 编码风格的代码。
    本节重点介绍如何在 BiscuitOS 中使用编码风格控制机制。

    在 BiscuitOS 0.0.2 版本之后加入 Linux 内核的编码风格控制机制,开发者同样也可以在 Linux 内核中使用。
    具体使用步骤如下:
    1. 安装必要的工具
  1. sudo apt-get install indent
复制代码
   2. 编写开发者自己的代码
    3. 提交补丁前的准备
        1) 删除掉文件中多余的空格和 TAB,开发者可以使用如下命令
  1. ./*/BiscuitOS/scripts/checkTB.sh file_name.c
复制代码
           checkTB.sh 脚本主要用来完成该任务, file_name.c 是要修改的文件,这个脚本使用于任何文件。
        2) 调整源码的风格为系统默认推荐的风格,开发者可以使用下面命令           
  1. ./*/BiscuitOS/scripts/Lindent file_name.c
复制代码
           Lindent 脚本会对 C 或头文件进行自动缩进处理。 file_name 是要修改文件的名字
        3) 经过上面两部,消除基本的编码问题,最后使用 Linux 提供的编码风格检测脚本            
  1. ./*/BiscuitOS/scripts/checkpatch.pl --no-tree -f file_name
复制代码
           该脚本会将源码中不符合规定的语句提示出来,并给出相应的修改建议,开发者在根据提示的建议修改完之后,
            再执行第一步和第二部,源码的代码风格就得到认证,开发者就可以提交您的补丁。
    4. 提交补丁         

论坛徽章:
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
发表于 2017-05-21 15:54 |显示全部楼层
Reserved Page

论坛徽章:
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
发表于 2017-05-21 15:54 |显示全部楼层
Reserved Page

论坛徽章:
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
发表于 2017-05-21 15:54 |显示全部楼层
Reserved Page

论坛徽章:
7
IT运维版块每日发帖之星
日期:2016-05-27 06:20:00IT运维版块每日发帖之星
日期:2016-06-09 06:20:00操作系统版块每日发帖之星
日期:2016-06-12 06:20:00程序设计版块每日发帖之星
日期:2016-06-12 06:20:00操作系统版块每日发帖之星
日期:2016-06-13 06:20:00IT运维版块每日发帖之星
日期:2016-06-17 06:20:002015-2016NBA季后赛纪念章
日期:2016-06-28 17:42:27
发表于 2017-05-22 10:35 |显示全部楼层
如何通过qemu运行呢

论坛徽章:
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
发表于 2017-05-22 12:29 |显示全部楼层
回复 8# qianguozheng
  
    hi friends
        如何使用 qemu ,我已经在这个贴的开头详细介绍了,您可以参考一下 :-)



论坛徽章:
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
发表于 2017-05-26 08:56 |显示全部楼层
添加 fork() 系统调用和基本的内存分配器,支持 get_free_page() 和 free_page() 例程
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP