看板 Soft_Job 關於我們 聯絡資訊
※ 引述《ggg12345 (ggg)》之銘言: : : 當 receive packet 常常會當掉. : : 找到最後是少下二個指令, sti 和 cli. : : 這很重要嗎? 不, 一點也不, 雖然花了很多時間, 但是一點也不重要 : : 分享的結果大家要嘛都是早知道, 要就是無所謂. : 細問一下, 能把情況環境說得更清楚嗎? : 這個是在 protection mode 時代之前, 還是之後的故事? : window95 之後, 像 packet driver 之類的就很難隨意掛上去. : network NAT 流行應該是 window9X 年代. 若只說 少了 cli sti : 指令, 聽的人能抓住要害嗎? 有聽能懂的會很多嗎? 我那時候己經有 Windows 95 了, 不過寫專題控制環境 當時在 DOS 下使用網卡的 Packet driver 收 Packet . 至少所有的 Packet 可以自己處理, 做轉址做 UDP 收送沒有什麼問題. 當時會這樣做的原因是, DOS 下其實並沒有什麼 OS 的概念, 這一部 份 DOS 不會幫你處理掉, 所以在我們的程式內仍然要做這件事情 至於 Windows 95 的話, 我寧願用 Linux 吧, 至少目前正在搞的也是類似的東西. 如果今天還要自己刻的話, 在 netif_rx 和 netif_receive_skb + 寫一個 virtual interface 有自己的 xmit 這樣會容易很多. : 這不應該說是不重要的問題或方法. 這根本是涉及 driver 的重要 : 功能--中斷的及時處理及不當的干擾. 剛剛翻了一下 Linux 這邊的做法, 看起來應該都不是做全系統的 local_irq_disable 而是偏向 disable device 的 irq mask 和 unmask . sti/cli 看起來是做其他部份, 大家有空好好追 code ;p : 在現在的 window os/linux os, user mode 程式是無法下這兩個 : 指令的, 但難道不會碰上同樣問題. 可以寫個 polling 程式呀, 要不然 message box . Virtualization driver . 都會用到類似的技巧. (如果 Virtualization 沒有 HW 支援時) : 這種答法, 好像跟沒講差不多. 但會的, 不講還是猜得到. 這不太 : 像教導學習. 或許給 source code 去試是最現實的分享? 那醜堪骯髒的 DOS source code 應該要埋起來. 千百年後如果有外星人找到, 應該會被困惑, 我們怎麼可以寫出這麼爛的東西. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.22.92
ggg12345:沒有cli是會掉封包還是當掉?若是當掉靠加cli應會掉封包. 11/21 01:01
rawpacket:記得是當掉. sti/cli 是成對的, 當初也沒有 sample code 11/21 02:04
rawpacket:講到這個東西, 就是找到沒有東西可以找了, 才隨手試其他 11/21 02:05
rawpacket:方向. 11/21 02:05
ggg12345:加上cli/sti後,不再當機.但是不是加快速度下就會掉封包? 11/21 07:55
rawpacket:印像中當時的確是有這樣的狀況, 不過我以為是我的程式 11/21 08:20
rawpacket:邏輯有問題, 那時用 Pentium II 450 應該只能跑到 10MB 11/21 08:21
rawpacket:左右的速度 11/21 08:21
ggg12345:謝謝說明!處理NAT封包時,是cli先做,處理完後才sti嗎? 11/21 09:14
rawpacket:處理 NAT 不用呀,進ISR 用 sti, 出用 cli, 應該是這樣吧 11/21 23:53
rawpacket:真的太久了 ^^ 11/21 23:53
ggg12345:您回想一下,說個道理.您的NAT處理是塞在ISR裡面剪開串接? 11/22 01:21
rawpacket:這部份真的忘了, 剛剛要找舊程式也找不到 ..... 11/23 02:12
rawpacket:剛剛看了以前的 slide, ISR 內應該只是標記 packet 11/23 02:24
rawpacket:其他的再用一個 BIG loop 去處理. 11/23 02:24