JICAMA OS由于技术上面的原因一直停留在类似LINUX的单内核架构中,为了更好的支持文件系统,设备驱动,和网络,建立了自己的微内核架构,同时与单内核调用并存,单内核的系统调用号是0x80,微内核的系统调用号为0x40,并用此模块来开发高度可移植的文件系统。
这里是开发中的一个范例:
服务端:
static inline int msgcall(int func, int task, msg_t *ptr)
{
int return_value;
__asm__ volatile ("int $0x40" \
: "=a" (return_value) \
: "0" ((long)(0x00)),"b" ((long)(func)),"c" ((long)(task)),"d" ((long)(ptr))); \
return return_value;
}
int send(int task, msg_t *ptr)
{
return msgcall(SEND, task , ptr);
}
int receive(int task, msg_t *ptr)
{
return msgcall(RECEIVE, task , ptr);
}
int reply(int task, msg_t *ptr)
{
return msgcall(REPLY, task , ptr);
}
void ser_init()
{
printk("server_task1 init .....\n");
printk("server_task1 RUNING .....\n");
}
void server_task1()
{
int i;
char buf[256];
msg_t m;
ser_init(); /*server init*/
while(1){
m.msg_addr=(u32_t)buf;
receive(FIRST_KTASK, &m); /*receive message*/
printk("receive OK\n");
printk("MSG INFO: %s,Task=%d\n", buf, m.self); /*dump buffer!*/
m.msg_addr=2; /*call result*/
reply(m.self, &m); /*reply this message*/
}
}
客户端:
int main (int argc, char *argv[])
{
pid_t pid;
int i = 0;
u32_t b=0;
int ret;
char *str="First Message here!";
msg_t m;
m.self=0;
m.func=1;
m.message_len=strlen(str)+1;
m.msg_addr= (u32_t)str;
printf("\nMESSAGE SEND!\n");
ret=send(32, &m);
printf("Return Value is %d\n", ret);
while (environ[i])
{
printf("%s\n", environ[i++]);
}
return 1;
}
在象册里面我保存了这里的开发快照,有兴趣的朋友可以看一看。
本文地址:http://com.8s8s.com/it/it22844.htm