- 论坛徽章:
- 0
|
好长时间都没来了,今天再来发发贴哦!^_^ 看了内核第一感觉是整个设计确实很精致,在很小的地方都可以体现开发人员的素养。比如在网络程序中内核采用统一的调用接口sys_socketcall(int call,unsigned long *args),而在sys_socketcall根据call来确定具体的调用。这样统一的接口给人的感觉是很方便的,只要传入特定的参数就OK了。在内核中保证操作的原子性是一个贯穿始终的问题,很多地方都可以看到spin_lockxxxx的东西,这就是为了保证原子性而设计的。为了解决不同类型的原子性问题,spin_lock就设计了一个系列的函数。 在对进程的控制中也有很经典的地方,在内核中利用哈希表使得对进程的查询速度很快,利用哈希表时主要解决的是解决冲突的问题,在内核中用的是链地址法来解决的,就是如果利用哈希函数时得到的是同一个地址,则将其加入到这个地址的一个链表中,这样就可以解决其冲突问题;建立进程数的时候用的是一个双向的链表,利用宏SET_LINK来插入一个元素到双向链表中; #define SET_LINK (p) do { \ (p) ->next_task = &init_task; \ (p) ->prev_task = &init_task; \ init_task->prev_task = (p); \ init_task->prev_task->next_task = (p); \ (p) ->pysptr = NULL; \ if((p)->p_osptr = (p)->p_pptr->p_cptr) != NULL) (p) ->p_osptr->p_ysptr = p; \ (p) ->p_pptr->p_cptr = p; \ }while(0) 不过中间也有些问题实在想不通,比如在2.4内核中开始要解析环境参数,用的函数 static void __init parse_options(char *line) { char *next,*quote; int args, envs; if (!*line) return; args = 0; envs = 1; /* TERM is set to 'linux' by default */ next = line; while ((line = next) != NULL) { quote = strchr(line,'"'); next = strchr(line, ' '); while (next != NULL && quote != NULL && quote = MAX_INIT_ENVS) break; envp_init[++envs] = line; } else { if (args >= MAX_INIT_ARGS) break; if (*line) argv_init[++args] = line; } } argv_init[args+1] = NULL; envp_init[envs+1] = NULL; } 不知道传入的cmd_line到底是什么样的格式,如果就是象嵌入式中很常见的"noinitrd root=/dev/mtdblock/0 init=/linuxrc console=ttyS0"那样传入的话,这个函数就不可能达到预期的效果,因为在解析时开始是以引号和空格作为标志的,如果是这样在while循环中找到开始找到第一个"然后进入就找的最后一个"就根本不能解析里面的字符串,但是从if (!strncmp(line,"init=",5))来看参数确实应该是按上面这种方式传入的,我也按照他这种方式做过试验,不管用那种方式都得不到想要的结果,学习当中,各位有撒想法可以一起研究啊,呵呵! ^_^!
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/7547/showart_227696.html |
|