最近在搜索dpkk时,发现一个有趣的东东:rump kernel。
他是netbsd下一个有用的功能。
介绍在:
http://www.netbsd.org/docs/rump/
https://github.com/anttikantee/buildrump.sh
通过它,可以将netbsd内核中的一部分模块比如tcp/ip协议栈、文件系统放到其它系统上,
比如linux、Solaris系统中,作为用户进程执行。
于是这样便有了一些有趣的东东:
fs-utils:http://github.com/stacktic/fs-utils
fast userspace packet processing:http://github.com/anttikantee/dpdk-rumptcpip
第二个实现了在dpdk的基础上,挂上了netbsd的协议栈,实现了网络功能。
原理如下:
The hypercall driver in this repository attaches a userspace rump kernel TCP/IP stack to a network interface card accessed via the Intel Data Plane Development Kit DPDK.
in rough diagram form:
------------------------------
| application process |
||--------------------------||
|| rump kernel (TCP/IP etc.)||
||--------------------------||
|| dpdk-rumptcpip (dpdkif) ||
||--------------------------||
|| DPDK ||
|----------------------------|
-----------------------------|
我在debian 7.0上,安装上了netbsd-rump和netbsd-fs-utils包,下载在这里:
http://ftp5.gwdg.de/pub/opensuse/repositories/home:/staal1978/Debian_7.0/i386/
通过ldd可以看到
root@routerclub:~/src# ldd /usr/bin/fsu_ls
linux-gate.so.1 => (0xb779f000)
libfsu.so.0 => /usr/lib/libfsu.so.0 (0xb7780000)
librumpvfs.so.0 => /usr/lib/librumpvfs.so.0 (0xb772a000)
librumpdev_disk.so.0 => /usr/lib/librumpdev_disk.so.0 (0xb771d000)
librumpdev.so.0 => /usr/lib/librumpdev.so.0 (0xb770e000)
librump.so.0 => /usr/lib/librump.so.0 (0xb7647000)
librumpuser.so.0 => /usr/lib/librumpuser.so.0 (0xb762d000)
librumpkern_sys_linux.so.0 => /usr/lib/librumpkern_sys_linux.so.0 (0xb7617000)
librumpnet_sockin.so.0 => /usr/lib/librumpnet_sockin.so.0 (0xb7611000)
librumpnet_net.so.0 => /usr/lib/librumpnet_net.so.0 (0xb7579000)
librumpnet.so.0 => /usr/lib/librumpnet.so.0 (0xb755d000)
librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb7554000)
libutil.so.1 => /lib/i386-linux-gnu/i686/cmov/libutil.so.1 (0xb7550000)
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb754b000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb73e8000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb73cf000)
/lib/ld-linux.so.2 (0xb77a0000)
在/usr/lib下,可以看到
root@routerclub:/usr/lib# ls libru*.a
librump.a librumpdev_sysmon_pic.a librumpfs_nfsserver_pic.a librumpkern_z.a
librumpclient.a librumpdev_ubt.a librumpfs_nilfs.a librumpkern_z_pic.a
librumpclient_pic.a librumpdev_ubt_pic.a librumpfs_nilfs_pic.a librumpnet.a
librumpdev.a librumpdev_ucom.a librumpfs_ntfs.a librumpnet_agr.a
librumpdev_audio.a librumpdev_ucom_pic.a librumpfs_ntfs_pic.a librumpnet_agr_pic.a
librumpdev_audio_pic.a librumpdev_ugenhc.a librumpfs_null.a librumpnet_bridge.a
librumpdev_bpf.a librumpdev_ugenhc_pic.a librumpfs_null_pic.a librumpnet_bridge_pic.a
librumpdev_bpf_pic.a librumpdev_ulpt.a librumpfs_ptyfs.a librumpnet_config.a
librumpdev_cgd.a librumpdev_ulpt_pic.a librumpfs_ptyfs_pic.a librumpnet_config_pic.a
librumpdev_cgd_pic.a librumpdev_umass.a librumpfs_smbfs.a librumpnet_local.a
librumpdev_disk.a librumpdev_umass_pic.a librumpfs_smbfs_pic.a librumpnet_local_pic.a
librumpdev_disk_pic.a librumpdev_usb.a librumpfs_syspuffs.a librumpnet_net80211.a
librumpdev_dm.a librumpdev_usb_pic.a librumpfs_syspuffs_pic.a librumpnet_net80211_pic.a
librumpdev_dm_pic.a librumpdev_wscons.a librumpfs_sysvbfs.a librumpnet_net.a
librumpdev_drvctl.a librumpdev_wscons_pic.a librumpfs_sysvbfs_pic.a librumpnet_netbt.a
librumpdev_drvctl_pic.a librumpfs_cd9660.a librumpfs_tmpfs.a librumpnet_netbt_pic.a
librumpdev_fss.a librumpfs_cd9660_pic.a librumpfs_tmpfs_pic.a librumpnet_netinet.a
librumpdev_fss_pic.a librumpfs_efs.a librumpfs_udf.a librumpnet_netinet_pic.a
librumpdev_md.a librumpfs_efs_pic.a librumpfs_udf_pic.a librumpnet_net_pic.a
librumpdev_md_pic.a librumpfs_ext2fs.a librumpfs_umap.a librumpnet_npf.a
librumpdev_netsmb.a librumpfs_ext2fs_pic.a librumpfs_umap_pic.a librumpnet_npf_pic.a
librumpdev_netsmb_pic.a librumpfs_fdesc.a librumpfs_union.a librumpnet_pic.a
librumpdev_pad.a librumpfs_fdesc_pic.a librumpfs_union_pic.a librumpnet_shmif.a
librumpdev_pad_pic.a librumpfs_ffs.a librumpfs_v7fs.a librumpnet_shmif_pic.a
librumpdev_pic.a librumpfs_ffs_pic.a librumpfs_v7fs_pic.a librumpnet_sockin.a
librumpdev_pud.a librumpfs_hfs.a librumpfs_zfs.a librumpnet_sockin_pic.a
librumpdev_pud_pic.a librumpfs_hfs_pic.a librumpfs_zfs_pic.a librumpnet_virtif.a
librumpdev_putter.a librumpfs_kernfs.a librumphijack_pic.a librumpnet_virtif_pic.a
librumpdev_putter_pic.a librumpfs_kernfs_pic.a librump_justtesting.a librump_pic.a
librumpdev_raidframe.a librumpfs_lfs.a librump_justtesting_pic.a librumpuser.a
librumpdev_raidframe_pic.a librumpfs_lfs_pic.a librumpkern_crypto.a librumpuser_pic.a
librumpdev_rnd.a librumpfs_mfs.a librumpkern_crypto_pic.a librumpvfs.a
librumpdev_rnd_pic.a librumpfs_mfs_pic.a librumpkern_solaris.a librumpvfs_fifofs.a
librumpdev_scsipi.a librumpfs_msdos.a librumpkern_solaris_pic.a librumpvfs_fifofs_pic.a
librumpdev_scsipi_pic.a librumpfs_msdos_pic.a librumpkern_sys_linux.a librumpvfs_layerfs.a
librumpdev_scsitest.a librumpfs_nfs.a librumpkern_sys_linux_pic.a librumpvfs_layerfs_pic.a
librumpdev_scsitest_pic.a librumpfs_nfs_pic.a librumpkern_tty.a librumpvfs_pic.a
librumpdev_sysmon.a librumpfs_nfsserver.a librumpkern_tty_pic.a
感觉实际上把netbsd的内核模块编译成为用户空间的so或者a静态库,从而在用户程序中调用bsd内核中的功能。