蜗窝科技

papaya内核更新了

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 karma303 · 2016-09-24 · 3 帖

本文是原「蜗窝讨论区」的历史存档(2016-09-24),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。

karma303 · 2016-09-24 02:01

这次的版本号是0.609。

主要增加了mm_struct, vm_area这两个数据结构。这是一个大的进步。 新添的几个功能是:mmap(, brk(, fork(, execve(。 fork(和execve(我感觉我一直在写,原先内核那么简陋的时候,就有一个裸奔的fork(和execve 。。。

内核线程只能fork(出来内核线程。内核线程可以(也只可以)execve(出来用户进程。 用户进程fork(和execve(出来的当然都是用户进程。 上面4步都走完,fork(和execve(的功能基本就具备了。我编写的顺序也是这样。现在完成了第三步。

这是papaya内核的第一个用户程序:


[== Undefined ==]
#include "syscall.h"

static char g_array[10] = {1, 2, 3, 4, 5, 6}; int static_array[1024]; void doado(void){ int x; for(int i = 0; i < 10; i++) printf("%u\n", g_array[i]); //测试.data的内存区 int ret = fork(; printf("I am back ! %u\n", ret); while(2){ static_array[1023] = 3; //这一句是测试bss的内存区 } }

它是这么编译的:


[== Undefined ==]
doado: doado.c
    gcc -c doado.c -fno-builtin -std=c99 -g
    ld -static -e doado -o doado doado.o

这是运行的画面:

上面的12345, 123是fork(后,父子进程各自收到的返回值。 那些页错误,有的是copy-on-write,有的是map on demand。

有兴趣的朋友欢迎去看看。 https://github.com/weiweishuo/papaya 这是我的博客地址: http://user.qzone.qq.com/2106507650/2

收工。好久没熬夜了。。。

karma303 · 2016-10-12 14:57

实现了一个动态链接器, 暂时还没移植到papaya里.
700行代码. 不过已经有模有样了. 支持两种运行方式.

这是测试文件go.c的源码, 不然上面的输出大家看不懂, 其实就是访问.so里面的函数和变量:


[== Undefined ==]
^C
 cat go.c 
 extern int foobar1(void); 
 int nomain(void){ 
     foobar1(; 
     void print(char *fmt, ...); 
     print("\nI am  go!!\n"); 
     while(1); 
     return 0; 
 }

感兴趣的朋友可以去看看: https://github.com/weiweishuo/papaya/blob/master/cmd/ld.c/?ts=4 有些代码很蠢, 高手不要笑话.
像比用strcmp遍历section header, 因为我懒得去解析gnu的hash表了.

firephoenix · 2016-11-15 17:55

看了楼主这种学习内核的方法感到十分佩服,自己现在也有这股冲动,不知道能否指点指点,谢谢