第10章linux系統(tǒng)調(diào)用接口ppt課件_第1頁
第10章linux系統(tǒng)調(diào)用接口ppt課件_第2頁
第10章linux系統(tǒng)調(diào)用接口ppt課件_第3頁
第10章linux系統(tǒng)調(diào)用接口ppt課件_第4頁
第10章linux系統(tǒng)調(diào)用接口ppt課件_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 第第1010章章 系統(tǒng)調(diào)用接口系統(tǒng)調(diào)用接口系統(tǒng)調(diào)用接口的功能系統(tǒng)調(diào)用接口的功能內(nèi)核為用戶與硬件設(shè)備內(nèi)核為用戶與硬件設(shè)備(例如:例如:CPU,磁,磁盤,打印機等盤,打印機等)交互提供了一個接口。該交互提供了一個接口。該接口被稱為系統(tǒng)調(diào)用接口。它的功能是:接口被稱為系統(tǒng)調(diào)用接口。它的功能是:v運用戶編程更加容易,把用戶從學(xué)習(xí)硬件運用戶編程更加容易,把用戶從學(xué)習(xí)硬件設(shè)備的低級編程特性中解放出來。設(shè)備的低級編程特性中解放出來。v可以極大提高系統(tǒng)的平安性,由于內(nèi)核接可以極大提高系統(tǒng)的平安性,由于內(nèi)核接納用戶懇求之前,可以檢查其合法性。納用戶懇求之前,可以檢查其合法性。v運用系統(tǒng)調(diào)用接口使得程序具有良好

2、的可運用系統(tǒng)調(diào)用接口使得程序具有良好的可移植性。移植性。10.1 API10.1 API和系統(tǒng)調(diào)用和系統(tǒng)調(diào)用UNIX操作系統(tǒng)為編程員提供了運用編操作系統(tǒng)為編程員提供了運用編程接口程接口(API)。在在API提供的提供的libc規(guī)范函數(shù)庫中,一部分規(guī)范函數(shù)庫中,一部分是用戶態(tài)的庫函數(shù),另一部分是系統(tǒng)調(diào)是用戶態(tài)的庫函數(shù),另一部分是系統(tǒng)調(diào)用。庫函數(shù)和系統(tǒng)調(diào)用的區(qū)別是:用。庫函數(shù)和系統(tǒng)調(diào)用的區(qū)別是:庫函數(shù)是一個函數(shù)定義,闡明如何獲得一個給庫函數(shù)是一個函數(shù)定義,闡明如何獲得一個給定的效力,庫函數(shù)代碼不屬于內(nèi)核。定的效力,庫函數(shù)代碼不屬于內(nèi)核。系統(tǒng)調(diào)用是經(jīng)過軟件中斷系統(tǒng)調(diào)用是經(jīng)過軟件中斷(int指令指令)

3、向內(nèi)核發(fā)出向內(nèi)核發(fā)出的一個明確效力懇求,提供效力的代碼屬于內(nèi)的一個明確效力懇求,提供效力的代碼屬于內(nèi)核代碼。核代碼。為了區(qū)別庫函數(shù)和系統(tǒng)調(diào)用,為了區(qū)別庫函數(shù)和系統(tǒng)調(diào)用,libc規(guī)范規(guī)范C庫庫中,每個系統(tǒng)調(diào)用都有一個封裝例程中,每個系統(tǒng)調(diào)用都有一個封裝例程(wrapper routine)。運用程序經(jīng)過這個封裝例程來援用運用程序經(jīng)過這個封裝例程來援用API函函數(shù)庫中的系統(tǒng)調(diào)用。數(shù)庫中的系統(tǒng)調(diào)用。用戶執(zhí)行一個系統(tǒng)調(diào)用時,內(nèi)核經(jīng)過用戶執(zhí)行一個系統(tǒng)調(diào)用時,內(nèi)核經(jīng)過 (int 0 x80)軟件中斷或調(diào)用門從用戶空間進入內(nèi)軟件中斷或調(diào)用門從用戶空間進入內(nèi)核空間,這就是所謂的方式轉(zhuǎn)換。核空間,這就是所謂的方

