Linux內(nèi)核編程--字符設(shè)備文件,進行進程間通信,弄清open調(diào)用流程

前言:進程間通信有:

socket ,? 共享內(nèi)存涣旨, 消息隊列歪架,信號量,信號霹陡,環(huán)境變量等

一和蚪、字符設(shè)備驅(qū)動框架流程:

字符設(shè)備驅(qū)動框架流程:

二、實列代碼跑的效果:

發(fā)送數(shù)據(jù)
接收數(shù)據(jù)
Makefile
我們可以單獨看mmap和poll

poll的實現(xiàn)主要是使用的內(nèi)核烹棉,驅(qū)動程序常用的等待隊列

關(guān)于系統(tǒng)調(diào)用:(以調(diào)用open函數(shù))

系統(tǒng)調(diào)用觸發(fā)中斷攒霹,中斷會去找系統(tǒng)調(diào)用表通過基地址尋址調(diào)用內(nèi)核sys_open, 然后調(diào)用file_operations里的函數(shù)。

open與channel_open有什么聯(lián)系浆洗?催束?

1. 調(diào)用open

2.觸發(fā)int ox80的中斷,中斷的入口函數(shù)system_call

3.在system_call里面伏社,調(diào)用sys_call_table抠刺,系統(tǒng)調(diào)用表

4.在unistd.h里,設(shè)置系統(tǒng)調(diào)用ID, (fork id 2 , read id is 3)

5. sys_call_table通過基地址尋址摘昌,sys_call_table+%eax*4-->

6. 調(diào)用內(nèi)核函數(shù)sys_open

7. sys_調(diào)用file_operations對應的接口

fd位于應用層速妖,而file位于內(nèi)核層,他們都同屬進程相關(guān)的概念聪黎。在linux中买优,同一個文件(對應于唯一的inode)可以被不同的進程打開多次,而每次打開都會獲得file數(shù)據(jù)結(jié)構(gòu)挺举。而每個進程都會維護一個已經(jīng)打開的file數(shù)組杀赢,fd就是對應file結(jié)構(gòu)的數(shù)組下標。因此湘纵,file和fd在進程范圍內(nèi)是一一對應的關(guān)系脂崔。

inode ------- file_ops

fd ------file數(shù)組對應,根據(jù)fd找到file->file_ops

struct file {

? ? const struct file_operations *f_op;

? ? ?unsigned int f_flags;// 可讀梧喷,可寫

}

系統(tǒng)調(diào)用open砌左,能找到channel_open().流程是這樣:open("/dev/ntychannel",) --->每個進程都會被分配個file結(jié)構(gòu)體脖咐,---》file結(jié)構(gòu)體里又有個inode, 但是每個文件都有一個inode,inode里有設(shè)備號汇歹,根據(jù)96和0屁擅,找到是哪個設(shè)備,---》然后通過cdev_init & cdev_add, 把設(shè)備cdev和file_operations聯(lián)系起來产弹。

下面這幅圖比較形象:

mknod /dev/ntychennel c 96 0? ?與ko文件里寫的設(shè)備號就對應起來

c:字符設(shè)備? 96:主設(shè)備號? ?0:次設(shè)備號

cat /proc/devices:? ?查看設(shè)備號

mknod 用指定名稱產(chǎn)生一個FIFO(命名管道)派歌,字符專用或塊專用文件



上面3張圖是一張,因為屏幕小痰哨,截不了

也可以跟下內(nèi)核的代碼:

select內(nèi)部也是調(diào)用了poll
虛擬內(nèi)存結(jié)構(gòu)圖


編譯生成的ko文件胶果,sudo insmod ntychannel.ko 報錯如下:

內(nèi)核對新加的木塊需要驗證,現(xiàn)在是驗證失敗斤斧,因為是ubuntu系統(tǒng)上早抠,內(nèi)核沒有編譯。最上的跑的結(jié)果是我在ubuntu14.04的結(jié)果撬讽,因為內(nèi)核從哪個版本開始(不記得版本)蕊连,就需要驗證了

