papaya内核更新了
本文是原「蜗窝讨论区」的历史存档(2016-09-24),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。
这次的版本号是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
收工。好久没熬夜了。。。
实现了一个动态链接器, 暂时还没移植到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表了.
看了楼主这种学习内核的方法感到十分佩服,自己现在也有这股冲动,不知道能否指点指点,谢谢
