導航:首頁 > 編程系統 > linux系統調用chm

linux系統調用chm

發布時間:2023-01-29 16:31:59

❶ 如何在linux內核里增加一個系統調用

一、Linux0.11下添加系統調用:x0dx0ax0dx0a我在bochs2.2.1中對linux0.11內核添加了一個新的系統調用,步驟如下: x0dx0a1./usr/src/linux/include/unistd.h中添加:#define __NR_mytest 87 x0dx0a然後在下面聲明函數原型:int mytest(); x0dx0a2./usr/src/linux/include/linux/sys.h中添加:extern int sys_mytest(); x0dx0a然後在sys_call_table中最後加上sys_mytest; x0dx0a3.在/usr/src/linux/kernel/sys.c中添加函數實現如下: x0dx0aint sys_mytest(){ x0dx0aprintk("This is a test!"); x0dx0areturn 123; x0dx0a} x0dx0a4.在/usr/src/linux/kernel/system_call.s中對系統調用號加1(原來是86改成了87) x0dx0a5.然後到/usr/src/linux目錄下編譯內核make clean; make Image x0dx0a6. cp /usr/src/linux/include/unistd.h /usr/include/unistd.h x0dx0a7. reset bochs x0dx0a8. 在/usr/root中生成test.c文件如下: x0dx0a#define __LIBRARY__ x0dx0a#include x0dx0a_syscall0(int,mytest) x0dx0aint main(){ x0dx0aint a; x0dx0aa = mytest(); x0dx0aprintf("%d", a); x0dx0areturn 0; x0dx0a} x0dx0a9.然後gcc test.c編譯之後運行a.out,前面所有步驟都通過,但是每次調用都是返回-1,然後我查過errno為1(表示操作不允許),就不知道為什麼了? x0dx0a系統知道的高手們能夠告知一下,不勝感激!這個問題困擾我很久了! x0dx0ax0dx0a二、新Linux內核添加系統調用x0dx0ax0dx0a如何在Linux系統中添加新的系統調用x0dx0a系統調用是應用程序和操作系統內核之間的功能介面。其主要目的是使得用戶可以使用操作系統提供的有關設備管理、輸入/輸入系統、文件系統和進程式控制制、通信以及存儲管理等方面的功能,而不必了解系統程序的內部結構和有關硬體細節,從而起到減輕用戶負擔和保護系統以及提高資源利用率的作用。x0dx0ax0dx0aLinux操作系統作為自由軟體的代表,它優良的性能使得它的應用日益廣泛,不僅得到專業人士的肯定,而且商業化的應用也是如火如荼。在Linux中,大部分的系統調用包含在Linux的libc庫中,通過標準的C函數調用方法可以調用這些系統調用。那麼,對Linux的發燒友來說,如何在Linux中增加新的系統調用呢? x0dx0a1 Linux系統調用機制x0dx0ax0dx0a在Linux系統中,系統調用是作為一種異常類型實現的。它將執行相應的機器代碼指令來產生異常信號。產生中斷或異常的重要效果是系統自動將用戶態切換為核心態來對它進行處理。這就是說,執行系統調用異常指令時,自動地將系統切換為核心態,並安排異常處理程序的執行。Linux用來實現系統調用異常的實際指令是:x0dx0ax0dx0aInt $0x80x0dx0ax0dx0a這一指令使用中斷/異常向量號128(即16進制的80)將控制權轉移給內核。為達到在使用系統調用時不必用機器指令編程,在標準的C語言庫中為每一系統調用提供了一段短的子程序,完成機器代碼的編程工作。事實上,機器代碼段非常簡短。它所要做的工作只是將送給系統調用的參數載入到CPU寄存器中,接著執行int $0x80指令。然後運行系統調用,系統調用的返回值將送入CPU的一個寄存器中,標準的庫子程序取得這一返回值,並將它送回用戶程序。x0dx0ax0dx0a為使系統調用的執行成為一項簡單的任務,Linux提供了一組預處理宏指令。它們可以用在程序中。這些宏指令取一定的參數,然後擴展為調用指定的系統調用的函數。x0dx0ax0dx0a這些宏指令具有類似下面的名稱格式:x0dx0ax0dx0a_syscallN(parameters)x0dx0ax0dx0a其中N是系統調用所需的參數數目,而parameters則用一組參數代替。這些參數使宏指令完成適合於特定的系統調用的擴展。例如,為了建立調用setuid()系統調用的函數,應該使用:x0dx0ax0dx0a_syscall1( int, setuid, uid_t, uid )x0dx0ax0dx0asyscallN( )宏指令的第1個參數int說明產生的函數的返回值的類型是整型,第2個參數setuid說明產生的函數的名稱。後面是系統調用所需要的每個參數。這一宏指令後面還有兩個參數uid_t和uid分別用來指定參數的類型和名稱。x0dx0ax0dx0a另外,用作系統調用的參數的數據類型有一個限制,它們的容量不能超過四個位元組。這是因為執行int $0x80指令進行系統調用時,所有的參數值都存在32位的CPU寄存器中。使用CPU寄存器傳遞參數帶來的另一個限制是可以傳送給系統調用的參數的數目。這個限制是最多可以傳遞5個參數。所以Linux一共定義了6個不同的_syscallN()宏指令,從_syscall0()、_syscall1()直到_syscall5()。x0dx0ax0dx0a一旦_syscallN()宏指令用特定系統調用的相應參數進行了擴展,得到的結果是一個與系統調用同名的函數,它可以在用戶程序中執行這一系統調用。x0dx0a2 添加新的系統調用 x0dx0a如果用戶在Linux中添加新的系統調用,應該遵循幾個步驟才能添加成功,下面幾個步驟詳細說明了添加系統調用的相關內容。x0dx0ax0dx0a(1) 添加源代碼x0dx0ax0dx0a第一個任務是編寫加到內核中的源程序,即將要加到一個內核文件中去的一個函數,該函數的名稱應該是新的系統調用名稱前面加上sys_標志。假設新加的系統調用為mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代碼,如下所示:x0dx0aasmlinkage int sys_mycall(int number) x0dx0a{ x0dx0areturn number; x0dx0a}x0dx0a作為一個最簡單的例子,我們新加的系統調用僅僅返回一個整型值。x0dx0ax0dx0a(2) 連接新的系統調用x0dx0ax0dx0a添加新的系統調用後,下一個任務是使Linux內核的其餘部分知道該程序的存在。為了從已有的內核程序中增加到新的函數的連接,需要編輯兩個文件。x0dx0ax0dx0a在我們所用的Linux內核版本(RedHat 6.0,內核為2.2.5-15)中,第一個要修改的文件是:x0dx0ax0dx0a/usr/src/linux/include/asm-i386/unistd.hx0dx0ax0dx0a該文件中包含了系統調用清單,用來給每個系統調用分配一個唯一的號碼。文件中每一行的格式如下:x0dx0ax0dx0a#define __NR_name NNNx0dx0ax0dx0a其中,name用系統調用名稱代替,而NNN則是該系統調用對應的號碼。應該將新的系統調用名稱加到清單的最後,並給它分配號碼序列中下一個可用的系統調用號。我們的系統調用如下:x0dx0ax0dx0a#define __NR_mycall 191x0dx0ax0dx0a系統調用號為191,之所以系統調用號是191,是因為Linux-2.2內核自身的系統調用號碼已經用到190。x0dx0ax0dx0a第二個要修改的文件是:x0dx0ax0dx0a/usr/src/linux/arch/i386/kernel/entry.Sx0dx0ax0dx0a該文件中有類似如下的清單:x0dx0a.long SYMBOL_NAME()x0dx0ax0dx0a該清單用來對sys_call_table[]數組進行初始化。該數組包含指向內核中每個系統調用的指針。這樣就在數組中增加了新的內核函數的指針。我們在清單最後添加一行:x0dx0a.long SYMBOL_NAME(sys_mycall)x0dx0ax0dx0a(3) 重建新的Linux內核x0dx0ax0dx0a為使新的系統調用生效,需要重建Linux的內核。這需要以超級用戶身份登錄。x0dx0a#pwd x0dx0a/usr/src/linux x0dx0a#x0dx0ax0dx0a超級用戶在當前工作目錄(/usr/src/linux)下,才可以重建內核。x0dx0ax0dx0a#make config x0dx0a#make dep x0dx0a#make clearn x0dx0a#make bzImagex0dx0ax0dx0a編譯完畢後,系統生成一可用於安裝的、壓縮的內核映象文件:x0dx0ax0dx0a/usr/src/linux/arch/i386/boot/bzImage x0dx0a(4) 用新的內核啟動系統 x0dx0a要使用新的系統調用,需要用重建的新內核重新引導系統。為此,需要修改/etc/lilo.conf文件,在我們的系統中,該文件內容如下:x0dx0ax0dx0aboot=/dev/hda x0dx0amap=/boot/map x0dx0ainstall=/boot/boot.b x0dx0aprompt x0dx0atimeout=50 x0dx0ax0dx0aimage=/boot/vmlinuz-2.2.5-15 x0dx0alabel=linux x0dx0aroot=/dev/hdb1 x0dx0a read-only x0dx0ax0dx0aother=/dev/hda1 x0dx0alabel=dos x0dx0atable=/dev/hadx0dx0ax0dx0a首先編輯該文件,添加新的引導內核:x0dx0aimage=/boot/bzImage-new x0dx0alabel=linux-new x0dx0aroot=/dev/hdb1 x0dx0aread-onlyx0dx0ax0dx0a添加完畢,該文件內容如下所示:x0dx0aboot=/dev/hda x0dx0amap=/boot/map x0dx0ainstall=/boot/boot.b x0dx0aprompt x0dx0atimeout=50 x0dx0ax0dx0aimage=/boot/bzImage-new x0dx0alabel=linux-new x0dx0aroot=/dev/hdb1 x0dx0aread-only x0dx0ax0dx0aimage=/boot/vmlinuz-2.2.5-15 x0dx0alabel=linux x0dx0aroot=/dev/hdb1 x0dx0aread-only x0dx0ax0dx0aother=/dev/hda1 x0dx0alabel=dos x0dx0atable=/dev/hdax0dx0ax0dx0a這樣,新的內核映象bzImage-new成為預設的引導內核。為了使用新的lilo.conf配置文件,還應執行下面的命令:x0dx0a#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-newx0dx0ax0dx0a其次配置lilo:x0dx0ax0dx0a# /sbin/lilox0dx0ax0dx0a現在,當重新引導系統時,在boot:提示符後面有三種選擇:linux-new 、linux、dos,新內核成為預設的引導內核。x0dx0a至此,新的Linux內核已經建立,新添加的系統調用已成為操作系統的一部分,重新啟動Linux,用戶就可以在應用程序中使用該系統調用了。x0dx0ax0dx0a(5)使用新的系統調用x0dx0ax0dx0a在應用程序中使用新添加的系統調用mycall。同樣為實驗目的,我們寫了一個簡單的例子xtdy.c。x0dx0ax0dx0a/* xtdy.c */ x0dx0a#include x0dx0a_syscall1(int,mycall,int,ret) x0dx0amain() x0dx0a{ x0dx0aprintf("%d \n",mycall(100)); x0dx0a}x0dx0a編譯該程序:x0dx0a# cc -o xtdy xtdy.cx0dx0a執行:x0dx0a# xtdyx0dx0a結果:x0dx0a# 100x0dx0a注意,由於使用了系統調用,編譯和執行程序時,用戶都應該是超級用戶身份。

