bsdfun 发表于 2012-12-19 20:10

想要做一个与FreeBSD内核相关的毕设,恳请大家给一些意见!

我之前一直在分析FreeBSD内核的网络部分,并进行一些内核编程,下学期就要做毕业设计啦,我很想做一个与FreeBSD内核相关的东西,但是很纠结不知道选择哪个题目比较好。原本毕设题目应该是和导师一起商量着确定的,但是我们学校对FreeBSD了解的老师比较少,所以想更多的靠自己选择一个题目。

我有两个想法,一个想法是以内核模块的方式做一个在内核中运行的纯静态的HTTP服务器,不支持CGI的,尽可能高效的处理连接请求。但怕老师可能会觉得太简单。另外一个想法是修改内核中网卡的驱动,提供一个字符设备接口,让用户空间的进程可以直接收发以太网帧,然后尝试移植FreeBSD中的TCP/IP协议栈到用户空间,做一个带TCP/IP协议栈的http服务器(两者绑定在一起),这样可以让自己很好的学习TCP/IP协议栈的实现,但是我还是更想在内核中编程,不想把编程的重点放在用户空间。

还有什么其它不错的选择吗?或者有一些参考来源也行呀!

恳请大家给一些意见,非常非常非常感谢呀!

bsdfun 发表于 2012-12-19 20:14

第二个感觉难度有些大,最终不一定能做的出来。

gvim 发表于 2012-12-19 23:24

本帖最后由 gvim 于 2012-12-19 23:26 编辑

内核和应用层除了权限不一样,本质没什么区别,没必要看不起用户层。比如你想学学内存管理,不需要到内核层去你照样可以malloc一大块内存出来自己做分配策略(太多的web软件都这样做)。能构建现在这样的软件世界,操作系统只占了两席:Unix和Windows,其他各种软件,matlab,java,python,apache,nginx,firefox,photoshop等等。更多的创造实在用户层。
FreeBSD内核和Linux内核本质没什么区别,翻翻操作系统的书,两者很多概念上的东西是那样的,只是实现不一样,整体代码和架构不一样,因此不要觉得会FreeBSD的老师少他就无法为你提供帮助,在现有的知识范畴里面,如果他能告诉你毕业设计在Linux下面做某件事情,多半你可以考虑在FreeBSD上实施。
第一个想法除了能对Http协议熟悉一些和可能存在的文本解析的话,几乎不能带给你什么东西,因为内核层的限制你连最基本的CGI实现起来都举步维艰,http的解析需要手工解析。而且,“高效的处理连接请求”本身就是伪命题,因为没有CGI或类似handler的http server谈不上处理任何东西,效率何来?
第二个想法如果是想学习Tcp/IP的话,我到建议你用更简单的系统,把操作系统自身的复杂性控制在一定范围,比如eCos(协议占是用的FreeBSD和OpenBSD可选),或者微内核的东西比如minix。

如果一定想在内核里对网络做手脚,不妨看看某些Linux网络有而FreeBSD没有的功能,但又比较有意义的,给实现了。

bsdfun 发表于 2012-12-20 00:26

回复 3# gvim


    非常感谢您宝贵的意见哈!:D

内核和应用层确实没有什么本质的区别,无非就是有不同的权限,都是在调用一些API完成一些东西。我丝毫没有看不起用户层的!:D 而且我感觉用户层更有创造性!我之所以很想在FreeBSD内核中编程,是想要更好的感受FreeBSD内核的设计,这个只是针对FreeBSD内核这个软件的,“我更想在内核中编程”准确的说应该是“我更想在FreeBSD内核中编程”,因为我感觉FreeBSD内核的代码很优雅漂亮。

