proc編譯編碼指定
編譯安裝內核
下載並解壓內核
內核下載官網:https://www.kernel.org/
解壓內核:tar xf linux-2.6.XX.tar.xz
定製內核:make menuconfig
參見makefile menuconfig過程講解
編譯內核和模塊:make
生成內核模塊和vmlinuz,initrd.img,Symtem.map文件
安裝內核和模塊:sudo make moles_install install
復制模塊文件到/lib/moles目錄下、復制config,vmlinuz,initrd.img,Symtem.map文件到/boot目錄、更新grub
其他命令:
make mrprobe:命令的作用是在每次配置並重新編譯內核前需要先執行「make mrproper」命令清理源代碼樹,包括過去曾經配置的內核配置文件「.config」都將被清除。即進行新的編譯工作時將原來老的配置文件給刪除到,以免影響新的內核編譯。
make dep:生成內核功能間的依賴關系,為編譯內核做好准備。
幾個重要的Linux內核文件介紹
config
使用make menuconfig 生成的內核配置文件,決定將內核的各個功能系統編譯進內核還是編譯為模塊還是不編譯。
vmlinuz 和 vmlinux
vmlinuz是可引導的、壓縮的內核,「vm」代表「Virtual Memory」。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制,Linux能夠使用硬碟空間作為虛擬內存,因此得名「vm」。vmlinuz是可執行的Linux內核,vmlinuz的建立有兩種方式:一是編譯內核時通過「make zImage」創建,zImage適用於小內核的情況,它的存在是為了向後的兼容性;二是內核編譯時通過命令make bzImage創建,bzImage是壓縮的內核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示「big zImage」,bzImage中的b是「big」意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內嵌有gzip解壓縮代碼,所以你不能用gunzip 或 gzip –dc解包vmlinuz。 內核文件中包含一個微型的gzip用於解壓縮內核並引導它。兩者的不同之處在於,老的zImage解壓縮內核到低端內存(第一個640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那麼可以採用zImage 或bzImage之一,兩種方式引導的系統運行時是相同的。大的內核採用bzImage,不能採用zImage。 vmlinux是未壓縮的內核,vmlinuz是vmlinux的壓縮文件。
initrd.img
initrd是「initial ramdisk」的簡寫。initrd一般被用來臨時的引導硬體到實際內核vmlinuz能夠接管並繼續引導的狀態。比如initrd- 2.4.7-10.img主要是用於載入ext3等文件系統及scsi設備的驅動。如果你使用的是scsi硬碟,而內核vmlinuz中並沒有這個 scsi硬體的驅動,那麼在裝入scsi模塊之前,內核不能載入根文件系統,但scsi模塊存儲在根文件系統的/lib/moles下。為了解決這個問題,可以引導一個能夠讀實際內核的initrd內核並用initrd修正scsi引導問題,initrd-2.4.7-10.img是用gzip壓縮的文件。initrd映象文件是使用mkinitrd創建的,mkinitrd實用程序能夠創建initrd映象文件,這個命令是RedHat專有的,其它Linux發行版或許有相應的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd
System.map是一個特定內核的內核符號表,由「nm vmlinux」產生並且不相關的符號被濾出。
下面幾行來自/usr/src/linux-2.4/Makefile:
nm vmlinux | grep -v '(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' | sort > System.map
在進行程序設計時,會命名一些變數名或函數名之類的符號。Linux內核是一個很復雜的代碼塊,有許許多多的全局符號, Linux內核不使用符號名,而是通過變數或函數的地址來識別變數或函數名,比如不是使用size_t BytesRead這樣的符號,而是像c0343f20這樣引用這個變數。 對於使用計算機的人來說,更喜歡使用那些像size_t BytesRead這樣的名字,而不喜歡像c0343f20這樣的名字。內核主要是用c寫的,所以編譯器/連接器允許我們編碼時使用符號名,而內核運行時使用地址。 然而,在有的情況下,我們需要知道符號的地址,或者需要知道地址對應的符號,這由符號表來完成,符號表是所有符號連同它們的地址的列表。
Linux 符號表使用到2個文件: /proc/ksyms 、System.map 。/proc/ksyms是一個「proc file」,在內核引導時創建。實際上,它並不真正的是一個文件,它只不過是內核數據的表示,卻給人們是一個磁碟文件的假象,這從它的文件大小是0可以看 出來。然而,System.map是存在於你的文件系統上的實際文件。當你編譯一個新內核時,各個符號名的地址要發生變化,你的老的System.map 具有的是錯誤的符號信息,每次內核編譯時產生一個新的System.map,你應當用新的System.map來取代老的System.map。
雖然內核本身並不真正使用System.map,但其它程序比如klogd, lsof和ps等軟體需要一個正確的System.map。如果你使用錯誤的或沒有System.map,klogd的輸出將是不可靠的,這對於排除程序故障會帶來困難。沒有System.map,你可能會面臨一些令人煩惱的提示信息。 另外少數驅動需要System.map來解析符號,沒有為你當前運行的特定內核創建的System.map它們就不能正常工作。 Linux的內核日誌守護進程klogd為了執行名稱-地址解析,klogd需要使用System.map。System.map應當放在使用它的軟體能夠找到它的地方。執行:man klogd可知,如果沒有將System.map作為一個變數的位置給klogd,那麼它將按照下面的順序,在三個地方查找System.map: /boot/System.map 、/System.map 、/usr/src/linux/System.map
System.map也有版本信息,klogd能夠智能地查找正確的映象(map)文件。
makefile menuconfig過程講解
當我們在執行make menuconfig這個命令時,系統到底幫我們做了哪些工作呢?這裡面一共涉及到了一下幾個文件我們來一一探討
Linux內核根目錄下的scripts文件夾
arch/$ARCH/Kconfig文件、各層目錄下的Kconfig文件
Linux內核根目錄下的makefile文件、各層目錄下的makefile文件
Linux內核根目錄下的的.config文件、arch/$ARCH/configs/下的文件
Linux內核根目錄下的 include/generated/autoconf.h文件
1)scripts文件夾存放的是跟make menuconfig配置界面的圖形繪制相關的文件,我們作為使用者無需關心這個文件夾的內容
2)當我們執行make menuconfig命令出現上述藍色配置界面以前,系統幫我們做了以下工作:
首先系統會讀取arch/$ARCH/目錄下的Kconfig文件生成整個配置界面選項(Kconfig是整個linux配置機制的核心),那麼ARCH環境變數的值等於多少呢?它是由linux內核根目錄下的makefile文件決定的,在makefile下有此環境變數的定義:
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
..........
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
或者通過 make ARCH=arm menuconfig命令來生成配置界面
比如教務處進行考試,考試科數可能有外語、語文、數學等科,這里我們選擇了arm科可進行考試,系統就會讀取arm/arm/kconfig文件生成配置選項(選擇了arm科的卷子),系統還提供了x86科、milps科等10幾門功課的考試題
3)假設教務處比較「仁慈」,為了怕某些同學做錯試題,還給我們准備了一份參考答案(默認配置選項),存放在arch/$ARCH/configs/目錄下,對於arm科來說就是arch/arm/configs文件夾:
此文件夾中有許多選項,系統會讀取哪個呢?內核默認會讀取linux內核根目錄下.config文件作為內核的默認選項(試題的參考答案),我們一般會根據開發板的類型從中選取一個與我們開發板最接近的系列到Linux內核根目錄下(選擇一個最接近的參考答案)
4).config
假設教務處留了一個心眼,他提供的參考答案並不完全正確(.config文件與我們的板子並不是完全匹配),這時我們可以選擇直接修改.config文件然後執行make menuconfig命令讀取新的選項。但是一般我們不採取這個方案,我們選擇在配置界面中通過空格、esc、回車選擇某些選項選中或者不選中,最後保存退出的時候,Linux內核會把新的選項(正確的參考答案)更新到.config中,此時我們可以把.config重命名為其它文件保存起來(當你執行make distclean時系統會把.config文件刪除),以後我們再配置內核時就不需要再去arch/arm/configs下考取相應的文件了,省去了重新配置的麻煩,直接將保存的.config文件復制為.config即可.
5)經過以上兩步,我們可以正確的讀取、配置我們需要的界面了,那麼他們如何跟makefile文件建立編譯關系呢?當你保存make menuconfig選項時,系統會除了會自動更新.config外,還會將所有的選項以宏的形式保存在Linux內核根目錄下的 include/generated/autoconf.h文件下
內核中的源代碼就都會包含以上.h文件,跟宏的定義情況進行條件編譯。
當我們需要對一個文件整體選擇如是否編譯時,還需要修改對應的makefile文件,例如:
我們選擇是否要編譯s3c2410_ts.c這個文件時,makefile會根據CONFIG_TOUCHSCREEN_S3C2410來決定是編譯此文件,此宏是在Kconfig文件中定義,當我們配置完成後,會出現在.config及autconf中,至此,我們就完成了整個linux內核的編譯過程。
最後我們會發現,整個linux內核配置過程中,留給用戶的介面其實只有各層Kconfig、makefile文件以及對應的源文件。
比如我們如果想要給內核增加一個功能,並且通過make menuconfig控制其聲稱過程
首先需要做的工作是:修改對應目錄下的Kconfig文件,按照Kconfig語法增加對應的選項;
其次執行make menuconfig選擇編譯進內核或者不編譯進內核,或者編譯為模塊,.config文件和autoconf.h文件會自動生成;
最後修改對應目錄下的makefile文件完成編譯選項的添加;
最後的最後執行make命令進行編譯。
Kconfig和Makefile
Linux內核源碼樹的每個目錄下都有兩個文檔Kconfig和Makefile。分布到各目錄的Kconfig構成了一個分布式的內核配置資料庫,每個Kconfig分別描述了所屬目錄源文檔相關的內核配置菜單。在執行內核配置make menuconfig時,從Kconfig中讀出菜單,用戶選擇後保存到.config的內核配置文檔中。在內核編譯時,主Makefile調用這 個.config,就知道了用戶的選擇。這個內容說明了,Kconfig就是對應著內核的每級配置菜單。
假如要想添加新的驅動到內核的源碼中,要修改Kconfig,這樣就能夠選擇這個驅動,假如想使這個驅動被編譯,則要修改Makefile。添加新 的驅動時需要修改的文檔有兩種(如果添加的只是文件,則只需修改當前層Kconfig和Makefile文件;如果添加的是目錄,則需修改當前層和目錄下 的共一對Kconfig和Makefile)Kconfig和Makefile。要想知道怎麼修改這兩種文檔,就要知道兩種文檔的語法結構,Kconfig的語法參見參考文獻《【linux-2.6.31】kbuild》。
Makefile 文件包含 5 部分:
Makefile 頂層的 Makefile
.config 內核配置文件
arch/$(ARCH)/Makefile 體系結構 Makefile
scripts/Makefile.* 適用於所有 kbuild Makefile 的通用規則等
kbuild Makefiles 大約有 500 個這樣的文件
頂層 Makefile 讀取內核配置操作產生的.config 文件,頂層 Makefile 構建兩個主要的目標:vmlinux(內核映像)和 moles(所有模塊文件)。它通過遞歸訪問內核源碼樹下的子目錄來構建這些目標。訪問哪些子目錄取決於內核配置。頂層 Makefile 包含一個體系結構 Makefile,由 arch/$(ARCH)/Makefile 指定。體系結構 Makefile 文件為頂層 Makefile 提供了特定體系結構的信息。每個子目錄各有一個 kbuild文件和Makefile 文件來執行從上層傳遞下來的命令。kbuild和Makefile文件利用.config 文件中的信息來構造由 kbuild 構建內建或者模塊對象使用的各種文件列表。scripts/Makefile.*包含所有的定義/規則,等等。這些信息用於使用 kbuild和 Makefile 文件來構建內核。Makefile的語法參見參考文獻《【linux-2.6.31】kbuild》。
參考文獻
【linux-2.6.31】內核編譯指南.pdf
【linux-2.6.31】kbuild.pdf
Linker script in Linux.pdf
linux內核的配置機制及其編譯過程
Linux內核編譯過程詳解
Linux Kconfig及Makefile學習
『貳』 請教procomm plus 的基本使用方法
1 串口腳本
有些串口工具(例如串口調試助手)有定時發送功能,但只能發送一條固定的命令。我需要發送幾百條命令,又懶得寫程序,就希望找一個可以執行串口腳本的工具。然後我找到了procomm plus。
procomm plus的功能很多。我只需要串口腳本功能,所以沒有執行安裝程序,解壓後直接執行Programs目錄的PW5.EXE。在菜單中選擇Options->System Options->Modem Connection...,在「Current Modem/Connection」的下拉列表中選擇要打開的串口或modem。在主窗口下方可以直接點擊、設置編碼格式、波特率。編碼格式可以選擇RAW ASCII。在主窗口可以直接敲AT命令,看到響應,和超機終端差不多。
在菜單中選擇Tools->Scripts,就可以看到腳本相關的菜單,包括執行、編譯、編輯、錄制腳本。procomm plus的腳本系統叫做ASPECT,功能看上去很強大,可以定義變數,有for、while 等流程式控制制,甚至包括接受用戶輸入的對話框。procomm plus中有完善的教程和幫助文檔。
我當然不會先看文檔。首先做的就是錄制一個腳本,看看大概是什麼樣子,然後照貓畫虎編寫自己的腳本。腳本的源文件是後綴為WAS的文件。源文件經過編譯才能運行,編譯產生的文件後綴是wax。
如果讀者也是只想用串口腳本功能,建議不要安裝procomm plus,直接運行就可以了。安裝後,每次啟動會檢測所有modem,浪費時間。
2 腳本示例
2.1 發送大量命令
我要做的一個事情就是給一個modem打補丁,要發送兩百多條命令。例如:
AT:PIB AT:Pf800,7b5d,4dc,7b5f,4de,7b59,4d8,7b5b,4da AT:Pf808,7b55,4d4,7b57,4d6,7b51,4d0,7b53,4d2 ...
modem對這些命令的響應都是"\r\nOK\r\n"。通過錄制的腳本,可以看到發送命令並等待響應的過程可以用以下語句完成:
transmit "AT:PIB^M" waitfor "K^M^J"
顯然transmit就是向串口寫。waitfor就是等待響應了。^M是回車符0D(就是\r)、^J是換行符0A(就是\n)。 waitfor語句在等待正常響應的最後3個字元。看懂這兩句後,編寫腳本的過程就是對要發送命令的簡單替換。 我常用的文本編輯器是我自己寫的cnbook。在cnbook中將行首
^
替換成
transmit "
將行尾
$
替換成
^M"\n waitfor "K^M^J"
替換時要選上「正則表達式」。將替換後的文本放到
proc main endproc
之間就可以了。完整的腳本看上去是這樣:
proc main transmit "AT:PIB^M" waitfor "K^M^J" transmit "AT:Pf800,7b5d,4dc,7b5f,4de,7b59,4d8,7b5b,4da^M" waitfor "K^M^J" transmit "AT:Pf808,7b55,4d4,7b57,4d6,7b51,4d0,7b53,4d2^M" waitfor "K^M^J" ... endproc
以後我需要打補丁,就是執行這兩百多條命令的時候,只要執行這個腳本就可以了。
2.2 自動測試
我需要通過串口敲鍵測試一台設備。我錄制了一次測試過程,然後用for循環自動測試100次。腳本看上去是這樣:
proc main integer Num ; Integer variable to increment. for Num = 0 upto 100 ; Init variable and define loop. transmit "o" waitfor "wait ..." transmit "1" waitfor "wait ..." transmit "0" waitfor "wait ..." transmit "0" waitfor "wait ..." transmit "0" waitfor "xt_connected_enter^M^J" transmit "p" waitfor "xt_idle_enter^M^J" ... endfor endproc
當然,在很多情況下,人工測試比自動測試更容易發現問題。不過,用串口腳本作自動測試也可以作為一種輔助的手段。
3 結束語
procomm plus的功能還有很多,它的腳本系統ASPECT的功能也遠遠不止於此。不過目前我只用到這些。
『叄』 java 找不到類錯誤
出現這個問題可能有兩個可能:
第一:類名和文件名出現不一致的情況(必須保持一致)
第二:環境變數配置有問題 首先在開始運行里cmd 回車 javac回車如果出現
'javac' 不是內部或外部命令,也不是可運行的程序
或批處理文件。
就需要修改環境變數:
我的電腦--屬性-高級-環境變數--系統變數:新建 path D:\Program Files\Java\jdk1.6.0_10\bin
新建 classpath 變數值為點分號(.;)
確定
開始--運行--- cmd 回車 javac 回車
-proc:{none,only} 控制是否執行注釋處理和/或編譯。
-processor <class1>[,<class2>,<class3>...]要運行的注釋處理程序的名稱;繞
的搜索進程
-processorpath <路徑> 指定查找注釋處理程序的位置
-d <目錄> 指定存放生成的類文件的位置
-s <目錄> 指定存放生成的源文件的位置
-implicit:{none,class} 指定是否為隱式引用文件生成類文件
-encoding <編碼> 指定源文件使用的字元編碼
-source <版本> 提供與指定版本的源兼容性
-target <版本> 生成特定 VM 版本的類文件
-version 版本信息
-help 輸出標准選項的提要
-Akey[=value] 傳遞給注釋處理程序的選項
-X 輸出非標准選項的提要
-J<標志> 直接將 <標志> 傳遞給運行時系統
出現這個即可,再次運行,就成功了
『肆』 proc/ksyms目錄有什麼用
proc文件系統是一個偽文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供介面。用戶和應用程序可以通過proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取proc文件時,proc文件系統是動態從系統內核讀出所需信息並提交的。
目錄結構
目錄名稱 目錄內容
apm 高級電源管理信息
cmdline 內核命令行
Cpuinfo關於Cpu信息
Devices 可以用到的設備(塊設備/字元設備)
DmaUsed DMS channels
Filesystems 支持的文件系統
Interrupts 中斷的使用
Ioports I/O埠的使用
Kcore內核核心印象
Kmsg 內核消息
Ksyms內核符號表
Loadavg負載均衡
Locks內核鎖
Meminfo 內存信息
MiscMiscellaneous
Moles載入模塊列表
Mounts 載入的文件系統
Partitions 系統識別的分區表
RtcReal time clock
Slabinfo Slab pool info
Stat全面統計狀態表s
Swaps 對換空間的利用情況
Version內核版本
Uptime 系統正常運行時間
並不是所有這些目錄在你的系統中都有,這取決於你的內核配置和裝載的模塊。另外,在/proc下還有三個很重要的目錄:net,scsi和sys。Sys目錄是可寫的,可以通過它來訪問或修改內核的參數(見下一部分),而net和scsi則依賴於內核配置。例如,如果系統不支持scsi,則scsi目錄不存在。
進程目錄
除了以上介紹的這些,還有的是一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每一個進程都有對應的一個目錄在/proc下,以進程的PID號為目錄名,它們是讀取進程信息的介面。而self目錄則是讀取進程本身的信息介面,是一個link。Proc文件系統的名字就是由之而起。進程目錄的結構如下:
目錄名稱 目錄內容
Cmdline命令行參數
Environ環境變數值
Fd一個包含所有文件描述符的目錄
Mem 進程的內存被利用情況
Stat進程狀態
Status Process status in human readable form
Cwd當前工作目錄的鏈接
ExeLink to the executable of this process
Maps內存印象
Statm 進程內存狀態信息
Root 鏈接此進程的root目錄
用戶如果要查看系統信息,可以用cat命令。例如:
>; cat /proc/interrupts
CPU0
0: 8728810 XT-PICtimer
1: 895 XT-PICkeyboard
2: 0 XT-PICcascade
3: 531695 XT-PICaha152x
4: 2014133 XT-PICserial
5: 44401 XT-PICpcnet_cs
8: 2 XT-PICrtc
11: 8 XT-PICi82365
12: 182918 XT-PICMouse
13: 1 XT-PICfpu PS/2
14: 1232265 XT-PICide0
15: 7 XT-PICide1
NMI:0
2、 修改內核參數
在/proc文件系統中有一個有趣的目錄:/proc/sys。它不僅提供了內核信息,而且可以通過它修改內核參數,來優化你的系統。但是你必須很小心,因為可能會造成系統崩潰。最好是先找一台無關緊要的機子,調試成功後再應用到你的系統上。
要改變內核的參數,只要用vi編輯或echo參數重定向到文件中即可。下面有一個例子:
# cat /proc/sys/fs/file-max
4096
# echo 8192 >; /proc/sys/fs/file-max
# cat /proc/sys/fs/file-max
8192
如果你優化了參數,則可以把它們寫成腳本文件,使它在系統啟動時自動完成修改。
×××××××××××××××××××××××××××××××××
/proc 文件系統是一個假的文件系統。它不存在在磁碟某個磁碟上。而是由核心在內存中產生。用於提供關於系統的信息(originally about processes, hence the name)。下面說明一些最重要的文件和目錄。 /proc 文件系統在proc man頁中有更詳細的說明。
/proc/1
關於進程1的信息目錄。每個進程在/proc 下有一個名為其進程號的目錄。
/proc/cpuinfo
處理器信息,如類型、製造商、型號和性能。
/proc/devices
當前運行的核心配置的設備驅動的列表。
/proc/dma
顯示當前使用的DMA通道。
/proc/filesystems
核心配置的文件系統。
/proc/interrupts
顯示使用的中斷,and how many of each there have been.
/proc/ioports
當前使用的I/O埠。
/proc/kcore
系統物理內存映象。與物理內存大小完全一樣,但不實際佔用這么多內存;it is generated on the fly as programs access it. (記住:除非你把它拷貝到什麼地方,/proc 下沒有任何東西佔用任何磁碟空間。)
/proc/kmsg
核心輸出的消息。也被送到syslog 。
/proc/ksyms
核心符號表。
/proc/loadavg
系統"平均負載";3個沒有意義的指示器指出系統當前的工作量。
/proc/meminfo
存儲器使用信息,包括物理內存和swap。
/proc/moles
當前載入了哪些核心模塊。
/proc/net
網路協議狀態信息。
/proc/self
到查看/proc 的程序的進程目錄的符號連接。當2個進程查看/proc 時,是不同的連接。這主要便於程序得到它自己的進程目錄。
/proc/stat
系統的不同狀態,such as the number of page faults since the system was booted.
/proc/uptime
系統啟動的時間長度。
/proc/version
核心版本。
注意所有上述文件給出易讀的文本文件,有時可能是不易讀的格式。有許多命令做了些格式化以更容易讀。例如,free 程序讀/proc/meminfo 並將給出的位元組數轉換為千位元組(並增加了一些信息)。
2半導體
.賽普拉斯半導體公司推出其下一代可編程片上射頻系統PRoC LP。該產品把WirelessUSB LP 2.4GHz收發器與enCoRe II 8位快閃記憶體微控制器集成在一顆單晶元上。PRoC LP簡化了編碼和電路板布局,旨在縮減設計時間,並降低諸如滑鼠、演示工具和RF遙控器等創新、小型無線人機介面設備的板級空間要求。
3SQL
PROCEDURE(存儲過程)的簡寫:實例:alter proc
alter pro [dbo].[sp_test]
@nick varchar=null,
@userid varchar=null
as
declare @count int
if @nick is not null
begin
print '搜索條件滿足執行搜索昵稱過程...... 搜索變數:'+@nick
select * from db_carser where f_nickname like'%'+@nick+'%'
select @count= (select count(*) from db_carser where f_nickname like'%'+@nick+'%')
end
else
begin
print 'userid有值執行查詢...... userid:'+@userid
select * from db_carser wheref_userid=@userid
select @count=(select count(*) from db_carser wheref_userid=@userid)
end
create table #tab_temp (tab1 varchar,tab2 varchar)
insert into #tab_temp(tab1) values (@count)
select * from #tab_temp
drop table #tab_temp
4過程
其格式為:
過程名PROC過程屬性
…
過程名ENDP
CALL和RET指令都有NEAR和FAR的屬性,段內調用使用NEAR屬性,段間調用使用FAR屬性。出於方便,80x86的匯編程序用PROC偽操作的類型屬性來確定確定CALL和RET指令的屬性。
『伍』 linux下,C++與proc的編譯出的靜態庫調用時報錯,求助
在編譯命令行中,將使用的靜態庫文件放在源文件後面就可以了。比如: gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop 其中-L/usr/lib指定庫文件的查找路徑,編譯器默認在當前目錄下先查找指定的庫文件。
『陸』 創建一個存儲過程'proc_dele',刪除『教師』表中指定教師編號記錄。 教師表(教師編號,教師職稱,姓名…)
Create proc proc_dele
@jsbh char(30)
as
begin
delete from 教師表 where 教師編號=@jsbh
end
『柒』 Linux系統中的/proc文件系統有什麼用
Linux 內核提供了一種通過 /proc 文件系統,在運行時訪問內核內部數據結構、 改變內核設置的機制。盡管在各種硬體平台上的 Linux 系統的 /proc 文件系統的 基本概念都是相同的,但本文只討論基於 intel x86 架構的 Linux /proc 文件系 統。 /proc --- 一個虛擬文件系統 /proc 文件系統是一種內核和內核模塊用來向進程 (process) 發送信息的機制 (所以叫做 /proc)。這個偽文件系統讓你可以和內核內部數據結構進行交互,獲取 有關進程的有用信息,在運行中 (on the fly) 改變設置 (通過改變內核參數)。 與其他文件系統不同,/proc 存在於內存之中而不是硬碟上。如果你察看文件 /proc/mounts (和 mount 命令一樣列出所有已經載入的文件系統),你會看到其中 一行是這樣的: 代碼如下: grep proc /proc/mounts /proc /proc proc rw 0 0 /proc 由內核控制,沒有承載 /proc 的設備。因為 /proc 主要存放由內核控制 的狀態信息,所以大部分這些信息的邏輯位置位於內核控制的內存。對 /proc 進行 一次 'ls -l' 可以看到大部分文件都是 0 位元組大的;不過察看這些文件的時候,確 實可以看到一些信息。這怎麼可能?這是因為 /proc 文件系統和其他常規的文件系 統一樣把自己注冊到虛擬文件系統層 (VFS) 了。然而,直到當 VFS 調用它,請求 文件、目錄的 i-node 的時候,/proc 文件系統才根據內核中的信息建立相應的文件 和目錄。 載入 proc 文件系統 如果系統中還沒有載入 proc 文件系統,可以通過如下命令載入 proc 文件系統: 代碼如下: mount -t proc proc /proc 察看 /proc 的文件 /proc 的文件可以用於訪問有關內核的狀態、計算機的屬性、正在運行的進程的 狀態等信息。大部分 /proc 中的文件和目錄提供系統物理環境最新的信息。盡管 /proc 中的文件是虛擬的,但它們仍可以使用任何文件編輯器或像'more', 'less'或 'cat'這樣的程序來查看。當編輯程序試圖打開一個虛擬文件時,這個文件就通過內核 中的信息被憑空地 (on the fly) 創建了。這是一些我從我的系統中得到的一些有趣 結果: 代碼如下: $ ls -l /proc/cpuinfo -r--r--r-- 1 root root 0 Dec 25 11:01 /proc/cpuinfo $ file /proc/cpuinfo /proc/cpuinfo: empty $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr xmm bogomips : 1998.85 processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr xmm bogomips : 1992.29 這是一個從雙 CPU 的系統中得到的結果,上述大部分的信息十分清楚地給出了這個系 統的有用的硬體信息。有些 /proc 的文件是經過編碼的,不同的工具可以被用來解釋 這些編碼過的信息並輸出成可讀的形式。這樣的工具包括:'top', 'ps', 'apm' 等。 得到有用的系統/內核信息 proc 文件系統可以被用於收集有用的關於系統和運行中的內核的信息。下面是一些重要 的文件: /proc/cpuinfo - CPU 的信息 (型號, 家族, 緩存大小等) /proc/meminfo - 物理內存、交換空間等的信息 /proc/mounts - 已載入的文件系統的列表 /proc/devices - 可用設備的列表 /proc/filesystems - 被支持的文件系統 /proc/moles - 已載入的模塊 /proc/version - 內核版本 /proc/cmdline - 系統啟動時輸入的內核命令行參數 proc 中的文件遠不止上面列出的這么多。想要進一步了解的讀者可以對 /proc 的每一個 文件都'more'一下或讀參考文獻[1]獲取更多的有關 /proc 目錄中的文件的信息。我建議 使用'more'而不是'cat',除非你知道這個文件很小,因為有些文件 (比如 kcore) 可能 會非常長。 有關運行中的進程的信息 /proc 文件系統可以用於獲取運行中的進程的信息。在 /proc 中有一些編號的子目錄。每個編號的目錄對應一個進程 id (PID)。這樣,每一個運行中的進程 /proc 中都有一個用它的 PID 命名的目錄。這些子目錄中包含可以提供有關進程的狀態和環境的重要細節信息的文件。讓我們試著查找一個運行中的進程。 代碼如下: $ ps -aef grep mozilla root 32558 32425 8 22:53 pts/1 00:01:23 /usr/bin/mozilla 上述命令顯示有一個正在運行的 mozilla 進程的 PID 是 32558。相對應的,/proc 中應該有一個名叫 32558 的目錄 代碼如下: $ ls -l /proc/32558
『捌』 紅警rules裡面PROC是什麼意思
Prerequisite=XXX
填建築名。這個代碼指定該單位製造時所必須的建築,當已方沒有該建築時該單位不能建造。
PROC 礦廠類建築,這種類型的新建築應該同時在PrerequisiteProc=中注冊.
『玖』 /proc文件系統的作用
proc文件系統是一個偽文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供介面。用戶和應用程序可以通過proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取proc文件時,proc文件系統是動態從系統內核讀出所需信息並提交的。它的目錄結構如下:
目錄名稱 目錄內容
apm 高級電源管理信息
cmdline 內核命令行
Cpuinfo 關於Cpu信息
Devices 可以用到的設備(塊設備/字元設備)
Dma 使用的DMA通道
Filesystems 支持的文件系統
Interrupts 中斷的使用
Ioports I/O埠的使用
Kcore 內核核心印象
Kmsg 內核消息
Ksyms 內核符號表
Loadavg 負載均衡
Locks 內核鎖
Meminfo 內存信息
Misc 雜項
Moles 載入模塊列表
Mounts 載入的文件系統
Partitions 系統識別的分區表
Rtc 實時時鍾
Slabinfo Slab池信息
Stat 全面統計狀態表
Swaps 對換空間的利用情況
Version 內核版本
Uptime 系統正常運行時間
並不是所有這些目錄在你的系統中都有,這取決於你的內核配置和裝載的模塊。另外,在/proc下還有三個很重要的目錄:net,scsi和 sys。Sys目錄是可寫的,可以通過它來訪問或修改內核的參數(見下一部分),而net和scsi則依賴於內核配置。例如,如果系統不支持scsi,則 scsi目錄不存在。
除了以上介紹的這些,還有的是一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每一個進程都有對應的一個目錄在/proc下,以進程的 PID號為目錄名,它們是讀取進程信息的介面。而self目錄則是讀取進程本身的信息介面,是一個link。Proc文件系統的名字就是由之而起。進程目錄的結構如下:
目錄名稱 目錄內容
Cmdline 命令行參數
Environ 環境變數值
Fd 一個包含所有文件描述符的目錄
Mem 進程的內存被利用情況
Stat 進程狀態
Status 進程當前狀態,以可讀的方式顯示出來
Cwd 當前工作目錄的鏈接
Exe 指向該進程的執行命令文件
Maps 內存映象
Statm 進程內存狀態信息
Root 鏈接此進程的root目錄
用戶如果要查看系統信息,可以用cat命令。例如:
# cat /proc/interrupts
CPU0
0: 8728810 XT-PIC timer
1: 895 XT-PIC keyboard
2: 0 XT-PIC cascade
3: 531695 XT-PIC aha152x
4: 2014133 XT-PIC serial
5: 44401 XT-PIC pcnet_cs
8: 2 XT-PIC rtc
11: 8 XT-PIC i82365
12: 182918 XT-PIC Mouse
13: 1 XT-PIC fpu PS/2
14: 1232265 XT-PIC ide0
15: 7 XT-PIC ide1
NMI: 0
用戶還可以實現修改內核參數。在/proc文件系統中有一個有趣的目錄:/proc/sys。它不僅提供了內核信息,而且可以通過它修改內核參數,來優化你的系統。但是你必須很小心,因為可能會造成系統崩潰。最好是先找一台無關緊要的機子,調試成功後再應用到你的系統上。
要改變內核的參數,只要用vi編輯或echo參數重定向到文件中即可。下面有一個例子:
# cat /proc/sys/fs/file-max
4096
# echo 8192 > /proc/sys/fs/file-max
# cat /proc/sys/fs/file-max
8192
如果你優化了參數,則可以把它們寫成添加到文件rc.local中,使它在系統啟動時自動完成修改。
/proc文件系統中網路參數
在/proc/sys/net/ipv4/目錄下,包含的是和tcp/ip協議相關的各種參數,下面我們就對這些網路參數加以詳細的說明。
ip_forward 參數類型:BOOLEAN
0 - 關閉(默認值)
not 0 - 打開ip轉發
在網路本地介面之間轉發數據報。該參數非常特殊,對該參數的修改將導致其它所有相關配置參數恢復其默認值(對於主機參閱RFC1122,對於路由器參見RFC1812)
ip_default_ttl 參數類型:INTEGER
默認值為 64 。表示IP數據報的Time To Live值。
ip_no_pmtu_disc 參數類型:BOOLEAN
關閉路徑MTU探測,默認值為FALSE
ipfrag_high_thresh 參數類型:整型
用來組裝分段的IP包的最大內存量。當ipfrag_high_thresh數量的內存被分配來用來組裝IP包,則IP分片處理器將丟棄數據報直到ipfrag_low_thresh數量的內存被用來組裝IP包。
ipfrag_low_thresh 參數類型:整型
參見ipfrag_high_thresh。
ipfrag_time 參數類型:整型
保存一個IP分片在內存中的時間。
inet_peer_threshold 參數類型:整型
INET對端存儲器某個合適值,當超過該閥值條目將被丟棄。該閥值同樣決定生存時間以及廢物收集通過的時間間隔。條目越多,存活期越低,GC 間隔越短
inet_peer_minttl 參數類型:整型
條目的最低存活期。在重組端必須要有足夠的碎片(fragment)存活期。這個最低存活期必須保證緩沖池容積是否少於 inet_peer_threshold。該值以 jiffies為單位測量。
inet_peer_maxttl 參數類型:整型
條目的最大存活期。在此期限到達之後,如果緩沖池沒有耗盡壓力的話(例如,緩沖池中的條目數目非常少),不使用的條目將會超時。該值以 jiffies為單位測量。
inet_peer_gc_mintime 參數類型:整型
廢物收集(GC)通過的最短間隔。這個間隔會影響到緩沖池中內存的高壓力。 該值以 jiffies為單位測量。
inet_peer_gc_maxtime 參數類型:整型
廢物收集(GC)通過的最大間隔,這個間隔會影響到緩沖池中內存的低壓力。 該值以 jiffies為單位測量。
tcp_syn_retries 參數類型:整型
對於一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄。不應該大於255,默認值是5,對應於180秒左右。
tcp_synack_retries 參數類型:整型
對於遠端的連接請求SYN,內核會發送SYN + ACK數據報,以確認收到上一個 SYN連接請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這里決定內核在放棄連接之前所送出的 SYN+ACK 數目。
tcp_keepalive_time 參數類型:整型
當keepalive打開的情況下,TCP發送keepalive消息的頻率,默認值是2個小時。
tcp_keepalive_probes 參數類型:整型
TCP發送keepalive探測以確定該連接已經斷開的次數,默認值是9。
tcp_keepalive_interval 參數類型:整型
探測消息發送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連接殺除的時間。默認值為75秒,也就是沒有活動的連接將在大約11分鍾以後將被丟棄。
tcp_retries1 參數類型:整型
當出現可疑情況而必須向網路層報告這個可疑狀況之前,需要進行多少次重試。最低的 RFC 數值是 3 ,這也是默認值,根據RTO的值大約在3秒 - 8分鍾之間。
tcp_retries2 參數類型:整型
在丟棄激活的TCP連接之前,需要進行多少次重試。RFC1122規定,該值必須大於100秒。默認值為15,根據RTO的值來決定,相當於13-30分鍾,
tcp_orphan_retries 參數類型:整型
在近端丟棄TCP連接之前,要進行多少次重試。默認值是 7 個,相當於 50秒 - 16分鍾,視 RTO 而定。如果您的系統是負載很大的web伺服器,那麼也許需要降低該值,這類 sockets 可能會耗費大量的資源。另外參的考 tcp_max_orphans 。
tcp_fin_timeout 參數類型:整型
對於本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開連接或一直不結束連接或不可預料的進程死亡。默認值為 60 秒。過去在2.2版本的內核中是 180 秒。您可以設置該值,但需要注意,如果您的機器為負載很重的web伺服器,您可能要冒內存被大量無效數據報填滿的風險,FIN-WAIT-2 sockets 的危險性低於 FIN-WAIT-1 ,因為它們最多隻吃 1.5K 的內存,但是它們存在時間更長。另外參考 tcp_max_orphans。
tcp_max_tw_buckets 參數類型:整型
系統在同時所處理的最大timewait sockets 數目。如果超過此數的話,time-wait socket 會被立即砍除並且顯示警告信息。之所以要設定這個限制,純粹為了抵禦那些簡單的 DoS 攻擊,千萬不要人為的降低這個限制,不過,如果網路條件需要比默認值更多,則可以提高它(或許還要增加內存)。
tcp_tw_recycle 參數類型:布爾
打開快速 TIME-WAIT sockets 回收。默認值是1。除非得到技術專家的建議或要求,請不要隨意修改這個值。
tcp_max_orphans 參數類型:整型
系統所能處理不屬於任何進程的TCP sockets最大數量。假如超過這個數量,那麼不屬於任何進程的連接會被立即reset,並同時顯示警告信息。之所以要設定這個限制,純粹為了抵禦那些簡單的 DoS 攻擊,千萬不要依賴這個或是人為的降低這個限制
tcp_abort_on_overflow 參數類型:布爾
當守護進程太忙而不能接受新的連接,就象對方發送reset消息,默認值是false。這意味著當溢出的原因是因為一個偶然的猝發,那麼連接將恢復狀態。只有在你確信守護進程真的不能完成連接請求時才打開該選項,該選項會影響客戶的使用。
tcp_syncookies 參數類型:整型
只有在內核編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是為了防止syn flood攻擊。默認值是false。
注意:該選項千萬不能用於那些沒有收到攻擊的高負載伺服器,如果在日誌中出現synflood消息,但是調查發現沒有收到synflood攻擊,而是合法用戶的連接負載過高的原因,你應該調整其它參數來提高伺服器性能。參考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.
syncookie嚴重的違背TCP協議,不允許使用TCP擴展,可能對某些服務導致嚴重的性能影響(如SMTP轉發)。
tcp_strg 參數類型:整型
使用 TCP urg pointer 欄位中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在 Linux 打開它,或會導致不能和它們正確溝通。默認值為為:FALSE
tcp_max_syn_backlog 參數類型:整型
對於那些依然還未獲得客戶端確認的連接請求,需要保存在隊列中最大數目。對於超過 128Mb 內存的系統,默認值是 1024 ,低於 128Mb 的則為 128。如果伺服器經常出現過載,可以嘗試增加這個數字。警告!假如您將此值設為大於 1024,最好修改 include/net/tcp.h 裡面的 TCP_SYNQ_HSIZE ,以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ,並且編進核心之內。
tcp_window_scaling 參數類型:布爾
正常來說,TCP/IP 可以接受最大到65535位元組的 windows。對於寬頻網路,該值可能是不夠的,通過調整該參數有助於提高寬頻伺服器性能。
tcp_timestamps 參數類型:布爾
Timestamps 用在其它一些東西中,可以防範那些偽造的 sequence 號碼。一條1G的寬頻線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由於上次產生的)。Timestamp 會讓它知道這是個 '舊封包'。
tcp_sack 參數類型:布爾
使用 Selective ACK,它可以用來查找特定的遺失的數據報--- 因此有助於快速恢復狀態。
tcp_fack 參數類型:布爾
打開FACK擁塞避免和快速重傳功能。
tcp_dsack 參數類型:布爾
允許TCP發送"兩個完全相同"的SACK。
tcp_ecn 參數類型:布爾
打開TCP的直接擁塞通告功能。
tcp_reordering 參數類型:整型
TCP流中重排序的數據報最大數量默認值是 3 。
tcp_retrans_collapse 參數類型:布爾
對於某些有bug的列印機提供針對其bug的兼容性。
tcp_wmem - 三個整數的向量: min, default, max
min:為TCP socket預留用於發送緩沖的內存最小值。每個tcp socket都可以在建議以後都可以使用它。默認值為4K。
default:為TCP socket預留用於發送緩沖的內存數量,默認情況下該值會影響其它協議使用的net.core.wmem_default 值,一般要低於net.core.wmem_default的值。默認值為16K。
max: 用於TCP socket發送緩沖的內存最大值。該值不會影響net.core.wmem_max,今天選擇參數SO_SNDBUF則不受該值影響。默認值為128K。
tcp_rmem - 三個整數的向量: min, default, max
min:為TCP socket預留用於接收緩沖的內存數量,即使在內存出現緊張情況下tcp socket都至少會有這么多數量的內存用於接收緩沖,默認值為8K。
default:為TCP socket預留用於接收緩沖的內存數量,默認情況下該值影響其它協議使用的 net.core.wmem_default 值。該值決定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win:0是默認值情況下,tcp 窗口大小為65535。
max:用於TCP socket接收緩沖的內存最大值。該值不會影響 net.core.wmem_max,今天選擇參數 SO_SNDBUF則不受該值影響。默認值為 128K。默認值為87380*2 bytes。
tcp_mem - 三個整數的向量: low, pressure, high
low:當TCP使用了低於該值的內存頁面數時,TCP不會考慮釋放內存。
pressure:當TCP使用了超過該值的內存頁面數量時,TCP試圖穩定其內存使用,進入pressure模式,當內存消耗低於low值時則退出pressure狀態。
high:允許所有tcp sockets用於排隊緩沖數據報的頁面量。
一般情況下這些值是在系統啟動時根據系統內存數量計算得到的。
tcp_app_win - 整數
保留max(window/2^tcp_app_win, mss)數量的窗口由於應用緩沖。當為0時表示不需要緩沖。默認值是31。
tcp_adv_win_scale - 整數
計算緩沖開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0),默認值為2。
ip_local_port_range - 兩個整數
定於TCP和UDP使用的本地埠范圍,第一個數是開始,第二個數是最後埠號,默認值依賴於系統中可用的內存數:
> 128Mb 32768-61000
< 128Mb 1024-4999 or even less.
該值決定了活動連接的數量,也就是系統可以並發的連接數
icmp_echo_ignore_all - 布爾類型
icmp_echo_ignore_broadcasts - 布爾類型
如果任何一個設置為true(>0)則系統將忽略所有發送給自己的ICMP ECHO請求或那些廣播地址的請求。
icmp_destunreach_rate - 整數
icmp_paramprob_rate - 整數
icmp_timeexceed_rate - 整數
icmp_echoreply_rate - 整數(not enabled per default)
限制發向特定目標的ICMP數據報的最大速率。0表示沒有任何限制,否則表示jiffies數據單位中允許發送的個數。
icmp_ignore_bogus_error_responses - 布爾類型
某些路由器違背RFC1122標准,其對廣播幀發送偽造的響應來應答。這種違背行為通常會被以告警的方式記錄在系統日誌中。如果該選項設置為True,內核不會記錄這種警告信息。默認值為False。
(1) Jiffie: 內核使用的內部時間單位,在i386系統上大小為1/100s,在Alpha中為1/1024S。在/usr/include/asm/param.h中的HZ定義有特定系統的值。
conf/interface/*:
conf/all/*是特定的,用來修改所有介面的設置,is special and changes the settings for all interfaces.
Change special settings per interface.
log_martians - 布爾類型
記錄帶有不允許的地址的數據報到內核日誌中。
accept_redirects - 布爾類型
收發接收ICMP重定向消息。對於主機來說默認為True,對於用作路由器時默認值為False。
forwarding - 布爾類型
在該介面打開轉發功能
mc_forwarding - 布爾類型
是否進行多播路由。只有內核編譯有CONFIG_MROUTE並且有路由服務程序在運行該參數才有效。
proxy_arp - 布爾類型
打開proxy arp功能。
shared_media - 布爾類型
發送(路由器)或接收(主機) RFC1620 共享媒體重定向。覆蓋ip_secure_redirects的值。默認為True。
secure_redirects - 布爾類型
僅僅接收發給默認網關列表中網關的ICMP重定向消息,默認值是TRUE。
send_redirects - 布爾類型
如果是router,發送重定向消息,默認值是TRUE
bootp_relay - 布爾類型
接收源地址為0.b.c.d,目的地址不是本機的數據報。用來支持BOOTP轉發服務進程,該進程將捕獲並轉發該包。默認為False,目前還沒有實現。
accept_source_route - 布爾類型
接收帶有SRR選項的數據報。對於主機來說默認為False,對於用作路由器時默認值為True。
rp_filter 參數類型
1 - 通過反向路徑回溯進行源地址驗證(在RFC1812中定義)。對於單穴主機和stub網路路由器推薦使用該選項。
0 - 不通過反向路徑回溯進行源地址驗證。
默認值為0。某些發布在啟動時自動將其打開。