『壹』 虛擬機下的linux怎麼接受主機串口接收的數據
虛擬機中的串口連接可以採用兩種方法。一種是指定虛擬機的串口連接到實際的COM上,例如開發機連接到COM1,目標機連接到COM2,然後把兩個串口通過串口線相連接。另一種更為簡便的方法是:在較高一些版本的VMware中都支持把串口映射到命名管道,把兩個虛擬機的串口映射到同一個命名管道。例如,在兩個虛擬機中都選定同一個命名管道 \\.\pipe\com_1,指定target機的COM口為server端,並選擇"The other end is a virtual machine"屬性;指定development機的COM口端為client端,同樣指定COM口的"The other end is a virtual machine"屬性。對於IO mode屬性,在target上選中"Yield CPU on poll"復選擇框,development機不選。
串口是開發者經常要使用到的,我們有些時候需要使用windows開發,然而window裝在了虛擬機中,我們怎麼樣在虛擬機中使用串口呢?
1、在virtualbox中選擇啟用串口,埠模式選擇Host device.
由於現有兩個系統但是只有一個物理串口,所以虛擬機要通過主機的串口文件間接獲取數據,主機是linux,串口設備為/dev/ttyS0
2、埠/文件位置一欄填入:/dev/ttyS0,啟動虛擬機。
3、如果無法啟動虛擬機,很有可能是沒有對ttyS0設備的讀寫許可權,(可以ls -l /dev/ttyS0查看以下許可權)於是我們要修改ttyS0的許可權,在終端中輸入:sudo chmod 777 /dev/ttyS0 這樣就將ttyS0的所有許可權都打開了。啟動虛擬機,這時候就可以在虛擬機中(winXP)使用串口了
『貳』 Linux網路協議棧7--ipsec收發包流程
流程路徑:ip_rcv() --> ip_rcv_finish() --> ip_local_deliver() --> ip_local_deliver_finish()
解封側一定是ip報文的目的端,ip_rcv_finish中查到的路由肯定是本機路由(RTCF_LOCAL),調用 ip_local_deliver 處理。
下面是貼的網上的一張圖片。
ip_local_deliver_finish中 根據上次協議類型,調用對應的處理函數。inet_protos 中掛載了各類協議的操作集,對於AH或者ESP來說,是xfrm4_rcv,對於ipsec nat-t情況下,是udp協議的處理函數udp_rcv,內部才是封裝的ipsec報文(AH或者ESP)。
xfrm4_rcv --> xfrm4_rcv_spi --> xfrm4_rcv_encap --> xfrm_input
最終調用 xfrm_input 做收包解封裝流程。
1、創建SKB的安全路徑;
2、解析報文,獲取daddr、spi,加上協議類型(esp、ah等),就可以查詢到SA了,這些是SA的key,下面列出了一組linux ipsec的state(sa)和policy,方便一眼就能看到關鍵信息;
3、調用SA對應協議類型的input函數,解包,並返回更上層的協議類型,type可為esp,ah,ipcomp等。對應的處理函數esp_input、ah_input等;
4、解碼完成後,再根據ipsec的模式做解封處理,常用的有隧道模式和傳輸模式。對應xfrm4_mode_tunnel_input 和 xfrm4_transport_inout,處理都比較簡單,隧道模式去掉外層頭,傳輸模式只是設置一些skb的數據。
5、協議類型可以多層封裝,如ESP+AH,所以需要再次解析內存協議,如果還是AH、ESP、COMP,則解析新的spi,返回2,查詢新的SA處理報文。
6、經過上面流程處理,漏出了用戶數據報文(IP報文),根據ipsec模式:
流程路徑如下圖,這里以轉發流程為例,本機發送的包主要流程類似。
轉發流程:
ip_forward 函數中調用xfrm4_route_forward,這個函數:
1、解析用戶報文,查找對應的Ipsec policy(__xfrm_policy_lookup);
2、再根據policy的模版tmpl查找對應最優的SA(xfrm_tmpl_resolve),模版的內容以及和SA的對應關系見上面貼出的ip xfrm命令顯示;
3、最後根據SA生成安全路由,掛載再skb的dst上; 一條用戶流可以聲明多個安全策略(policy),所以會對應多個SA,每個SA處理會生成一個安全路由項struct dst_entry結構(xfrm_resolve_and_create_bundle),這些安全路由項通過 child 指針鏈接為一個鏈表,其成員 output掛載了不同安全協議的處理函數,這樣就可以對數據包進行連續的處理,比如先壓縮,再ESP封裝,再AH封裝。
安全路由鏈的最後一個路由項一定是普通IP路由項,因為最終報文都得走普通路由轉發出去,如果是隧道模式,在tunnel output封裝完完成ip頭後還會再查一次路由掛載到安全路由鏈的最後一個。
註: SA安全聯盟是IPsec的基礎,也是IPsec的本質。 SA是通信對等體間對某些要素的約定,例如使用哪種協議、協議的操作模式、加密演算法、特定流中保護數據的共享密鑰以及SA的生存周期等。
然後,經過FORWARD點後,調用ip_forward_finish()-->dst_output,最終調用skb_dst(skb)->output(skb),此時掛載的xfrm4_output
本機發送流程簡單記錄一下,和轉發流程殊途同歸:
查詢安全路由: ip_queue_xmit --> ip_route_output_flow --> __xfrm_lookup
封裝發送: ip_queue_xmit --> ip_local_out --> dst_output --> xfrm4_output
註:
1). 無論轉發還是本地發送,在查詢安全路由之前都會查一次普通路由,如果查不到,報文丟棄,但這條路由不一定需要指向真實的下一跳的出介面,只要能匹配到報文DIP即可,如配置一跳其它介面的defualt。
2). strongswan是一款用的比較多的ipsec開源軟體,協商完成後可以看到其創建了220 table,經常有人問裡面的路由有啥用、為什麼有時有有時無。這里做個測試記錄: 1、220中貌似只有在tunnel模式且感興趣流是本機發起(本機配置感興趣流IP地址)的時候才會配置感興趣流相關的路由,路由指定了source;2、不配置也沒有關系,如1)中所說,只要存在感興趣流的路由即可,只不過ping的時候需要指定source,否者可能匹配不到感興趣流。所以感覺220這個表一是為了保證
ipsec封裝發送流程:
xfrm4_output-->xfrm4_output_finish-->xfrm_output-->xfrm_output2-->xfrm_output_resume-->xfrm_output_one
xfrm4_output 函數先過POSTROUTING點,在封裝之前可以先做SNAT。後面則調用xfrm_output_resume-->xfrm_output_one 做IPSEC封裝最終走普通路由走IP發送。
貼一些網上的幾張數據結構圖
1、安全路由
2、策略相關協議處理結構
3、狀態相關協議處理結構
『叄』 Linux,通過串口實現線程對數據實現收發,為什麼只能寫線程,而讀線程運行不了
另一個線程完全可以運行,是否運行決定權在你。 如果另一個線程需要等待串口的數據,那麼它應該調用wait來等待信號量 讀取串口數據的線程應該在讀取完成後通知等待在信號量上的線程,以繼續運行。
『肆』 linux中socket怎麼實現同時收發數據,在我的系統中,需要向伺服器發送數據,伺服器也要向客戶度發數據
可以的 線程是共享內存空間的 因此在使用多線程的情況下,要做好線程同步的工作,要對
不同線程訪問的內存數據進行加鎖處理