4、式轉(zhuǎn)換。CPU切換到內(nèi)核態(tài)開場執(zhí)行與系統(tǒng)調(diào)用相切換到內(nèi)核態(tài)開場執(zhí)行與系統(tǒng)調(diào)用相對應(yīng)內(nèi)核函數(shù)。執(zhí)行終了后內(nèi)核將執(zhí)行結(jié)對應(yīng)內(nèi)核函數(shù)。執(zhí)行終了后內(nèi)核將執(zhí)行結(jié)果和控制權(quán)還給用戶進程。果和控制權(quán)還給用戶進程。圖圖10-6給出調(diào)用系統(tǒng)調(diào)用的表示圖。給出調(diào)用系統(tǒng)調(diào)用的表示圖。調(diào)用一個系統(tǒng)調(diào)用表示圖調(diào)用一個系統(tǒng)調(diào)用表示圖 printf() 在運用程序中在運用程序中調(diào)用系統(tǒng)調(diào)用調(diào)用系統(tǒng)調(diào)用printf() int 0 x80 在在libclibc庫中庫中的封裝例程的封裝例程用戶態(tài)用戶態(tài)system_call: sys_printf() ret_from_sys_call iretsys_printf() 內(nèi)核態(tài)

5、內(nèi)核態(tài)系統(tǒng)調(diào)用途置系統(tǒng)調(diào)用途置機制機制系統(tǒng)調(diào)用效系統(tǒng)調(diào)用效力例程力例程圖圖10-6 系統(tǒng)調(diào)用表示圖系統(tǒng)調(diào)用表示圖10.2 10.2 方式轉(zhuǎn)換的硬件處方式轉(zhuǎn)換的硬件處置置在在i386中,完成系統(tǒng)調(diào)用接口方式轉(zhuǎn)換中,完成系統(tǒng)調(diào)用接口方式轉(zhuǎn)換的硬件是圈套門和調(diào)用門,軟件是的硬件是圈套門和調(diào)用門,軟件是int 0 x80指令或調(diào)用指令指令或調(diào)用指令下面分析圈套門技術(shù)。下面分析圈套門技術(shù)。注:調(diào)用門技術(shù)請讀者見教材注:調(diào)用門技術(shù)請讀者見教材P227由由于通常情況下,在于通常情況下,在Linux內(nèi)核沒有運用調(diào)內(nèi)核沒有運用調(diào)用門這里不做引見。用門這里不做引見。10.2.1 10.2.1 圈套門方式轉(zhuǎn)換圈套門

6、方式轉(zhuǎn)換系統(tǒng)調(diào)用屬于軟件中斷。系統(tǒng)調(diào)用屬于軟件中斷。i386維護方式下的軟件中斷運用圈套門描維護方式下的軟件中斷運用圈套門描畫符。畫符。運用圈套門執(zhí)行軟件中斷,不會影響運用圈套門執(zhí)行軟件中斷,不會影響硬件中斷懇求。硬件中斷懇求。Linux為系統(tǒng)調(diào)用設(shè)置的圈套門向量號是為系統(tǒng)調(diào)用設(shè)置的圈套門向量號是128,即,即16進制的進制的“80H。i386運用的圈套運用的圈套(trap)指令是指令是int $0 x80。圖圖10-1給出圈套門進展方式轉(zhuǎn)換的表示圖。給出圈套門進展方式轉(zhuǎn)換的表示圖。系統(tǒng)調(diào)用的效力例程系統(tǒng)調(diào)用的效力例程 system_call()處置程序處置程序 中斷描畫符表中斷描畫符表 of

7、fset dpl 01111 selector offset GATE 0baseaddr limitdpl bseaddr baseaddr limit IDT的基址的基址 限長限長selector base addr limit中斷描畫符存放器中斷描畫符存放器IDTRCS(代碼段存放器代碼段存放器)代碼段描畫符高速緩存代碼段描畫符高速緩存 system_call()起始地址起始地址 物理存儲器物理存儲器一個門描一個門描畫符占畫符占8B。在在GDT或或LDT中的中的代碼段描代碼段描畫符。畫符。圈套門圈套門 80H圖圖10-1 圈套門方式轉(zhuǎn)換圖圈套門方式轉(zhuǎn)換圖10.3 10.3 系統(tǒng)調(diào)用接口系

8、統(tǒng)調(diào)用接口i386維護方式下,系統(tǒng)調(diào)用接口由軟件維護方式下,系統(tǒng)調(diào)用接口由軟件和硬件共同協(xié)作完成。和硬件共同協(xié)作完成。下面講解系統(tǒng)調(diào)用途置程序下面講解系統(tǒng)調(diào)用途置程序system_call的任務(wù)原理。的任務(wù)原理。10.3.1 10.3.1 初始化系統(tǒng)調(diào)初始化系統(tǒng)調(diào)用用系統(tǒng)啟動內(nèi)核初始化期間調(diào)用系統(tǒng)啟動內(nèi)核初始化期間調(diào)用trap_init函數(shù)建立函數(shù)建立IDT表中向量號為表中向量號為128對應(yīng)的表對應(yīng)的表項項(8個字節(jié)的圈套門描畫符個字節(jié)的圈套門描畫符)。代碼如下:。代碼如下:set_system_gate(SYSCALL_VECTOR,&system_call);#define SYSCALL

9、_VECTOR0 x80上面兩行代碼等效于下面的語句:上面兩行代碼等效于下面的語句:set_system_gate(0 x80, &system_call);set_system_gate()初始化初始化80H開場的開場的8個字個字節(jié)的圈套門描畫符。步驟如下:節(jié)的圈套門描畫符。步驟如下:將內(nèi)核代碼段選擇符將內(nèi)核代碼段選擇符_KERNEL_CS裝入裝入80H圈套門的圈套門的2、3兩個字節(jié)。兩個字節(jié)。將將system_call()可執(zhí)行代碼的第一條指令可執(zhí)行代碼的第一條指令偏移量裝入偏移量裝入80H圈套門的圈套門的0、1、6和和7共共4個字節(jié)中。個字節(jié)中。將將15添入添入80H圈套門類型號字段,闡

10、明這圈套門類型號字段,闡明這是一個圈套門。是一個圈套門。將門描畫符將門描畫符DPL字段設(shè)置為字段設(shè)置為3,允許用戶,允許用戶進程調(diào)用進程調(diào)用system_call()程序。程序。10.3.2 10.3.2 系統(tǒng)調(diào)用執(zhí)行流程系統(tǒng)調(diào)用執(zhí)行流程 在封裝例程中含有在封裝例程中含有int $0 x80匯編指令代碼匯編指令代碼 int $0 x80使該調(diào)用進入內(nèi)核:使該調(diào)用進入內(nèi)核:system_call() 該系統(tǒng)調(diào)用被執(zhí)行,并前往執(zhí)行結(jié)果該系統(tǒng)調(diào)用被執(zhí)行,并前往執(zhí)行結(jié)果 該系統(tǒng)調(diào)用由規(guī)范該系統(tǒng)調(diào)用由規(guī)范C庫的封裝例程宏來引導(dǎo)庫的封裝例程宏來引導(dǎo) 用戶發(fā)出一個系統(tǒng)調(diào)用的懇求用戶發(fā)出一個系統(tǒng)調(diào)用的懇求 由

11、由system_call找到指定的系統(tǒng)調(diào)用函數(shù)找到指定的系統(tǒng)調(diào)用函數(shù)圖圖10-4 系統(tǒng)調(diào)用的執(zhí)行流程系統(tǒng)調(diào)用的執(zhí)行流程10.3.3 10.3.3 封裝例程封裝例程system_call()是系統(tǒng)調(diào)用入口點。是系統(tǒng)調(diào)用入口點。系統(tǒng)調(diào)用主要供用戶編程運用,但也可系統(tǒng)調(diào)用主要供用戶編程運用,但也可以被內(nèi)核態(tài)線程調(diào)用。以被內(nèi)核態(tài)線程調(diào)用。為了簡化系統(tǒng)調(diào)用的調(diào)用過程,為了簡化系統(tǒng)調(diào)用的調(diào)用過程,Linux提提供的封裝例程是一組預(yù)處置宏。共定義供的封裝例程是一組預(yù)處置宏。共定義了了6個宏:個宏:v 從從_syscall0到到_syscall5#define _syscallN(type,name,type

12、1,arg1,type2,arg2,type3,arg3,. . .) type name(type1 arg1,type2 arg2,type3 arg3,. . .) long _res; _asm_ volatile (int $0 x80 : =a (_res) : 0 (_NR_#name),b (long)(arg1),c (long)(arg2), d (long)(arg3); . . . . . ._syscall_return(type,_res); 程序清單程序清單10-1 封裝例程:封裝例程:程序清單程序清單10-1給出封裝例程的定義:給出封裝例程的定義:封裝例程的解釋

13、封裝例程的解釋_syscallN中的中的“N是系統(tǒng)調(diào)用的參數(shù)個是系統(tǒng)調(diào)用的參數(shù)個數(shù)。數(shù)。前兩個字符串指明系統(tǒng)調(diào)用的前往值類型前兩個字符串指明系統(tǒng)調(diào)用的前往值類型和名字;和名字;緊隨其后的每一對參數(shù)指明該系統(tǒng)調(diào)用所緊隨其后的每一對參數(shù)指明該系統(tǒng)調(diào)用所需求的其他參數(shù)的類型和名字。需求的其他參數(shù)的類型和名字。fork()系統(tǒng)調(diào)用無參數(shù),它的封裝例程是:系統(tǒng)調(diào)用無參數(shù),它的封裝例程是: 系統(tǒng)調(diào)用名字系統(tǒng)調(diào)用名字調(diào)用參數(shù)個調(diào)用參數(shù)個數(shù)數(shù)前往類型值前往類型值_syscall0(int,fork)write()系統(tǒng)調(diào)用有系統(tǒng)調(diào)用有3個參數(shù),其封裝例程個參數(shù),其封裝例程宏指令格式是:宏指令格式是:可以按照程序

14、清單可以按照程序清單10-1把把_syscall3(int,write,)宏展開成下面的代碼:宏展開成下面的代碼:_syscall3(int,write,int,fd, const char*, buf, unsigned int,count)參數(shù)個數(shù)參數(shù)個數(shù)其中,蘭色字符串是其中,蘭色字符串是write()系統(tǒng)調(diào)用需系統(tǒng)調(diào)用需求的求的3對參數(shù)。對參數(shù)。int write(int fd, const char* buf, unsigned int count) long _res; _asm_ volatile (int $0 x80 : =a (_res) : 0 (_NR_write),b

15、 (long)fd),c (long)buf), d (long)count);if (unsigned long)_ _res =(unsigned long)-125) errno = -_ _res; _ _res = -1;return(int) _ _res;它是系統(tǒng)調(diào)用號,來自它是系統(tǒng)調(diào)用號,來自_syscall3()的第的第2個參數(shù)個參數(shù)對這個函數(shù)進展編譯,生成的匯編代碼如對這個函數(shù)進展編譯,生成的匯編代碼如下:下:write: pushl %ebx ;將將ebx內(nèi)容進棧內(nèi)容進棧 movl 8(%esp) , %ebx ;將第一個參數(shù)放入將第一個參數(shù)放入ebx movl 12(%

16、esp), %ecx ;將第二個參數(shù)放入將第二個參數(shù)放入ecx movl 16(%esp), %edx ;將第三個參數(shù)放入將第三個參數(shù)放入edx movl $4 , %eax ;將將_ _NR_write放入放入eax int $0 x80 ;執(zhí)行系統(tǒng)調(diào)用執(zhí)行系統(tǒng)調(diào)用 cmpl $-125,%eax ;檢測前往碼檢測前往碼 jbe .L1 ;如無錯跳轉(zhuǎn)如無錯跳轉(zhuǎn) negl %eax ;求求eax的補碼的補碼 movl %eax, errno ;將結(jié)果放入將結(jié)果放入errno movl $-1, %eax ;將將eax置為置為-1 .L1: popl %ebx ;從堆棧彈出從堆棧彈出ebx re

17、t ;前往調(diào)用程序前往調(diào)用程序從匯編代碼中可知傳送給從匯編代碼中可知傳送給write()的參數(shù)的參數(shù)是在執(zhí)行是在執(zhí)行int 0 x80指令之前就被裝入到指令之前就被裝入到CPU各個存放器中。各個存放器中。假設(shè)假設(shè)eax中的前往值為中的前往值為-1到到-125之間,將之間,將被解釋為錯誤碼。否那么前往被解釋為錯誤碼。否那么前往eax中的值,中的值,闡明調(diào)用勝利。闡明調(diào)用勝利。10.3.410.3.4系統(tǒng)調(diào)用號與系統(tǒng)調(diào)用系統(tǒng)調(diào)用號與系統(tǒng)調(diào)用表表system_call()函數(shù)是內(nèi)核中一切系統(tǒng)調(diào)用函數(shù)是內(nèi)核中一切系統(tǒng)調(diào)用的獨一入口點,因此內(nèi)核要為每個系統(tǒng)的獨一入口點,因此內(nèi)核要為每個系統(tǒng)調(diào)用編一個序號

18、,這個序號叫做系統(tǒng)調(diào)調(diào)用編一個序號,這個序號叫做系統(tǒng)調(diào)用號。用號。從上一節(jié)的封裝例程代碼中可以看到,從上一節(jié)的封裝例程代碼中可以看到,執(zhí)行執(zhí)行int 0 x80之前,系統(tǒng)調(diào)用號已被放在之前,系統(tǒng)調(diào)用號已被放在eax中。中。程序清單程序清單10-2給出了部分系統(tǒng)調(diào)用號。給出了部分系統(tǒng)調(diào)用號。#define _NR_exit 1#define _NR_fork 2#define _NR_read 3#define _NR_write 4#define _NR_open 5#define _NR_close 6 #define _NR_ removexattr 235 #define _NR_lre

19、movexattr 236 #define _NR_fremovexattr 237程序清單程序清單10-2 系統(tǒng)調(diào)用號系統(tǒng)調(diào)用號系統(tǒng)調(diào)用表系統(tǒng)調(diào)用表系統(tǒng)調(diào)用表是指向各系統(tǒng)調(diào)用函數(shù)指針組系統(tǒng)調(diào)用表是指向各系統(tǒng)調(diào)用函數(shù)指針組成的表。成的表。系統(tǒng)調(diào)用號是系統(tǒng)調(diào)用表中各表項的相對系統(tǒng)調(diào)用號是系統(tǒng)調(diào)用表中各表項的相對偏移量。偏移量。執(zhí)行執(zhí)行system_call()時,根據(jù)時,根據(jù)eax中的系統(tǒng)調(diào)中的系統(tǒng)調(diào)用號,定位該系統(tǒng)調(diào)用函數(shù)在系統(tǒng)調(diào)用表用號,定位該系統(tǒng)調(diào)用函數(shù)在系統(tǒng)調(diào)用表(sys_call_table)中的準確位置。中的準確位置。程序清單程序清單10-3給出了部分系統(tǒng)調(diào)用表。給出了部分系統(tǒng)調(diào)用表

20、。 .dataENTRY(sys_call_table) .long SYMBOL_NAME(sys_ni_syscall) / 0-old setup() / system call.long SYMBOL_NAME(sys_exit).long SYMBOL_NAME(sys_fork).long SYMBOL_NAME(sys_read).long SYMBOL_NAME(sys_write).long SYMBOL_NAME(sys_open) / 5 程序清單程序清單10-3 系統(tǒng)調(diào)用表系統(tǒng)調(diào)用表 10.3.5system_call 10.3.5system_call 的執(zhí)行過程的執(zhí)

21、行過程中心棧中心棧 old SS old ESP old EFLAGS old CS old EIP 031SS:ESP(從從TSS中獲取中心棧堆棧指針中獲取中心棧堆棧指針)棧的擴展方向棧的擴展方向SS:ESP最新中心棧的棧指針最新中心棧的棧指針圖圖10.5 運用圈套門有特權(quán)級改動上下文切換后的堆棧運用圈套門有特權(quán)級改動上下文切換后的堆棧 系統(tǒng)執(zhí)行系統(tǒng)執(zhí)行int $0 x80指令進展方式轉(zhuǎn)換時,指令進展方式轉(zhuǎn)換時,中心棧的規(guī)劃如圖中心棧的規(guī)劃如圖10-5所示。所示。ENTRY(system_call)pushl %eax / save orig_eax ,首先保管首先保管EAX存放器的內(nèi)容。存

