Linux核心程式設計實戰經驗談(轉)
Linux核心程式設計實戰經驗談(轉)[@more@]藍森林 2001年6月16日 18:09作 者: 李豔彬當前,在國產自主版權的作業系統這面大旗的倡導下,IT界掀起了一浪高過一浪的Linux程式設計熱潮。Linux以其原始碼開放、配置靈活等不可多得的優越性吸引著越來越多的程式設計愛好者深入Linux的核心開發。筆者近來實踐過一個Linux的實時化改造課題任務,積累了一點Linux核心程式設計的實戰經驗,在這裡想就編譯核心、增加系統呼叫等方面的問題和感興趣的愛好者共做切磋。編譯核心在Linux程式設計的實踐中,經常會遇到編譯核心的問題。為什麼要編譯核心呢?其一,可以定製核心模組。Linux引入了“動態載入模組”的概念,使使用者可以把驅動程式以及非必要的核心功能程式碼編譯成“模組”,由系統在需要時動態載入,不需要時自動解除安裝,從而提高了系統的效率和靈活性。其二,可以定製系統功能。當新增某種裝置時、增加系統功能時、系統暴露出缺陷需要打“補丁”時,當新版核心出現準備用來升級時,編譯核心是不可避免的。而且,編譯核心正是Linux獨有的“系統級DIY”的魅力所在!好,現在就讓我們一起開始——編譯核心!(1)安裝原始碼首先要確定自己Linux系統是否已安裝了核心原始碼:# rpm -q kernel-sourcekernel_source-2.2.5-16如果證實沒有安裝,則需要找來安裝盤或從網上下載kernel-source-2.2.5-15.i386.rpm並安裝:# rpm -Uhv kernel-source-2.2.5-15.i386.rpm如果是升級到新版本,則需要找來升級包(linux-2.2.16.tar.gz),自己解壓安裝:# cd /usr/src進入原始碼目錄。# rm -rf linux刪除以前的連結。# tar xzvf linux-2.2.16.tar.gz解壓升級包。# ln -s linux-2.2.16 linux重建目錄連結。(2)配置核心進入核心原始碼所在目錄:# cd /usr/src/linux先清除多餘的(一般是以前編譯生成的)檔案:# make mrproper開始配置核心(如果對各選項不是很熟悉的話,建議按Enter鍵):# make config(3)編譯核心清除以前生成的目標檔案及其他檔案:# make clean理順各檔案之間的依存關係:# make dep編譯壓縮的核心:# make bzImage編譯模組:# make modules-install(4)裝新核心將新核心檔案複製到用於存放啟動檔案的 /boot目錄:# cp /usr/src/linux/System.map /boot/System.new# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz.new進入啟動目錄:# cd /boot給新核心建立連結:# rm System.map# ln -s System.new System.map# rm vmlinuz# ln -s vmlinuz.new vmlinuz編輯LILO的配置檔案/etc/lilo.conf ,使LILO能啟動新核心:# vi /etc/lilo.conf在檔案末加入以下部分:(後兩行內容要與舊核心相應行保持一致)image=/boot/vmlinuz.newlable=newroot=/dev/hda3read-only重寫LILO的啟動扇區,使改動生效:# lilo(5)重啟系統# reboot當重啟後出現 lilo: 提示時輸入新核心的標號(按TAB鍵可顯示所有的標號):lilo: newOK!!boot new...........一切執行正常,新核心引導成功!以上步驟在pentium Ⅲ/64M/20G、Red Hat Linux 6.0(2.2.5-15)機上測試透過。增加系統呼叫在實際程式設計中,尤其是當我們需要增加或完善系統功能的時候,我們經常會用到系統呼叫函式。系統呼叫函式通常由使用者程式在使用者態下呼叫,核心透過system_call 函式響應系統呼叫產生的軟中斷,在正確訪問核心棧、系統呼叫開關表之後陷入到作業系統核心中進行處理。系統呼叫是使用者程式由使用者態切換到核心態的一種常見方式。利用編寫系統呼叫函式來直接呼叫了部分作業系統核心程式碼,也是Linux核心程式設計者必修之功。下面筆者以在Linux中建立一個名為print_info的系統呼叫函式為例,來說明如何為核心增加系統呼叫。需要以下幾個基本步驟:1、編寫系統呼叫函式編輯sys.c檔案:# cd /usr/src/linux/kernel# vi sys.c在檔案的最後增加一個系統呼叫函式:asmlinkage int sys_print_info(int testflag){printk(" Its my syscall function!n");return 0;}該函式有一個int型入口引數testflag,並返回整數0。2、修改與系統呼叫號相關的檔案編輯入口表檔案:# cd /usr/src/linux/arch/i386/kernel# vi entry.S把函式的入口地址加到sys_call_table表中:arch/i386/kernel/entry.S中的最後幾行原始碼修改前為:.......long SYMBOL_NAME(sys_sendfile).long SYMBOL_NAME(sys_ni_syscall) /* streams1 */.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */.long SYMBOL_NAME(sys_vfork) /* 190 */rept NR_syscalls-190.long SYMBOL_NAME(sys_ni_syscall).endr修改後為:.......long SYMBOL_NAME(sys_sendfile).long SYMBOL_NAME(sys_ni_syscall) /* streams1 */.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */.long SYMBOL_NAME(sys_vfork) /* 190 */.long SYMBOL_NAME(sys_print_info) /* added by I */.rept NR_syscalls-191.endr修改相應的標頭檔案:# cd /usr/src/linux/include/asm# vi unistd.h把增加的sys_call_table表項所對應的向量,在include/asm/unistd.h中進行必要申明,以供使用者程式和其他系統程式查詢或呼叫。#define __NR_putpmsg 189#define __NR_vfork 190#define __NR_print_info 191 /* added by I */3、編譯核心,再重啟動4、測試編寫使用者測試程式(test.c):# vi test.c#include#includeextern int errno;_syscall1(int,print_info,int,testflag)main(){int i;i= print_info(0);if(i==0)printf("i=%d , syscall success!n",i);}如果要在使用者程式中使用系統呼叫函式,那麼在主函式main前必須申明呼叫_syscall,其中1 表示該系統呼叫只有一個入口引數,第一個int 表示系統呼叫的返回值為整型,print_info為系統呼叫函式名,第二個int 表示入口引數的型別為整型,testflag為入口引數名。編譯測試程式:# gcc -o test test.c執行測試程式:# ./testIts my syscall function!i=0, syscall success!ok!!!增加系統呼叫函式成功!以上步驟在pentium Ⅲ/64M/20G、Red Hat Linux 6.0(2.2.5-15)機上測試透過。摘自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-944781/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 剛轉行1年測試新手:學習Python程式設計經驗實戰分享Python程式設計
- 扎心!一個3年經驗的程式設計師經驗之談!程式設計師
- linux核心設計與實現Linux
- 轉載:Kubernetes實戰——談談微博應對春晚等突發峰值流量的經驗
- 12年經驗老程式設計師5次轉型程式設計師
- 三年開發程式設計師的職場經驗談程式設計師
- 遊戲開發經驗談(二):對戰類全球服遊戲的設計與實現遊戲開發
- Linux命令列與shell指令碼程式設計入門經驗Linux命令列指令碼程式設計
- 程式設計師的管理經驗程式設計師
- 程式設計師面試經驗程式設計師面試
- 《Linux核心設計與實現》學習【5】—— 核心同步Linux
- 程式設計實驗五程式設計
- 程式設計實驗4程式設計
- c++ 程式通用多執行緒單例設計 c++ web 框架設計經驗談C++執行緒單例Web框架
- socket程式設計實戰程式設計
- Java實驗二:類程式設計實驗Java程式設計
- 策劃經驗談:遊戲策劃設計的是體驗遊戲
- 對話Games Vessel CEO王玥:暢談出海實戰經驗GAM
- 計算機課程程式設計經驗分享計算機程式設計
- 前端開發程式設計師如何用1年獲得大廠3年實戰經驗?前端程式設計師
- DOE - 最經濟的實驗設計
- 實戰Spring Boot 2.0 Reactive程式設計系列 - WebFlux初體驗Spring BootReact程式設計WebUX
- 新人都能看懂的PVE戰鬥設計筆記(實戰經驗總結)筆記
- 經驗談
- AOP程式設計實戰-AspectJ程式設計
- Apache Kafka 程式設計實戰ApacheKafka程式設計
- 實驗3 轉移指令跳轉原理及其簡單應用程式設計程式設計
- NPDP|程式設計師轉產品經理好轉嗎?程式設計師
- windows核心程式設計--程式Windows程式設計
- 程式設計漫談(二十):如何自學程式設計及Java、上手真實開發及轉行程式設計師的建議Java行程程式設計師
- Linux學習路線及網路程式設計經典書籍(轉載)Linux程式設計
- MPP平臺實施工具,實施經驗+銀行資料倉儲模型建設經驗泛談模型
- Elasticsearch 實戰經驗總結Elasticsearch
- Go實戰 21 | 網路程式設計:玩轉 RESTful API 服務Go程式設計RESTAPI
- windows核心程式設計--核心物件Windows程式設計物件
- 經驗談集
- 《榮耀戰魂》的環境設計製作經驗
- 淺談DOE-實驗設計五步法
- 10個程式設計好習慣:優秀程式設計師的經驗分享程式設計師