Linux核心編程實戰經驗談

來源:互聯網
上載者:User
Linux核心編程實戰經驗談

李豔彬

01-7-27 上午 10:45:17

當前,在國產自主著作權的作業系統這面大旗的倡導下,IT界掀起了一浪高過一浪的Linux編程熱潮。Linux以其源碼開放、配置靈活等不可多得的優越性吸引著越來越多的編程愛好者深入Linux的核心開發。筆者近來實踐過一個Linux的即時化改造課題任務,積累了一點Linux核心編程的實戰經驗,在這裡想就編譯核心、增加系統調用等方面的問題和感興趣的愛好者共做切磋。
編譯核心
在Linux編程的實踐中,經常會遇到編譯核心的問題。為什麼要編譯核心呢?其一,可以定製核心模組。Linux引入了“動態載入模組”的概念,使使用者可以把驅動程式以及非必要的核心功能代碼編譯成“模組”,由系統在需要時動態載入,不需要時自動卸載,從而提高了系統的效率和靈活性。其二,可以定製系統功能。當添加某種裝置時、增加系統功能時、系統暴露出缺陷需要打“補丁”時,當新版核心出現準備用來升級時,編譯核心是不可避免的。而且,編譯核心正是Linux專屬的“系統級DIY”的魅力所在!
好,現在就讓我們一起開始——編譯核心!
(1)安裝源碼
首先要確定自己Linux系統是否已安裝了核心源碼:
# rpm -q kernel-source
kernel_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
開始配置核心(如果對各選項不是很熟悉的話,建議按斷行符號鍵):
# 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.new
lable=new
root=/dev/hda3
read-only
重寫LILO的開機磁區,使改動生效:
# lilo
(5)重啟系統
# reboot
當重啟後出現 lilo: 提示時輸入新核心的標號(按TAB鍵可顯示所有的標號):
lilo: new
OK!!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
#include
extern 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
執行測試程式:
# ./test
Its my syscall function!
i=0, syscall success!
ok!!!增加系統調用函數成功!
以上步驟在pentium Ⅲ/64M/20G、Red Hat Linux 6.0(2.2.5-15)機上測試通過。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.