22、放器的內(nèi)容。SAVE_ALL / 保管各通用存放器的內(nèi)容。保管各通用存放器的內(nèi)容。GET_CURRENT(%ebx) / 獲取調(diào)用進程的獲取調(diào)用進程的task_struct構(gòu)造的指針。構(gòu)造的指針。 cmpl $(NR_syscalls),%eax / 檢測系統(tǒng)調(diào)用能否合法系統(tǒng)調(diào)用。檢測系統(tǒng)調(diào)用能否合法系統(tǒng)調(diào)用。jae badsys / 假設(shè)該系統(tǒng)調(diào)用號越界那么跳轉(zhuǎn)到標號假設(shè)該系統(tǒng)調(diào)用號越界那么跳轉(zhuǎn)到標號badsys處。處。testb $0 x20,flags(%ebx) / 檢測能否設(shè)置了檢測能否設(shè)置了PF_TRACESYS標志。標志。jne tracesys /假設(shè)設(shè)置了假設(shè)設(shè)置了PF_TR

23、ACESYS標志那么跳轉(zhuǎn)到標號標志那么跳轉(zhuǎn)到標號tracesys處。處。call *SYMBOL_NAME(sys_call_table)(,%eax,4) /這里是調(diào)用并執(zhí)行該這里是調(diào)用并執(zhí)行該 /系統(tǒng)調(diào)用函數(shù)的地方系統(tǒng)調(diào)用函數(shù)的地方movl %eax,EAX(%esp) /save the return value,系統(tǒng)調(diào)用前往,系統(tǒng)調(diào)用前往, / 前往值進棧保管。前往值進棧保管。ret_from_sys_call:函數(shù)函數(shù)system_call()的源代碼如下:的源代碼如下:函數(shù)函數(shù)system_call()是一切系統(tǒng)調(diào)用的入口點。是一切系統(tǒng)調(diào)用的入口點。在源代碼中的調(diào)用語句是:在源代碼

24、中的調(diào)用語句是:call *SYMBOL_NAME(sys_call_table)(0,%eax,4)該語句調(diào)用與系統(tǒng)調(diào)用號該語句調(diào)用與系統(tǒng)調(diào)用號(在在eax中中)相對應(yīng)的相對應(yīng)的效力例程。效力例程。系統(tǒng)調(diào)用表的每一個表項占系統(tǒng)調(diào)用表的每一個表項占4個字節(jié),因此個字節(jié),因此把系統(tǒng)調(diào)用號乘以把系統(tǒng)調(diào)用號乘以4,再加上系統(tǒng)調(diào)用表的,再加上系統(tǒng)調(diào)用表的基址,就找到了指向該效力例程的地址,也基址,就找到了指向該效力例程的地址,也就找到了要執(zhí)行的系統(tǒng)調(diào)用函數(shù)。就找到了要執(zhí)行的系統(tǒng)調(diào)用函數(shù)。里邊是系統(tǒng)調(diào)用里邊是系統(tǒng)調(diào)用號號當效力例程執(zhí)行終了時,可以從當效力例程執(zhí)行終了時,可以從eax中獲中獲得前往值,并把

25、這個前往值進棧保管。得前往值,并把這個前往值進棧保管。當進程恢復(fù)到本人的用戶態(tài)執(zhí)行時,就當進程恢復(fù)到本人的用戶態(tài)執(zhí)行時,就可以在可以在eax中找到該系統(tǒng)調(diào)用的前往值。中找到該系統(tǒng)調(diào)用的前往值。注:由于注:由于lcall7代碼很少運用,所以不在代碼很少運用,所以不在PPT中講解。中講解。10.5 10.5 添加新系統(tǒng)調(diào)用實添加新系統(tǒng)調(diào)用實例例經(jīng)過學(xué)習(xí)向內(nèi)核添加一個新系統(tǒng)調(diào)用的過經(jīng)過學(xué)習(xí)向內(nèi)核添加一個新系統(tǒng)調(diào)用的過程,進一步了解系統(tǒng)調(diào)用的根本原理。程,進一步了解系統(tǒng)調(diào)用的根本原理。實例:新系統(tǒng)調(diào)用的功能是獲取系統(tǒng)當前實例:新系統(tǒng)調(diào)用的功能是獲取系統(tǒng)當前系統(tǒng)時間并顯示在屏幕上。步驟如下:系統(tǒng)時間并顯

