Linux操作系統、偏底層的項目?
01-30
大家好!
我們要做一個課程設計,範圍內 自由選題。範圍是和linux系統相關,既可以是內核層,也可以是用戶層。即便是用戶層也要盡量偏底層。提問者我的意思是最好用戶層的項目,內核層涉獵很少。
我的水平:linux作日常使用系統,較熟練使用C語言,懂一些linux系統編程,操作系統理論有一定基礎,簡單修改過早期內核(如添加系統調用)。 有什麼可以推薦的項目不?難度不要太大哦,做不出來後果很嚴重!謝謝!
有一個我之前做過的實習項目你可以考慮一下現有內核暴露的信息基本是通過procsfs實現的,比如說netstat列出TCP連接-&>進程信息的對應關係。如果你看過netstat或者lsof的實現,你會知道這個過程其實是通過讀取所有/proc目錄下PID文件夾里的fd目錄,裡面有打開的socket文件的inode number,然後再根據/proc/net/tcp里的inode number對應,join到一起的。這個過程很麻煩,不準確。你的任務是,給定一個(saddr, sport, daddr, dport)的tuple,能快速準確地找到這個tuple對應的process ID。實現方法可以簡單也可以複雜。我可以列幾個思路:
- 用auditd,把connect system call給audit掉,然後維護一個in memory的database記錄TCP連接
- 用kernel的ftrace功能,將TCP establish和termination的函數給trace掉,把trace的信息放到debugfs里userspace的進程去讀取
- 這個方法是最『正統』的,但是我仍然沒找到怎麼做到。每個socket連接有一個inode對應,這個inode是sockfs virtual file system上的inode number。如果你能寫一個kernel module,將這些信息在內核層面讀取出來,直接輸出到procfs包含four-tuple -&> pid信息,也算解決了問題。
補充一下,之前我用的是2實現的,後來發現1更簡單。我當時實現的語言是C++的daemon,加上Python的query client,跟你問題加的tag剛好類似。
加油吧騷年
試試在內核層實現一個私有隧道的packet和un-packet,以及encryption和decryption。記得考慮隧道分片和分片重組。
推薦閱讀: