ident編譯原理
1. 簡述一下編譯器和鏈接器的作用
1、編譯器:
編譯器對源文件進行編譯,就是把源文件中的文本形式存在的源代碼翻譯成機器語言形式的目標文件的過程,在這個過程中,編譯器會進行一系列的語法檢查。如果編譯通過,就會把對應的CPP轉換成OBJ文件。
2、鏈接器:
當鏈接器進行鏈接的時候,首先決定各個目標文件在最終可執行文件里的位置。然後訪問所有目標文件的地址重定義表,對其中記錄的地址進行重定向(加上一個偏移量,即該編譯單元在可執行文件上的起始地址)。
然後遍歷所有目標文件的未解決符號表,並且在所有的導出符號表裡查找匹配的符號,並在未解決符號表中所記錄的位置上填寫實現地址。最後把所有的目標文件的內容寫在各自的位置上,再作一些另的工作,就生成一個可執行文件。
2. socks5代理服務是什麼意思 有什麼做用
Socks5是一個實現SOCKS v5協議的代理伺服器。作為一個代理伺服器,socks5鑒別、授權、處理客戶的網路請求。它為客戶建立連接到客戶所請求的主機。客戶機試圖連接到網路時,只需連接到socks5的daemon。
接著是認證,客戶請求socks5激活網路連接。包括bind,connect,sendto,ping,traceroute。
Socks5是獨立於應用層協議的,能應付不同的網路服務。包括telnet,ftp,finger,whois,gopher,WWW。
Socks5 daemon 支持兩種授權方式:
Username/Password -- 參考socks5.passwd
Kerberos 5 -- 要求Kerberos libraries的支持。使用Kerberos 5(GSS-API) 的其它信息,請參考Kerberos 的man page。
Socks5的運行方式:
Standalone – default
Preforking - -p
Threaded - -t 如果你的操作系統支持POSIX threads 並且你configure socks5時加了—with-threads 參數。-t參數使socks5運行在threaded 模式。所有的操作系統都對線程數和每進程的打開文件描述符加於限制。
Through inetd - -i,通過inetd啟動。
你可以通過一些配置文件、環境變數和參數控制socks5 daemon。請參考socks5.conf(5)文檔。這個配置文件的優先順序高於環境變數和參數。環境變數設置高於參數設置。
OPTIONS
多個參數用空格分開。
-b [host:port] | --bindintfc [host:port]
host:port 指定socks5運行的主機和埠號用於代替預設的埠。忽略主機的話,socks5使用0.0.0.0做為主機值。
-d [val] | -- debug[val]
打開debug模式,設置debug值為val。如果忽略此值,socks5僅僅發送警告信息。val 的有效值是1,2,3。如果指定其它值,socks5認為是3。有效值的含義:
1 LOG_NOTICE 不報錯
2 LOG_INFO 報告信息
3 LOG_DEBUG 報告用於debug 的信息。
-f | --foreground
前台運行。當運行在standalone模式時,阻止從parent shell分裂。--foreground 一般用於調試
-i | --inetd
通過inetd運行socks5。
-n val | --nchildren val
設置同時存在的最大子進程數為val。Socks5預設最大子進程數為64。使用這個參數降低預設值。你不能設置最大子進程數超過操作系統限制的值。當運行在線程模式時,
socks5忽略此值,在oneshot 模式和 inetd 模式下,此參數也沒用。
-o | --oneshot
在前台處理一個請求,打開debug模式,輸出到stderr,然後退出。用於調試。
-p | --prefork
preforking進程運行socks5。同時需要 –nchildren 參數控制已forked 的進程數。
-s | --stderr
紀錄所有的輸出到stderr代替syslog。主要用於debug 模式。
-t | --threaded
運行在線程模式。要求你的操作系統支持POSIX threads 並且編譯socks5時加了—with-threads 參數。如果線程模式無效,socks5列印一個錯誤信息,轉到standalone 模式。
-v | --version
列印一條信息(包括當前socks5版本號)到stderr。
ENVIRONMENT
環境變數控制socks5怎樣執行。可以在環境或配置文件中設置它們。當環境和配置文件有沖突時,配置文件的優先順序高。在配置文件中設置變數,使用如下的語法:
set variable [value]
SOCKS5_BINDINTFC host:port
host:port 指定socks5運行的主機和埠號,用於代替預設的埠。忽略時,socks5用0.0.0.0作為主機值。
SOCKS5_CONFFILE filename
Filename 指定配置文件。在許多系統中,預設是/etc/socks5.conf。在運行socks5之前,設置這個變數。如果有多個socks5 daemon運行,為每個daemon使用不同的配置文件。
SOCKS5_DEMAND_IDENT
當客戶沒有響應ident 請求時,認證失敗。使用SOCKS5_DEMAND_IDENT確認每個連接有一個關聯的用戶名。
SOCKS_ENCRYPT
如果可能的話,請求下一個socks5進程加密數據。SOCKS5_ENCRYPT 僅僅在編譯socks5時包括了GSS-API認證時,才有意義。
SOCKS5_FORCE_ENCRYPT
當認證方式支持加密時,強迫客戶加密數據。
SOCKS5_IDENTFILE filename
Filename指定存儲ident信息的文件名。在許多系統中,預設是/tmp/socks5.ident。當有多個socks5 daemon運行時,SOCKS5_IDENTFILE非常有用。
SOCKS5_MAXCHILD val
val指定同時存在的最大子進程數。Socks5預設為64。可以降低預設置。不能超過64。Socks5運行在線程模式時,忽略此參數。當運行在oneshot或inetd模式時,此參數不發生作用。
SOCKS_NOIDENT
忽略ident請求。當客戶機沒有運行identd時,使用SOCKS5_NOIDENT將降低超時值。
SOCKS_NOINTCHK
請求下一個socks5進程執行沒有完整檢查的代理請求。只有在編譯時加入GSS-API認證時,SOCKS5_NOINTCHK才發生作用。
SOCKS_NONETMASKCHECK
指示daemon忽略檢查主機的子網掩碼。預設時,daemon檢查掩碼,如果在同一子網時,在檢查配置文件之前,直接連接。
SOCKS5_REVERSEMAP
總是試圖影射地址到主機名。預設時,socks5隻有當主機名或域名在配置文件中使用時才影射。設置後,log文件將紀錄主機名,這將降低性能。
SOCKS5_SERVICENAME
總是影射埠號到服務名。預設時,socks5隻有當服務名在配置文件中使用時才影射。設置後,log文件將紀錄服務名,這將降低性能。
SOCKS5_PASSWD [password]
當socks5 daemon連接到其它socks伺服器時,如果採用Username/Password 認證,用它來指定密碼。
SOCKS5_PIDFILE filename
指定存儲socks5進程ID的文件名。Socks5預設存貯PID在/tmp/socks5.pid。你可以用—bindintfc參數或設置SOCKS5_BINDINTFC環境變數運行socks5在不同於預設埠的其它埠。當運行在不同於預設埠的其它埠時,socks5存貯PID在/tmp/socks5.pid-port。
SOCKS5_PWDFILE filename
指定密碼文件。在許多系統中,預設是/etc/socks5.passwd。
SOCKS5_TIMEOUT minutes
指定連接停頓最長時間。超過最大值後,socks5斷開連接。忽略此值時,預設是15。
SOCKS5_UDPPORTRANGE port1-port2
指定一個Socks5用來發送UDP包的UDP埠范圍。
SOCKS5_USER [user id]
當socks5 daemon連接到其它socks server時,如果採用Username/Password認證,用此變數指定用戶名。
SOCKS5_V4SUPPORT
預設時,socks5隻接受SOCKS V5協議(rfc 1928)的請求。設此變數後,socks5將接受SOCKS V4 協議的請求。
REQUEST FOR COMMENTS
RFC1928 SOCKS protocol Version 5
RFC1929 Username/Password Authentication for SOCKS V5
RFC1961 GSS-API Authentication Method for SOCKS Version 5
SEE ALSO
Socks5.conf(5)
3. pl0怎麼擴展++,--功能
那我給你網站吧,我找很久了.那個東西是很需要的
http://download.csdn.net/source/191218
PL/0語言是Pascal語言的一個子集,這里分析的PL/0的編譯程序包括了對PL/0語
言源程序進行分析處理、編譯生成類PCODE代碼,並在虛擬機上解釋運行生成的類PCODE代碼的功能。
PL/0語言編譯程序採用以語法分析為核心、一遍掃描的編譯方法。詞法分析和代碼生成作為獨立的子程序供語法分析程序調用。語法分析的同時,提供了出錯報告和出錯恢復的功能。在源程序沒有錯誤編譯通過的情況下,調用類PCODE解釋程序解釋執行生成的類PCODE代碼。
2.各功能模塊描述
詞法分析子程序分析:
詞法分析子程序名為GETSYM,功能是從源程序中讀出一個單詞符號(TOTAKEN),把它的信息放入全局變數 SYM、ID和NUM中,字元變數放入CH中,語法分析器需要單詞時,直接從這三個變數中獲得。Getch過程通過反復調用Getch子過程從源程序過獲取字元,並把它們拼成單詞。GETCH過程中使用了行緩沖區技術以提高程序運行效率。
詞法分析器的分析過程:調用GETSYM時,它通過GETCH過程從源程序中獲得一個字元。如果這個字元是字母,則繼續獲取字元或數字,最終可以拼成一個單詞,查保留字表,如果查到為保留字,則把SYM變數賦成相應的保留字類型值;如果沒有查到,則這個單詞應是一個用戶自定義的標識符(可能是變數名、常量名或是過程的名字),把SYM置為IDENT,把這個單詞存入ID變數。查保留字表時使用了二分法查找以提高效率。如果Getch獲得的字元是數字,則繼續用Getch獲取數字,並把它們拼成一個整數或實數,然後把SYM置為 INTEGER或REAL,並把拼成的數值放入NUM變數。如果識別出其它合法的符號(比如:賦值號、大於號、小於等於號等),則把SYM則成相應的類型。如果遇到不合法的字元,把SYM置成NUL。
語法分析子程序分析:
語法分析子程序採用了自頂向下的遞歸子程序法,語法分析同時也根據程序的語義生成相應三元代碼,並提供了出錯處理的機制。語法分析主要由分程序分析過程(BLOCK)、參數變數分析過程(ParaDeclaration)、參數變數處理過程(ParaGetSub)、數組處理過程(ParaGetSub)、常量定義分析過程(ConstDeclaration)、變數定義分析過程(Vardeclaration)、語句分析過程(Statement)、表達式處理過程(Expression)、項處理過程(Term)、因子處理過程(Factor)和條件處理過程(Condition)構成。這些過程在結構上構成一個嵌套的層次結構。除此之外,還有出錯報告過程(Error)、代碼生成過程(Gen)、測試單詞合法性及出錯恢復過程(Test)、登錄名字表過程(Enter)、查詢名字表函數(Position)以及列出類 PCODE代碼過程(Listcode)作過語法分析的輔助過程。
由PL/0的語法圖可知:一個完整的PL/0程序是由分程序和句號構成的。因此,本編譯程序在運行的時候,通過主程序中調用分程序處理過程block來分析分程序部分(分程序分析過程中還可能會遞歸調用block過程),然後,判斷最後讀入的符號是否為句號。如果是句號且分程序分析中未出錯,則是一個合法的PL/0程序,可以運行生成的代碼,否則就說明源PL/0程序是不合法的,輸出出錯提示即可。
下面按各語法單元分析PL/0編譯程序的運行機制。
分程序處理過程:
語法分析開始後,首先調用分程序處理過程(Block)處理分程序。過程入口參數置為:0層、符號表位置0、出錯恢復單詞集合為句號、聲明符或語句開始符。進入Block過程後,首先把局部數據段分配指針設為3,准備分配3個單元供運行期存放靜態鏈SL、動態鏈DL 和返回地址RA。然後用Tx0記錄下當前符號表位置並產生一條Jmp指令,准備跳轉到主程序的開始位置,由於當前還沒有知到主程序究竟在何處開始,所以 Jmp的目標暫時填為0,稍後再改。同時在符號表的當前位置記錄下這個Jmp指令在代碼段中的位置。在判斷了嵌套層數沒有超過規定的層數後,開始分析源程序。首先判斷是否遇到了常量聲明,如果遇到則開始常量定義,把常量存入符號表。接下去用同樣的方法分析變數聲明,變數定義過程中會用Dx變數記錄下局部數據段分配的空間個數。然後如果遇到Procere保留字則進行過程聲明和定義,聲明的方法是把過程的名字和所在的層次記入符號表,過程定義的方法就是通過遞歸調用Block過程,因為每個過程都是一個分程序。由於這是分程序中的分程序,因此調用Block時需把當前的層次號Lev加一傳遞給Block 過程。分程序聲明部分完成後,即將進入語句的處理,這時的代碼分配指針CX的值正好指向語句的開始位置,這個位置正是前面的Jmp指令需要跳轉到的位置。於是通過前面記錄下來的地址值,把這個Jmp指令的跳轉位置改成當前cx的位置。並在符號表中記錄下當前的代碼段分配地址和局部數據段要分配的大小(DX 的值)。生成一條INT指令,分配DX個空間,作為這個分程序段的第一條指令。下面就調用語句處理過程Statement分析語句。分析完成後,生成操作數為0的OPR指令,用於從分程序返回(對於0層的主程序來說,就是程序運行完成,退出)。
常量定義過程:
通過循環,反復獲得標識符和對應的值,存入符號表。符號表中記錄下標識符的名字和它對應的值。
變數定義過程:
與常量定義類似,通過循環,反復獲得標識符,存入符號表。符號表中記錄下標識符的名字、它所在的層及它在所在層中的偏移地址。
參變數定義過程:
類似變數定義,將參變數,存入符號表中。
參變數處理過程:
如果函數用參變數,依照形參的類型、個數,由實參進行賦值。
數組處理過程:
計算數組括弧內的偏移值,存入棧頂用於後面生成的STOARR和LODARR指令調用實際的數組中元素的地址。
語句處理過程:
語句處理過程是一個嵌套子程序,通過調用表達式處理、項處理、因子處理等過程及遞歸調用自己來實現對語句的分析。語句處理過程可以識別的語句包括賦值語句、read語句、write語句、++語句、--語句、+=語句、-=語句、if-else-then語句、while語句、For語句、repeat 語句。當遇到begin/end語句時,就遞歸調用自己來分析。分析的同時生成相應的類PCODE指令。
賦值語句的處理:
首先獲取賦值號左邊的標識符,從符號表中找到它的信息,並確認這個標識符確為變數名。然後通過調用表達式處理過程算得賦值號右部的表達式的值並生成相應的指令保證這個值放在運行期的數據棧頂。最後通過前面查到的左部變數的位置信息,生成相應的STO指令,把棧頂值存入指定的變數的空間,實現了賦值操作。返回函數值也是用賦值語句進行返回值的儲存。
對函數與過程調用的處理:
首先判斷讀入的標識符屬性為FUNCTION或PROCEDURE,從符號表中找到此標識符,獲得其所在層次和偏移地址。然後生成相應的cal指令。至於調用子過程所需的保護現場等工作是由類PCODE解釋程序在解釋執行cal指令時自動完成的。如果此標識符不在第0層而且是該層函數的函數名則作為返回值返回。
read語句的處理:
確定read語句語法合理的前提下(否則報錯),由變數的類型生成相應的指令:
對於整型,第一條是16號操作的opr指令,實現從標准輸入設備上讀一個整數值,放在數據棧頂。如果讀入是實數就報錯,第二條是sto指令,把棧頂的值存入read語句括弧中的變數所在的單元。
對於實型,第一條是15號操作的opr指令,實現從標准輸入設備上讀一個實數值,放在數據棧頂。第二條是sto指令,把棧頂的值存入read語句括弧中的變數所在的單元。
對於字元型,第一條是20號操作的opr指令,實現從標准輸入設備上讀一個字元值,第二條是sto指令,把棧頂的值存入read語句括弧中的變數所在的單元。
write語句的處理:
與read語句相似。在語法正確的前提下,生成指令:通過循環調用表達式處理過程分析write語句括弧中的每一個表達式,生成相應指令保證把表達式的值算出並放到數據棧頂並生成指令,輸出表達式的值,如果是數字類型則生成14號操作的opr指令,如果是字元類型則生成19號操作的opr指令。
if-then-else語句的處理:
按if語句的語法,首先調用邏輯表達式處理過程處理if語句的條件,把相應的真假值放到數據棧頂。接下去記錄下代碼段分配位置(即下面生成的jpc指令的位置),然後生成條件轉移jpc指令(遇0或遇假轉移),轉移地址未知暫時填0。然後調用語句處理過程處理 then語句後面的語句或語句塊。then後的語句處理完後,如果遇到else,就調用語句處理過程處理else語句後面的語句或語句塊,這時當前代碼段分配指針的位置就應該是上面的jpc指令的轉移位置。通過前面記錄下的jpc指令的位置,把它的跳轉位置改成當前的代碼段指針位置,否則沒遇到else,那麼此時的當前代碼段分配指針的位置也是上面jpc指令的轉移位置,也是通過前面記錄下的jpc位置指令的位置,把它的跳轉到當前的代碼段指針位置。
begin/end語句的處理:
通過循環遍歷begin/end語句塊中的每一個語句,通過遞歸調用語句分析過程分析並生成相應代碼。
while語句的處理:
首先用cx1變數記下當前代碼段分配位置,作為循環的開始位置。然後處理while語句中的條件表達式生成相應代碼把結果放在數據棧頂,再用cx2變數記下當前位置,生成條件轉移指令,轉移位置未知,填0。通過遞歸調用語句分析過程分析do語句後的語句或語句塊並生成相應代碼。最後生成一條無條件跳轉指令 jmp,跳轉到cx1所指位置,並把cx2所指的條件跳轉指令的跳轉位置改成當前代碼段分配位置。
Repeat語句的處理:
首先用CX1變數記下當前代碼段分配位置,作為循環的開始位置。然後通過遞歸調用語句分析過程分析,直到遇到until保留字,如果未對應until則出錯。調用條件表達式處理過程生成相應代碼把結果放在數據棧頂,再生成條件轉移指令,轉移位置為上面記錄的CX1。
For語句的處理:
按For語句的語法,首先對For後面的一個標識符進行初值的賦值過程(類似賦值語句處理),生成相應的代碼。之後遇到TO或DOWNTO保留字,如果未對應則出錯。用CX1變數記下當前代碼段分配的位置,作為以後JMP循環的開始位置。對上面識別的標識符變數進行存取,與TO或DOWNTO後面的表達式進行比較,生成比較指令(TO為13、DOWNTO為11),再用CX2變數記下當前代碼段分配的位置,生成JPC指令,跳轉地址未知,之後可用CX2記錄下的位置進行回填。然後處理DO保留字後的循環體,第一步遞歸調用語句分析過程,第二步將原先For後的標識符變數進行自加處理,生成相應代碼,然後生成無條件跳轉語句JMP跳轉代碼為CX1。最後將此時的代碼段位置回填到JPC跳轉指令上。
表達式、項、因子處理:
根據PL/0語法可知,表達式應該是由正負號或無符號開頭、由若干個項以加減號連接而成。而項是由若干個因子以乘除號,mod、div符號或++、--符號連接而成,因子則可能是一個標識符或一個數字,或是一個以括弧括起來的子表達式。根據這樣的結構,構造出相應的過程,遞歸調用就完成了表達式的處理。把項和因子獨立開處理解決了加減號與乘除號的優先順序問題。在這幾個過程的反復調用中,始終傳遞fsys變數的值,保證可以在出錯的情況下跳過出錯的符號,使分析過程得以進行下去。
邏輯表達式的處理:
首先判斷是否為一元邏輯表達式:判奇偶。如果是,則通過調用表達式處理過程分析計算表達式的值,然後生成判奇指令。如果不是,則肯定是二元邏輯運算符,通過調用表達式處理過程依次分析運算符左右兩部分的值,放在棧頂的兩個空間中,然後依不同的邏輯運算符,生成相應的邏輯判斷指令,放入代碼段。
判斷單詞合法性與出錯恢復過程分析:
本過程有三個參數,s1、s2為兩個符號集合,n為出錯代碼。本過程的功能是:測試當前符號(即sym變數中的值)是否在s1集合中,如果不在,就通過調用出錯報告過程輸出出錯代碼n,並放棄當前符號,通過詞法分析過程獲取一下單詞,直到這個單詞出現在s1或s2集合中為止。
這個過程在實際使用中很靈活,主要有兩個用法:
在進入某個語法單位時,調用本過程,檢查當前符號是否屬於該語法單位的開始符號集合。若不屬於,則濾去開始符號和後繼符號集合外的所有符號。
在語法單位分析結束時,調用本過程,檢查當前符號是否屬於調用該語法單位時應有的後繼符號集合。若不屬於,則濾去後繼符號和開始符號集合外的所有符號。
通過這樣的機制,可以在源程序出現錯誤時,及時跳過出錯的部分,保證語法分析可以繼續下去。
語法分析過程中調用的其它子過程相對比較簡單,請參考源程序的注釋。
類PCODE代碼解釋執行過程分析:
這個過程模擬了一台可以運行類PCODE指令的棧式計算機。它擁有一個棧式數據段用於存放運行期數據、擁有一個代碼段用於存放類PCODE程序代碼。同時還擁用數據段分配指針、指令指針、指令寄存器、局部段基址指針等寄存器。
解釋執行類PCODE代碼時,數據段存儲分配方式如下:
對於源程序的每一個過程(包括主程序),在被調用時,首先在數據段中開辟三個空間,存放靜態鏈SL、動態鏈DL和返回地址RA。靜態鏈記錄了定義該過程的直接外過程(或主程序)運行時最新數據段的基地址。動態鏈記錄調用該過程前正在運行的過程的數據段基址。返回地址記錄了調用該過程時程序運行的斷點位置。對於主程序來說,SL、DL和RA的值均置為0。靜態鏈的功能是在一個子過程要引用它的直接或間接父過程(這里的父過程是按定義過程時的嵌套情況來定的,而不是按執行時的調用順序定的)的變數時,可以通過靜態鏈,跳過個數為層差的數據段,找到包含要引用的變數所在的數據段基址,然後通過偏移地址訪問它。
在過程返回時,解釋程序通過返回地址恢復指令指針的值到調用前的地址,通過當前段基址恢復數據段分配指針,通過動態鏈恢復局部段基址指針。實現子過程的返回。對於主程序來說,解釋程序會遇到返回地址為0的情況,這時就認為程序運行結束。
解釋程序過程中的base函數的功能,就是用於沿著靜態鏈,向前查找相差指定層數的局部數據段基址。這在使用sto、lod、stoArr、lodArr等訪問局部變數的指令中會經常用到。
類PCODE代碼解釋執行的部分通過循環和簡單的case判斷不同的指令,做出相應的動作。當遇到主程序中的返回指令時,指令指針會指到0位置,把這樣一個條件作為終至循環的條件,保證程序運行可以正常的結束
4. 如何在Linux下配置socks5代理
您好,希望以下回答能幫助您
找到socks5-v1.0r11.tar.gz這個軟體包
開始編譯,安裝
1
2
3
4
5
#tar xvfz socks5-v1.0r11.tar.gz
#cd socks5-v1.0r11
#./configure --with-threads
#make
#make install
開始配置
一般來說安裝完後,會在/etc目錄下生成socks5.conf(配置文件)和socks5.passwd(用於驗證的文件)這兩個文件,
下面我把我的配置文件帖出來
#/etc/socks5.conf
#指定SOCKS v5綁定的ip地址和監聽的埠。如果不指定綁定的IP將使用0.0.0.0
set SOCKS5_BINDINFC 192.168.0.8:1080
#忽略ident請求。當客戶機沒有運行identd時,使用SOCKS5_NOIDENT將降低超時值
set SOCKS5_NOIDENT
#指定連接停頓最長時間。超過最大值後,socks5斷開連接
set SOCKS5_TIMEOUT 15
#socks5將接受SOCKS V4 協議的請求,默認不接受
set SOCKS5_V4SUPPORT
#指定同時存在的最大子進程數,Socks5預設為64
set SOCKS5_MAXCHILD 4
#指定密碼文件
set SOCKS5_PWDFILE /usr/local/socks5/etc/socks5.passwd
#對所有的客戶連接都使用username/password用戶認證方法
auth - - u
#允許來自192.168.0.的任何經過用戶認證的連接
permit u - 192.168.0. - - -
#/usr/local/socks5/etc/socks5.passwd
#用戶 密碼
userA passwdA
userB passwdB
userC passwdC
前面的一些設置由於我在配置文件里都寫了相關的內容,就不在說明了
如果不需要用戶驗證只需要把
auth - - u
改成 auth - - -
permit u - 192.168.0. - - -
改成
permit - - - - - -
注意上面permit - - - - - -這一句,是使任何人都可以使用你的socks5 server,非常不安全(讓你作跳板),最好是有點限制
如
permit - - clientIP - - -
開始測試
/usr/local/socks5/bin/socks5 -f -s
如果出現下面的信息表示測試成功。
18210: Socks5 starting at Mon Dec 14 18:23:45 1998 in normal mode
然後退出socks5,開始正式運行它在背景模式:
正式運行
/usr/local/socks5/bin/socks5 -t -s 2> /var/log/socks5
最後,加到/etc/rc.d/rc.local
echo "/usr/local/socks5/bin/socks5 -t -s 2> /var/log/socks5.log"
>> /etc/rc.d/rc.local
如您還有疑問可繼續追問。
5. 什麼是PSOS
pSOS系統結構
pSOS是一個由標准軟組件組成的,可剪裁的實時操作系統。其系統結構如圖2.1所示
,它分為內核層、系統服務層、用戶層。
1. 內核層
pSOS內核負責任務的管理與調度、任務間通信、內存管理、實時時鍾管理、中斷服
務;可以動態生成或刪除任務、內存區、消息隊列、信號燈等系統對象;實現了基於優
先級的、選擇可搶占的任務調度演算法,並提供了可選的時間片輪轉調度。pSOS Kernel還
提供了任務建間通信機制及同步、互斥手段,如消息、信號燈、事件、非同步信號等。
pSOS操作系統在Kernel層中將與具體硬體有關的操作放在一個模塊中,對系統服務層
以上屏蔽了具體的硬體特性,從而使得pSOS很方便地從支持Intel 80x86系列轉到支持MC
68XXX系列,並且在系統服務層上對不同應用系統不同用戶提供標準的軟組件如PNA+、
PHILE+等。
2. 系統服務層
pSOS系統服務層包括PNA+、PRPC+、PHILE+等組件。PNA+實現了完整的基於流的TCP
/IP協議集,並具有良好的實時性能,網路組件內中斷屏蔽時間不大於內核模塊中斷屏蔽時
間。PRPC+提供了遠程調用庫,支持用戶建立一個分布式應用系統。PHILE+提供了文件系
統管理和對塊存儲設備的管理。PREPC+提供了標準的C、C++庫,支持用戶使用C、C++語言
編寫應用程序。
由於pSOS內核屏蔽了具體的硬體特性,因此,pSOS系統服務層的軟組件是標準的、與
硬體無關的。這意味著pSOS各種版本,無論是對80X86系列還是MC68XXX系列,其系統服務
層各組件是標準的、同一的,這減少了軟體維護工作,增強了軟體可移植性。
每個軟組件都包含一系列的系統調用。對用戶而言,這些系統調用就象一個個可重入
的C函數,然而它們卻是用戶進入pSOS內核的唯一手段。
3. 用戶層
用戶指的是用戶編寫的應用程序,它們是以任務的形式出現的。任務通過發系統調
用而進入pSOS內核,並為pSOS內核所管理和調度。
pSOS為用戶還提供了一個集成式的開發環境(IDE)。pSOS_IDE可駐留於UNIX或DOS
環境下,它包括C和C++優化編譯器、CPU和pSOS模擬模擬和DEBUG功能。
pSOS內核機制
§3.1 幾個基本概念
3.1.1 任務
在實時操作系統中,任務是參與資源競爭(如CPU、Memory、I/O devices等)
的基本單位。pSOS為每個任務構造了一個虛擬的、隔離的環境,從而在概念上,一個任務
與另一個任務之間可以相互並行、獨立地執行。任務與任務之間的切換、任務之間的通
信都是通過發系統調用(在有些情況下是通過ISR)進入pSOS Kernel,由pSOS Kernel完
成的。
pSOS系統中任務包括系統任務和用戶任務兩類。關於用戶任務的劃分並沒有一個固
定的法則,但很明顯,劃分太多將導致任務間的切換過於頻繁,系統開銷太大,劃分太少又
會導致實時性和並行性下降,從而影響系統的效率。一般說來,功能模塊A與功能模塊B是
分開為兩個任務還是合為一個任務可以從是否具有時間相關性、優先性、邏輯特性和功
能耦合等幾個方面考慮。
3.1.2 優先順序
每個任務都有一個優先順序。pSOS系統支持0~255級優先順序,0級最低,255級最高。0級
專為IDLE任務所有,240~255級為系統所用。在運行時,任務(包括系統任務)的優先順序
可以通過t_setpri系統調用改變。
3.1.3 任務狀態
pSOS下任務具有三種可能狀態並處於這三個狀態之一。只有通過任務本身或其他任
務、ISR對pSOS內核所作的系統調用才能改變任務狀態。從宏觀角度看,一個多任務應用
通過一系列到pSOS的系統調用迫使pSOS內核改變受影響任務而從運行一個任務到運行另
一任務向前發展的。
對於pSOS kernel,任務在創建前或被刪除後是不存在的。被創建的任務在能夠運行
前必須被啟動。一旦啟動後,一個任務通常處於下面三個狀態之一:
①Executing (Ready)就緒
②Running運行
③Blocked阻塞
就緒任務是未被阻塞可運行的,只等待高優先順序任務釋放CPU的任務。由於一個任務
只能由正運行的任務通過調用來被啟動,而且任何時刻只能有一個正在運行的任務,所
以新任務總是從就緒態開始。
運行態任務是正在使用CPU的就緒任務, 系統只能有一個running任務。一般runni
ng任務是所有就緒任務中優先順序最高的,但也有例外。
任務是由自身特定活動而變為阻塞的,通常是系統調用引起調用任務進入等待狀態
的。所以任務不可能從ready態到blocked態,因為只有運行任務才能執行系統調用。
3.1.4 任務控制塊
任務控制塊TCB是pSOS內核建立並維護的一個系統數據結構,它包含了pSOS Kernel調
度與管理任務所需的一切信息,如任務名、優先順序、剩餘時間片數、當前寄存器狀態等。
在有的RTOS中,任務的狀態與任務TCB所處的隊列是等同的。pSOS操作系統將二者分
為兩個概念,例如任務處於阻塞狀態,但它的TCB卻處於消息等待隊列、信號燈等待隊列、
內存等待隊列、超時隊列之一。
pSOS啟動時,將根據Configuration Table中的參數kc_ntask建立一個包含kc_ntask
個TCB塊的TCB池,它表示最大並行任務數。在創建一個任務時,分配一個TCB給該任務,在
撤銷一個任務時,該TCB將被收回。
3.1.5 對象、對象名及ID號
pSOS Kernel是一個面向對象的操作系統內核,pSOS系統中對象包括任務、memory
regions、memory partitions、消息隊列和信號燈。
對象名由用戶定義(4位ASCII字元),並且在該對象創建時作為系統調用obj_CREAT
E
的一個人口參數傳給pSOS Kernel。pSOS Kernel反過來賦予該對象一個唯一的32位ID號
。除obj_CREATE和obj_IDENT外,所有涉及對象的系統調用都要用到對象ID號。
創建對象的任務通過obj_CREATE就已經知道了該對象的ID號,其餘任務可通過obj_
IDENT或通過全局變數(如果已經為該任務的ID號建立了一個全局變數的話)獲取該對象
的ID號。對象ID號隱含了該對象控制塊(如TCB、QCB)的位置信息,這一位置信息被pSO
S
Kernel用於對該對象的管理和操作,如掛起/解掛一個任務、刪除一個消息隊列等。
3.1.6 任務模式字Mode word.
每個任務帶有一個mode word,用來改變調度決策或執行環境。主要有以下四個參
數
Preemption Enabled/Disabled.
Roundrobin Enabled/Disabled
Interupts Enabled/Disabled.
ASR Enabled/Disabled: 每個任務有一個通過as-catoh建立起來的非同步信號服務例
程ASR。非同步信號類似於軟體中斷。當ASR位為1時as-catch所指向的任務將會被改變執行
路徑,先執行ASR,再返回原執行點。
§3.2 任務調度
3.2.1 影響動態調度效果的兩個因素
pSOS採用優先順序+時間片的調度方式。有兩個因素將影響動態調度的效果:一是優先
級可變(通過t_setpri系統調用改變任務的優先順序);二是任務模式字中的preemption
bit位和roundrobin bit位。preemption bit位決定不同優先順序的任務是否可搶占,並和
roundrobin bit位一起決定任務的時間片輪轉是否有效。
3.2.2 引起任務調度的原因及結果
pSOS系統中引起調度的原因有兩條:
1. 在輪轉方式下時間片到
2. pSOS系統調用引發任務調度。該系統調用可能是ISR發出的,也可能是某個任務發出的
。
pSOS任務調度的結果有兩種:
1. 引起運行任務切換,這指的是
2. 不引起運行任務切換,這指的是
不論任務調度是否引發運行任務切換,都有可能引起一個或多個任務狀態變遷。
3.2.3 運行任務的切換
一、何時切換
下面三種情況將引發運行任務切換:
1. 在時間片輪轉方式下(此時任務模式字的roundrobin bit與preemption bit均為
enable),運行任務Task A的時間片用完,且Ready隊列中有相同優先順序的其它任務,則
Task A退出運行。
2. 在運行任務Task A的Mode word的preemption bit位為enable的前提下,若Task A發出
的某條相同調用引發一個優先順序高於Task A的任務Task B從Block狀態進入Reary狀態,則
將Task B投入運行。
3. ISR使用I_RETURN系統調用,則ISR退出運行,pSOS Kernel選擇Ready隊列中優先順序最高
的任務投入運行(這一任務並不一定是被ISR打斷的前運行任務)。
二、如何切換
上述三類運行任務的切換,其具體的pSOS Kernel運作過程並非完全一樣,但彼此之間
差別不大。為了簡單起見,我們以
為例對切換過程作一簡單敘述。這一過程可細分為4個步驟:
1. 任務A運行信息保存(_t_save proc far)
這一過程主要完成修改系統工作標志,保存切換點地址及運行信息、任務A棧調
整
棧
指針保存、棧切換、參數及返址入棧等一系列工作。
2.任務A入就緒隊列(void t_in_chain)
這一過程將任務A的TCB塊按優先順序順序插入就緒隊列。
3.選擇一個高優先順序任務B(void t_choice( ))
按一定演算法從就緒隊列中選出最高優先順序任務B的TCB塊,並使運行指針指向它。
4.將任務B投入運行(_t_run proc far)
從系統棧切換到任務B棧,用任務B的TCB塊中保存的信息恢復上次運行被打斷的
地
,恢
復任務運行環境,於是任務B開始繼續運行。
圖3.1反映了典型任務切換過程中CPU控制權的轉移、各堆棧活動生命期、任務活動
生命期等信息。圖中
t1,t4為切換點 t2,t3為開/關中斷
Tsch=t4-t1 // Tsch為任務切換時間
Tforbid=t3-t2 // Tforbid為中斷禁止時間
它們是實時操作系統最重要的兩個性能指標。