26、示在屏幕上。步驟如下:編寫新系統(tǒng)調(diào)用源程序,新系統(tǒng)調(diào)用的稱編寫新系統(tǒng)調(diào)用源程序,新系統(tǒng)調(diào)用的稱號為:號為: int ptimeofday(struct timeval *tv, struct timezone*tz); 新系統(tǒng)調(diào)用的源程序如下:新系統(tǒng)調(diào)用的源程序如下:#include extern struct timezone sys_tz;asmlinkage int sys_ptimeofday(struct timeval *tv, struct timezone *tz) if (tv) struct timeval ktv; do_gettimeofday(&ktv); if (c

27、opy_to_user(tv, &ktv, sizeof(ktv) return -EFAULT; printk(Date:%09d%09d, ktv.tv_sec, ktv.tv_usec); if (tz) if (copy_to_user(tz, &sys_tz, sizeof(sys_tz) return -EFAULT; printk(Thetimeis: %09d%09d,sys_tz.tz_minuteswest,sys_tz.tz_dsttime); return 0; ptimeofday.c程序程序 銜接新的系統(tǒng)調(diào)用,將銜接新的系統(tǒng)調(diào)用,將ptimeofday.c代代碼添加

28、到碼添加到/usr/linux/kernel/sys.c文件中,文件中,同時需求重新編輯同時需求重新編輯2個文件個文件: 在文件在文件/usr/src/linux/include/asm/unistd.h中中為新系統(tǒng)調(diào)用分配一個系統(tǒng)調(diào)用號為為新系統(tǒng)調(diào)用分配一個系統(tǒng)調(diào)用號為239。即在表即在表10-2中的最后再添加一行:中的最后再添加一行: # define _NR_ptimeofday 239在文件在文件/usr/src/linux/arch/asm/kernel/entry.S中,即在表中,即在表10-3中的最后再添加一行:中的最后再添加一行: .long SYMBOL_NAME(sys_p

29、timeofday)編譯新的編譯新的Linux內(nèi)核。編譯內(nèi)核要以超內(nèi)核。編譯內(nèi)核要以超級用戶身份登錄,命令行如下:級用戶身份登錄,命令行如下:# make xconfig# make dep# make bzImage編譯終了后,系統(tǒng)將產(chǎn)生一個新緊縮的內(nèi)編譯終了后,系統(tǒng)將產(chǎn)生一個新緊縮的內(nèi)核映像文件:核映像文件: # usr/src/linux/arch/boot/bzImage為了安裝新系統(tǒng)內(nèi)核,應(yīng)該將上面產(chǎn)生的為了安裝新系統(tǒng)內(nèi)核,應(yīng)該將上面產(chǎn)生的新內(nèi)核映像文件拷貝到新內(nèi)核映像文件拷貝到/boot/目錄下:目錄下: # cp usr/src/linux/arch/boot/bzImage /

30、boot/bzImage-new啟動新的內(nèi)核操作系統(tǒng):啟動新的內(nèi)核操作系統(tǒng):假設(shè)他的機器運用假設(shè)他的機器運用grub加載加載OS,可參照,可參照教材表教材表8-2內(nèi)容修正內(nèi)容修正/etc目錄下的目錄下的grub.conf文件。文件。假設(shè)運用假設(shè)運用lilo加載加載OS,需求在已有的系統(tǒng),需求在已有的系統(tǒng)中修正中修正/etc/lilo.conf文件。可參照表文件。可參照表10-1原有的原有的/etc/lilo.conf文件文件 修正后的修正后的/etc/lilo.conf文件文件 prompt prompt timeout=50 timeout=50default=linux default=l

31、inuxboot=/dev/had7 boot=/dev/had7map=/boot/map map=/boot/mapinstall=/boot/boot.b install=/boot/boot.bmassage=/boot/message massage=/boot/messagelba32 lba32image=/boot/vmlinuz-2.4.18 image=/boot/bzImage-newlabel=linux label=linux-newinitrd=/boot/initrd-2.4.18.img image=/boot/vmlinuz-2.4.18read-only label=linuxroot=/dev/hdb8 initrd=/boot/initrd-2.4.18.imgother=/dev/hda1 read_onlyoptional root=/dev/hdb8la

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論