獲取公鑰私鑰:https://wiki.gentoo.org/wiki/Signed_kernel_module_support#Enabling_module_signature_verification

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform PEM -out signing_key.pem signing_key.x509? -keyout signing_key.priv

sudo su?

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

對Ko文件加驗證

可以思考下:虛擬文件系統(tǒng)(VFS)對mmap前期做了哪些操作?

mmap_pgoff: mmap調(diào)用通過這開始進入SYSCALL_DEFINE6(mmap_pgoff)

mmap_pgoff: 檢查flags標志位

do_mmap_pgoff:再一次檢查各標志位以及邊界是否越界游昼,是否多次做映射咪奖。get_unmapped_area從共享內(nèi)存區(qū)獲取一塊沒有使用的地址。檢查需要映射的文件是否安全酱床。再調(diào)用mmap_region()里調(diào)用file->f_op->mmap(file, vma)

mmap_region: 主要負責創(chuàng)建和初始化虛擬內(nèi)存區(qū)域,并加入紅黑樹節(jié)點進行管理

Linux內(nèi)核提供了remap_pfn_range函數(shù): 來實現(xiàn)將內(nèi)核空間的內(nèi)存映射到用戶空間

將內(nèi)核空間的內(nèi)存映射到用戶空間趟佃,或者說是將用戶空間的一個vma虛擬內(nèi)存區(qū)映射到以page開始的一段連續(xù)物理頁面上

poll的調(diào)用流程:

SYSCALL_DEFINE3(poll): 一開始將超時時間轉(zhuǎn)換扇谣,然后調(diào)用do_sys_poll,如果在poll調(diào)用被阻塞時收到signal,do_sys_poll則產(chǎn)生EINR錯誤闲昭;此時返回ERESTART_RESTARTBLOCK罐寨,通知內(nèi)核處理完信號后自動通過sys_restart_syscall重啟poll調(diào)用(這個過程對用戶進程而言是透明的),

do_sys_poll:調(diào)用了copy_from_user序矩,把用戶空間的pollfd全部copy到內(nèi)核空間的poll_list中(與epoll的比較效率問題了)鸯绿,初始化poll_wqueues,調(diào)用do_poll

do_poll:? 1.遍歷poll_list,對每個pollfd進行do_pollfd操作,如果pollfd不能滿足poll要求(IO沒有就緒)簸淀,poll會自動將進程添加到文件的poll等待隊列中瓶蝴;如果pollfd滿足poll要求(已有IO就緒),將計數(shù)count++租幕,poll_table制成NULL舷手。如果timeout時間內(nèi),沒有則返回-EINTER劲绪。

do_pollfd: 調(diào)用fget_light根據(jù)fd獲取到文件file對象男窟,調(diào)用文種文件系統(tǒng)的poll方法盆赤,將返回事件取pollfd->events|POLLERR|POLLHUP子集后,放入pollfd->revents中歉眷。

do_pollfd()函數(shù)
對應文件文件系統(tǒng)的具體poll方法


還有就是內(nèi)核和驅(qū)動常用的等待隊列的函數(shù)的說明(有點像條件等待)牺六。

幾個API是POLL實現(xiàn)的調(diào)用的幾個內(nèi)核函數(shù):

wait_event_interruptible(channel->inq, have_data);

在進程執(zhí)行過程中,有時候需要等待某個條件滿足而進行進程阻塞汗捡。

常用的一種方法就是讓調(diào)用者進程暫時掛起淑际,直到目標進程返回結(jié)果后,再喚醒等待的進程凉唐。

wake_up(&channel->inq);?喚醒等待隊列中進程

poll_wait():?把本進程掛入某個隊列

mknod:?mknod 函數(shù)用于創(chuàng)建各種類型的文件庸追,包括普通文件、特殊文件以及設(shè)備文件