❷ linux chm文件怎麼打開

Linux上有很多打開chm幫助文檔文件的軟體,這里推薦一個xchm,我自己現在就在用,這個軟體打開chm文件的效果和在Windows上的顯示效果差不多。

❸ chm格式在LINUX系統下怎麼轉換

不用轉換直接用下面的方法就可以

系統環境是as4.0的

在linux下打開chm格式文件的方式有多種,如:chmsee,chm-vewer等,但這些軟體的安裝要很多的依賴包,安裝起來太煩,現在我向大家介紹一下firefox的chmreader插件,可通過fireforx打開chm文件,安裝與使用都很方便。

1、從http://sourceforge.net/projects/chmreader下載chmreader.

2、從firefox中打開下載的xpi文件.

3、重新啟動firefox就安裝了chmreader插件.

4、打開chm文件(通過file中的open CHM files)
此文件存放到目錄中
作者:宗國鋒

❹ linux下用java語言怎樣打開一個chm文件

可以先安裝gnochm,然後再java裡面Runtime.getRuntime().exec("gnochm filePath)就可以打開了,但是要注意chm文檔裡面不能有太多錯誤,否則可能卡死。

❺ linux 下用設么看chm格式的文檔

gnome桌面可以用gnochm
kde可以用kchmviewer
xchm是基於wx*框架的。
我比較喜歡xchm.

然後也可以用我們國產的chmsee。

❻ linux red hat 怎麼打開 chm

如果是KDE桌面環境,默認安裝了kchmviewer,因此可以直接雙擊打開。
Gnome下需要安裝: sudo apt-get kchmviewer
如果內不是Debian/Ubuntu,需要先下載,然後根據容README安裝,kchmviewer依賴於qt4,因此需要先安裝 libqwt5-qt4和 libqwt5-qt4-dev
安裝後可以通過命令行輸入 kchmviewer yourchmfile.chm 打開chm文件,或者在文件圖標上右擊選擇Open with other Application…然後點擊Use a custom command,填kchmviewer,之後就可以雙擊打開chm文件了。

❼ linux下打開chm文件

可能是你不夠許可權打開所要看的chm文件,也可能是不夠許可權進入文件所在目錄內,看下面的網站容弄清楚許可權的問題後,你就知道如何解決了.
http://linux.vbird.org/linux_basic/0210filepermission.php

❽ linux下如何閱讀.chm格式的文件

chmsee和chm reader都行,下面的文章有詳細介紹:
http://www.linux-wiki.cn/index.php/Linux%E4%B8%AD%E9%98%85%E8%AF%BBchm%E6%96%87%E4%BB%B6

❾ 我安裝了linux,但不能閱讀chm格式的電子書,不知道有沒有好的辦法可以直接在linux下閱讀這些文件

這個問題已經有解決方法了,xCHM是一個可以運行在Unix平台(包括Linux、Solaris等)下的CHM閱讀軟專件,現在還能夠在屬MAC OS下運行。登錄http://xchm.sourceforge.net,你可以從中獲取最新版的軟體和源代碼,安裝後就可以在Linux下直接閱讀CHM格式的電子書了。
上海仕灃為您服務!

閱讀全文

與linux系統調用chm相關的資料

熱點內容
外語電影翻譯成普通話的網站 瀏覽:381
別克怎麼用原廠電腦編程 瀏覽:125
半月談app是什麼意思 瀏覽:788
廣州正大數據恢復 瀏覽:80
什麼app軟體上買汽車減震器 瀏覽:375
在線免費的網站你懂得 瀏覽:611
linux服務加入開機啟動 瀏覽:115
手機百度app如何上傳文件 瀏覽:672
韓劇電影版 瀏覽:887
瀟湘書院sp 瀏覽:324
林正英下載 瀏覽:511
帶著智能手機闖盪異世界 小說 瀏覽:901
男同情愛電影 瀏覽:913
vb監控文件夾 瀏覽:850
台灣丈夫電影 瀏覽:660
戴爾筆記本為什麼連不上無線網路 瀏覽:582
台灣的電影電視劇都用什麼網站 瀏覽:238
米思齊編程土壤濕度感測器怎麼用 瀏覽:208
大寸度愛情電影 瀏覽:213
2015年全球大數據總量 瀏覽:63

友情鏈接