前言:進程間通信有:
socket ,? 共享內(nèi)存涣旨, 消息隊列歪架,信號量,信號霹陡,環(huán)境變量等
一和蚪、字符設(shè)備驅(qū)動框架流程:
二、實列代碼跑的效果:
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(命名管道)派歌,字符專用或塊專用文件
也可以跟下內(nèi)核的代碼:
編譯生成的ko文件胶果,sudo insmod ntychannel.ko 報錯如下:
獲取公鑰私鑰:https://wiki.gentoo.org/wiki/Signed_kernel_module_support#Enabling_module_signature_verification
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
可以思考下:虛擬文件系統(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中歉眷。
還有就是內(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)