設(shè)備文件是文件系統(tǒng)中代表設(shè)備的特殊文件台囱。與普通的文件相比淡溯,設(shè)備文件在磁盤(或宿主文件系統(tǒng)所的在其它設(shè)備)上只占用一個索引節(jié)點,而沒有任何用于存放數(shù)據(jù)的記錄塊與之相聯(lián)系簿训。當然咱娶,這是因為設(shè)備文件的目的并不在于存儲和讀取數(shù)據(jù),而只在于為應用程序提供一條通向具體設(shè)備的途徑强品,使應用程序可以跟具體設(shè)備建立起連接膘侮。

普通文件(以及某些特殊文件)可以通過系統(tǒng)調(diào)用 open 來創(chuàng)建,只要在調(diào)用參數(shù)中或上 O_CREAT 標志的榛,就可以讓open函數(shù)在目標文件不存在時先創(chuàng)建這個文件琼了。當然也可通過調(diào)用 creat() 來直接創(chuàng)建文件,事實上 sys_creat() 就是通過 sys_open() 實現(xiàn)的夫晌〉裥剑可是這兩個系統(tǒng)調(diào)用都不能用來創(chuàng)建設(shè)備文件,因為設(shè)備文件的創(chuàng)建需要有一個參數(shù)來傳遞設(shè)備號晓淀,而 open 和 creat 函數(shù)都不包括這個參數(shù)所袁。此時就是 mknod 函數(shù)存在的意義了。

https://www.1024sou.com/article/363306.html? netlink 協(xié)議棧實戰(zhàn)

一凶掰、libnet庫下載:

官網(wǎng)下載地址:

https://github.com/sam-github/libnet

http://sourceforge.net/projects/libnet-dev/

http://packetfactory.openwall.net/projects/libnet/index.html

二燥爷、libnet庫編譯:

CSDN博客上的編譯:

http://blog.csdn.net/kanguolaikanguolaik/article/details/9358665

三、libnet庫簡單示例:

官網(wǎng)示例代碼:

http://packetfactory.openwall.net/projects/libnet/dist/deprecated/manual/index.html

四懦窘、libnet文檔:

官網(wǎng)文檔:

http://packetfactory.openwall.net/projects/libnet/dist/deprecated/manual/index.html

五前翎、虛擬網(wǎng)絡(luò)適配器的實現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畅涂,隨后出現(xiàn)的幾起案子鱼填,更是在濱河造成了極大的恐慌,老刑警劉巖毅戈,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苹丸,死亡現(xiàn)場離奇詭異愤惰,居然都是意外死亡,警方通過查閱死者的電腦和手機赘理,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門宦言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人商模,你說我怎么就攤上這事奠旺。” “怎么了施流?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵响疚,是天一觀的道長。 經(jīng)常有香客問我瞪醋,道長忿晕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任银受,我火速辦了婚禮践盼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宾巍。我一直安慰自己咕幻,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布顶霞。 她就那樣靜靜地躺著肄程,像睡著了一般。 火紅的嫁衣襯著肌膚如雪选浑。 梳的紋絲不亂的頭發(fā)上蓝厌,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音鲜侥,去河邊找鬼。 笑死诸典,一個胖子當著我的面吹牛描函,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狐粱,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼舀寓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肌蜻?” 一聲冷哼從身側(cè)響起互墓,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒋搜,沒想到半個月后篡撵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體判莉,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年育谬,在試婚紗的時候發(fā)現(xiàn)自己被綠了券盅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡膛檀,死狀恐怖锰镀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咖刃,我是刑警寧澤泳炉,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站嚎杨,受9級特大地震影響花鹅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜磕潮,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一翠胰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧自脯,春花似錦之景、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焕参,卻和暖如春轻纪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叠纷。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工刻帚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涩嚣。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓崇众,卻偏偏與公主長得像,于是被迫代替她去往敵國和親航厚。 傳聞我的和親對象是個殘疾皇子顷歌,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容