至于“高效的处理连接请求”,网络上很多的资源都是静态资源,几乎所有的图片都是静态的,服务器所做的事情就只是读取这些文件,然后发送给客户端。如果这个在内核中做的话,可以避免掉所有的系统调用带来的用户态与内核态的切换、以及用户态与内核态间的数据拷贝,另外还可以引入更多的性能优化方案(比如充分利用page cache等,不过这些我还没有仔细分析过,不知是否真正可行)。也就是说,这个服务器(准确的说是内核中的那部分)的目的就是尽可能高效的处理客户端对静态资源的请求。如果客户端发来CGI请求等自己不能处理的请求的话,完全可以使用某种机制,把这个请求redirect给一个传统的用户空间的进程的,再由它进行处理,不过这部分我并不打算去做。我期望的重点是,在实现基本的HTTP协议之后,尽可能的了解怎么充分的实现磁盘的缓冲机制减少IO、利用网络协议栈中的零拷贝等等,不过不一定能全都做出来。

delphij 发表于 2012-12-20 02:43

友情提示:第二个的第一部分其实已经有人做了 (netmap):NETMAP(4)            FreeBSD Kernel Interfaces Manual            NETMAP(4)

NAME
   netmap -- a framework for fast packet I/O

SYNOPSIS
   device netmap

DESCRIPTION
   netmap is a framework for fast and safe access to network devices (reach-
   ing 14.88 Mpps at less than 1 GHz).netmap uses memory mapped buffers
   and metadata (buffer indexes and lengths) to communicate with the kernel,
   which is in charge of validating information through ioctl() and
   select()/poll(). netmap can exploit the parallelism in multiqueue devices
   and multicore systems.

   netmap requires explicit support in device drivers.For a list of sup-
   ported devices, see the end of this manual page.

delphij 发表于 2012-12-20 02:58

另外第一个实际上也有人做过了:

http://openketa.sourceforge.net/

gvim 发表于 2012-12-20 10:35

回复 4# bsdfun


呵呵,别考虑那么多所谓的效率了。效率需要和实用做平衡,效率再高不实用,或者反过来,都是意义不大的东西。
其他情况下效率大部分时候是用钱堆出来的。比如要减少磁盘负载,最根本的方法是消除磁头的移动和减少磁头读写频率,那么目前最好的就是SSD+大内存。
FreeBSD的发展基本有两条线,一条是各大学、研究机构或个人的功能捐赠,另一条是实现其他各系统实现了而又很好的功能。
所有,个人看法还是如果仅当学习的话,先从简单的系统入手;如果想在FreeBSD上练手的话,可以看看其他系统实现了而FreeBSD没有实现的功能试着弄一弄,要不给FreeBSD移植几个驱动呗,呵呵,也能学不少东西。

bsdfun 发表于 2012-12-20 10:41

回复 5# delphij


    非常感谢您的友情提示哈!

netmap我这学期最开始的时候一直在分析,我感觉它为用户空间提供高效的raw packet I/O的思想非常好!这个最初我还是通过未来的研究生师兄的提醒才知道的!如果我做第二个的话,我就打算在内核这部分参看netmap,然后把重点放在用户空间的协议栈的移植上。


回复 6# delphij


    openketa我还没有听说过,非常感谢您提供的宝贵的资料哈!关于把http服务器在内核空间实现最初是一个很直接的想法,但是更多的优化思想我主要是借鉴于tux和khttpd。因为可以在这些优化上深究,我才敢把它作为毕设题目的一个选择。

tux: http://www.stllinux.org/meeting_notes/2001/0719/tux/index.html
khttpd: http://www.fenrus.demon.nl/


再次感谢您提供的宝贵资料哈!:emn12:

gvim 发表于 2012-12-20 10:47

回复 8# bsdfun


你不如请delphij做你的导师,他可是freebsd src commiter之一,你grep一下自己的kernel src,可以看到这个名字,呵呵。

bsdfun 发表于 2012-12-20 10:55

回复 7# gvim


    毕设嘛,所以想带有一些研究的性质,多一些性能的发掘,至少是理论上的。而且我感觉FreeBSD作为学术研究的平台很好,代码质量很高!其实我感觉有很多很优秀的东西最初是在FreeBSD中开发的,比如geom、netmap、jail、vimage等等。驱动的话,我们学校有可能会有其他人做,不过更多的是arm和linux上的,这个主要是做嵌入式方向的人多一些,我未来研究生的方向是网络,我想把精力更多的放在网络上边。。

页: [1] 2 3
查看完整版本: 想要做一个与FreeBSD内核相关的毕设,恳请大家给一些意见!