操作系統(tǒng)課程設(shè)計(jì)報(bào)告upload.docx_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì)報(bào)告upload.docx_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì)報(bào)告upload.docx_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì)報(bào)告upload.docx_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì)報(bào)告upload.docx_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

一、 課程設(shè)計(jì)目的掌握Linux操作系統(tǒng)的使用方法;了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。二、 課程設(shè)計(jì)要求1、 掌握Linux操作系統(tǒng)的使用方法,包括鍵盤(pán)命令、系統(tǒng)調(diào)用;掌握在Linux下的編程環(huán)境。l 編一個(gè)C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝的功能;l 編一個(gè)C程序,其內(nèi)容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫(kù)。2、 掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過(guò)程,通過(guò)編譯內(nèi)核方法,增加一個(gè)新的系統(tǒng)調(diào)用。另編寫(xiě)一個(gè)應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。實(shí)現(xiàn)的功能是:文件拷貝;3、 掌握增加設(shè)備驅(qū)動(dòng)程序的方法。通過(guò)模塊方法,增加一個(gè)新的設(shè)備驅(qū)動(dòng)程序,其功能可以簡(jiǎn)單。實(shí)現(xiàn)字符設(shè)備的驅(qū)動(dòng);4、 了解和掌握/proc文件系統(tǒng)的特點(diǎn)和使用方法l 了解/proc文件的特點(diǎn)和使用方法l 監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)中若干部件使用情況l 用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài)。5、 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)模擬的文件系統(tǒng)(選作)三、 課程設(shè)計(jì)系統(tǒng)平臺(tái)實(shí)體硬件CPUAMD Athlon 7750 Dual-Core Processor 2.7GHz主板Asus M3A78內(nèi)存4.0GB(3.25GB可用)操作系統(tǒng)Windows 7下的虛擬機(jī)VMware Workstation 6.0虛擬系統(tǒng)ubuntu-10.10-i386內(nèi)核版本Linux-虛擬硬件內(nèi)存1GB硬盤(pán)16GB四、 課程設(shè)計(jì)內(nèi)容一1、 編一個(gè)C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝的功能要實(shí)現(xiàn)文件拷貝功能,主要用到的函數(shù)是open、write、read。以前在windows下寫(xiě)C語(yǔ)言打開(kāi)文件常用的fopen,此時(shí)不能用,因?yàn)閒open是ANSIC標(biāo)準(zhǔn)中的C語(yǔ)言庫(kù)函數(shù),在不同的系統(tǒng)中應(yīng)該調(diào)用不同的內(nèi)核api ;所以應(yīng)該直接使用linux中的系統(tǒng)函數(shù)open。主要用到的頭文件:Unistd.h包含了許多Linux系統(tǒng)服務(wù)的函數(shù)原型,如:read、writeFcntl.h定義了很多宏和open,fcntl函數(shù)原型Stdio.h標(biāo)準(zhǔn)輸入輸出頭文件sys/types.h此頭文件包含適當(dāng)時(shí)應(yīng)使用的多個(gè)基本派生類型sys/stat.h 包含了獲取文件屬性的一些函數(shù)errno.h用于調(diào)試錯(cuò)誤代碼是所需要的一些errno變量string.h包含了處理字符串的一些函數(shù)設(shè)計(jì)思路:由命令行參數(shù)獲取2個(gè)文件名,根據(jù)其文件名和路徑分別打開(kāi)該2個(gè)文件,設(shè)置一個(gè)循環(huán),從源文件復(fù)制N個(gè)字節(jié)到目的文件,直到源文件指針到文件尾,最后關(guān)閉2個(gè)文件。在可能出錯(cuò)的地方需要加上相應(yīng)的報(bào)錯(cuò)代碼和中斷,并輸出錯(cuò)誤信息,以方便調(diào)試或是往后應(yīng)用在第2小題中可能發(fā)生的錯(cuò)誤。理清楚設(shè)計(jì)思路后,根據(jù)需求寫(xiě)出相應(yīng)的源代碼見(jiàn)后頁(yè)源程序代碼scopy.c ;在Linux終端使用編譯命令 gcc o scopy scopy.c將程序編譯并生產(chǎn)exe可執(zhí)行文件。然后手動(dòng)創(chuàng)建一個(gè)測(cè)試文件test.txt ,在終端輸入命令./scopy test.txt target.txt這樣就能將源文件test.txt復(fù)制到目標(biāo)文件target.txt程序源代碼 scopy.c:#include #include #include #include #include #include #include #define BUFFER_SIZE 1024 /緩沖區(qū)大小int main(int argc,char *argv) int from_fd,to_fd; int bytes_read,bytes_write; char bufferBUFFER_SIZE; /設(shè)定一個(gè)緩沖區(qū) char *ptr; if(argc!=3) /三個(gè)參數(shù) fprintf(stderr,Usage:%s fromfile tofilena,argv0); return(-1); /* 打開(kāi)源文件 */ if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,Open %s Error:%sn,argv1,strerror(errno); return(-1); /* 創(chuàng)建目的文件 */ if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1) fprintf(stderr,Open %s Error:%sn,argv2,strerror(errno); return(-1); while(bytes_read=read(from_fd,buffer,BUFFER_SIZE) /* 一個(gè)致命的錯(cuò)誤發(fā)生了 */ if(bytes_read=-1)&(errno!=EINTR) break; else if(bytes_read0) ptr=buffer; while(bytes_write=write(to_fd,ptr,bytes_read) /* 一個(gè)致命錯(cuò)誤發(fā)生了 */ if(bytes_write=-1)&(errno!=EINTR)break; /* 寫(xiě)完了所有讀的字節(jié) */ else if(bytes_write=bytes_read) break; /* 只寫(xiě)了一部分,繼續(xù)寫(xiě) */ else if(bytes_write0) ptr+=bytes_write; bytes_read-=bytes_write; /* 寫(xiě)的時(shí)候發(fā)生的致命錯(cuò)誤 */ if(bytes_write=-1)break; close(from_fd); close(to_fd); return(1);2、 編一個(gè)C程序,其內(nèi)容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫(kù)。 本次我選用的圖形庫(kù)是GTK+首先要在Linux下載GTK+相關(guān)庫(kù)文件并安裝。在終端輸入sudo apt-get install gnome-core-devel ,然后根據(jù)提示操作,就會(huì)安裝 libgtk2.0-dev libglib2.0-dev 等開(kāi)發(fā)所需的相關(guān)庫(kù)文件。編譯GTK+代碼時(shí)需要包含的頭文件是gtk/gtk.h,此外,還必須連接若干庫(kù);比如編譯test.c時(shí)用以下命令。gcc o test test.c pkg-config -cflags -libs gtk+-2.0在編寫(xiě)代碼時(shí)需要用到的控件、窗口等視窗物件形態(tài),用類GtkWidget定義其為指針類型。編寫(xiě)一個(gè)GTK+程序的基本步驟如下:l 初始化Gtkl 建立控件l 登記消息與消息處理函數(shù)l 執(zhí)行消息循環(huán)函數(shù)gtk_main()之后所設(shè)計(jì)的3個(gè)進(jìn)程,基本上都是以這樣的方式編寫(xiě)代碼的,因?yàn)橹霸眠^(guò)OpenGL,所以在這方面掌握的比較快。初始化主要使用的函數(shù)有g(shù)tk_init(&argc,&argv); /啟動(dòng)GTK gtk_window_new(GTK_WINDOW_TOPLEVEL); /創(chuàng)建窗口 gtk_window_set_title(GTK_WINDOW(window),標(biāo)題名); /設(shè)置窗口標(biāo)題名 gtk_widget_set_usize(window, 200, 200); /設(shè)置窗口大小 gtk_widget_show(window); /顯示窗口建立控件的一般流程/*創(chuàng)建表格準(zhǔn)備封裝*/gtk_table_new (/創(chuàng)建多少列g(shù)int rows,/創(chuàng)建多少欄gint columns,/用來(lái)決定表格如何來(lái)定大小gint homogeneous);/*這個(gè)函數(shù)是將表格table,結(jié)合到窗口window里*/gtk_container_add(GTK_CONTAINER(window),table);gtk_widget_show(table);/ 顯示該表格/*要把物件放進(jìn)box中,可用以下函數(shù)*/void gtk_table_attach_defaults (GtkTable*table,/參數(shù)(table)是選定某表格GtkWidget*widget,/(child)是想放進(jìn)去的物件gintleft_attach,/以下參數(shù)是指定把物件放在哪里, 及用多少個(gè)boxesgintright_attach,ginttop_attach,gintbottom_attach);本次我所設(shè)計(jì)的3個(gè)進(jìn)程主要使用了下列控件:進(jìn)度條、按鈕、文本框、滾動(dòng)條,分別用在3個(gè)進(jìn)程里。進(jìn)度條函數(shù):progress_bar=gtk_progress_bar_new(); /創(chuàng)建進(jìn)度條按鈕函數(shù):gtk_button_new_with_label(“LABEL”);/創(chuàng)建帶有LABEL的字在上面的按鈕文本框:gtk_text_new(NULL,NULL);/創(chuàng)建文本構(gòu)件滾動(dòng)條:gtk_vscrollbar_new(GTK_TEXT(text)-vadj); /創(chuàng)建滾動(dòng)條并設(shè)置其與文本同步其他函數(shù):gint gtk_timeout_add (guint32 interval,/每間隔interval 毫秒呼叫一次指定函數(shù)GtkFunction function,/被呼叫的函數(shù)gpointer data);/要傳給該函數(shù)的資料gtk_signal_connect (GtkObject *object,/送出信號(hào)的物件gchar *name,/希望接取的信號(hào)名稱GtkSignalFunc func,/送給該函數(shù)的資料gpointer func_data);根據(jù)上述重要的函數(shù)分別編寫(xiě)4個(gè)源代碼,分別編譯后,輸入./Stest運(yùn)行Stest結(jié)果如截圖所示:下面附上4個(gè)進(jìn)程的源代碼:1) Stest.c#include #include #include #include #include int semid;char *finish;int p1,p2;int main (void) if(p1=fork()=0)/創(chuàng)建新進(jìn)程 execv(./S1,NULL); else if(p2=fork()=0) execv(./S2,NULL); else execv(./S3,NULL); return 0;2) S1.c#include #includeGtkWidget *window;GtkWidget *table;GtkWidget *button;GtkWidget *progress_bar;/ 更新進(jìn)度條,這樣就能夠看到進(jìn)度條的移動(dòng)gint progress_timeout( gpointer data ) gdouble value; int v; char text20=0%; /使用在調(diào)整對(duì)象中設(shè)置的取值范圍計(jì)算進(jìn)度條的值 value=gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR (progress_bar)+0.01; if (value1.0) value=0.0; v=(int)(value*100); strcpy(text, ); sprintf(text,%d,v); strcat(text,% ); / 設(shè)置進(jìn)度條的新值 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress_bar),value); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress_bar),text); /這是一個(gè)timeout函數(shù),返回 TRUE,這樣它就能夠繼續(xù)被調(diào)用 /如果想要結(jié)束,可以在進(jìn)度條到100時(shí),return 0;這樣回調(diào)函數(shù)就會(huì)結(jié)束 return TRUE; int main(int argc,char *argv) int timer; gpointer data; gtk_init(&argc,&argv);/在任何構(gòu)件生成之前完成 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/創(chuàng)建窗口 gtk_window_set_title(GTK_WINDOW(window),Swindow1);/設(shè)置窗口標(biāo)題 gtk_widget_set_usize(window, 200, 200);/設(shè)置窗口大小 gtk_container_set_border_width(GTK_CONTAINER(window),5);/設(shè)置窗口邊框?qū)挾?gtk_widget_show(window);/顯示窗口gtk_signal_connect(GTK_OBJECT(window),destroy,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);table=gtk_table_new(5,11,TRUE);/創(chuàng)建表格3行*5列g(shù)tk_widget_show(table);/顯示表格gtk_container_add(GTK_CONTAINER(window),table);/將table1裝進(jìn)窗口 /* 創(chuàng)建進(jìn)度條 */ progress_bar=gtk_progress_bar_new(); gtk_table_attach_defaults(GTK_TABLE(table),progress_bar,0,11,1,2);/進(jìn)度條裝進(jìn)表格 gtk_widget_show(progress_bar); /* 加一個(gè)定時(shí)器(timer),以更新進(jìn)度條的值 */ timer=gtk_timeout_add(150,progress_timeout,data); gtk_main (); return 0;3) S2.c#define GTK_ENABLE_BROKEN#include#includeGtkWidget *window;GtkWidget *table;GtkWidget *label;GtkWidget *button;GtkWidget *button1;int i=0; gint hello(void ) label=gtk_label_new(Hello World!);/創(chuàng)建標(biāo)題 gtk_table_attach_defaults(GTK_TABLE(table),label,3,8,0,1); gtk_widget_show (label); return TRUE;n int main(int argc,char *argv) GtkWidget *vscrollbar; int timer; gpointer data; gtk_init(&argc,&argv);/在任何構(gòu)件生成之前完成 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/創(chuàng)建窗口 gtk_window_set_title(GTK_WINDOW(window),Swindow2);/設(shè)置窗口標(biāo)題 gtk_widget_set_usize(window, 200, 200);/設(shè)置窗口大小 gtk_container_set_border_width(GTK_CONTAINER(window),5);/設(shè)置窗口邊框?qū)挾?gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);/設(shè)置窗口位置 gtk_widget_show(window);/顯示窗口 gtk_signal_connect(GTK_OBJECT(window),destroy,GTK_SIGNAL_FUNC(gtk_main_quit),NULL); table=gtk_table_new(11,10,TRUE);/創(chuàng)建表格11行*10列 gtk_container_add(GTK_CONTAINER(window),table);/將table1裝進(jìn)窗口 gtk_widget_show(table);/顯示表格/* 添加一個(gè)按鈕,用來(lái)退出應(yīng)用程序 */ button = gtk_button_new_with_label (close); gtk_table_attach_defaults(GTK_TABLE(table),button,3,8,6,8);/按鈕裝進(jìn)表格 gtk_widget_show (button); gtk_signal_connect(GTK_OBJECT(button),clicked,GTK_SIGNAL_FUNC(gtk_main_quit),NULL); gtk_main (); return 0;4) S3.c#define GTK_ENABLE_BROKEN#include#includeGtkWidget *window;GtkWidget *table;GtkWidget *label;GtkWidget *text;int i=0; gint text_timeout( gpointer data ) char buf20; char temp10; sprintf(temp,%d,i); strcpy(buf,text ); strcat(buf,temp); strcat(buf,n); /將buf內(nèi)容插入到文本構(gòu)件中 gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,buf,-1); i+; /這是一個(gè)timeout函數(shù),返回 TRUE,這樣它就能夠繼續(xù)被調(diào)用 /如果想要結(jié)束,return 0;這樣回調(diào)函數(shù)就會(huì)結(jié)束 return TRUE; int main(int argc,char *argv) GtkWidget *vscrollbar; int timer; gpointer data; gtk_init(&argc,&argv);/在任何構(gòu)件生成之前完成 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/創(chuàng)建窗口 gtk_window_set_title(GTK_WINDOW(window),Swindow3);/設(shè)置窗口標(biāo)題 gtk_widget_set_usize(window, 200, 400);/設(shè)置窗口大小 gtk_container_set_border_width(GTK_CONTAINER(window),5);/設(shè)置窗口邊框?qū)挾?gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);/設(shè)置窗口位置 gtk_widget_show(window);/顯示窗口 gtk_signal_connect(GTK_OBJECT(window),destroy,GTK_SIGNAL_FUNC(gtk_main_quit),NULL); table=gtk_table_new(11,10,TRUE);/創(chuàng)建表格11行*10列 gtk_container_add(GTK_CONTAINER(window),table);/將table1裝進(jìn)窗口 gtk_widget_show(table);/顯示表格 label=gtk_label_new(Text List);/創(chuàng)建標(biāo)題 gtk_table_attach_defaults(GTK_TABLE(table),label,0,10,0,1); gtk_widget_show (label); text=gtk_text_new(NULL,NULL);/創(chuàng)建文本構(gòu)件 gtk_widget_show(text);/顯示文本構(gòu)件 /將文本構(gòu)件裝進(jìn)表格 gtk_table_attach_defaults(GTK_TABLE(table),text,0,9,1,11); /創(chuàng)建滾動(dòng)條并設(shè)置其與文本同步 vscrollbar=gtk_vscrollbar_new(GTK_TEXT(text)-vadj); gtk_widget_show (vscrollbar);/顯示垂直滾動(dòng)條 gtk_table_attach_defaults (GTK_TABLE (table), vscrollbar,9,10,1,11);/將滾動(dòng)條裝進(jìn)表格 timer=gtk_timeout_add(1000,text_timeout,data);/調(diào)用回調(diào)函數(shù),每隔1秒輸出一行文本 gtk_main (); return 0;五、 課程設(shè)計(jì)內(nèi)容二Linux內(nèi)核,簡(jiǎn)單來(lái)說(shuō)就是一套用來(lái)控制計(jì)算機(jī)最底層的硬件設(shè)備,如處理器、內(nèi)存、硬盤(pán)等的一種軟件,一般稱為操作系統(tǒng),在Linux術(shù)語(yǔ)中稱為內(nèi)核。其中包含的模塊有存儲(chǔ)管理、CPU和進(jìn)程管理、文件系統(tǒng)、設(shè)備管理和驅(qū)動(dòng)、網(wǎng)絡(luò)通信,以及系統(tǒng)的初始化(引導(dǎo))、系統(tǒng)調(diào)用等。這次題目就是要更改Linux內(nèi)核中的”系統(tǒng)調(diào)用”模塊,在其中添加自定義的函數(shù),實(shí)現(xiàn)功能是文件拷貝。本次我選用的Linux內(nèi)核版本是linux-需要做的工作流程基本如下:下載并解壓內(nèi)核修改內(nèi)核中關(guān)于系統(tǒng)調(diào)用所需要的文件編譯內(nèi)核安裝內(nèi)核測(cè)試功能1. 下載并解壓內(nèi)核首先到官方網(wǎng)站/下載內(nèi)核,不一定要最新的,以廣大用戶評(píng)定較穩(wěn)定的內(nèi)核為優(yōu)先。我這次選用linux-其次打開(kāi)終端,使用下列命令對(duì)其解壓到目錄/usr/srcsudo tar -xjvf linux-.tar.bz2 -C /usr/src該目錄用來(lái)存放內(nèi)核的源碼。2. 修改內(nèi)核首先要對(duì)系統(tǒng)調(diào)用模塊的源碼添加一個(gè)自定義函數(shù),即對(duì)/usr/src/linux-/kernel/sys.c進(jìn)行修改,在該源碼的最后添加下列函數(shù)的源碼:asmlinkage int sys_mycall(char* sourceFile,char* destFile) int source=sys_open(sourceFile,O_RDONLY,0); int dest=sys_open(destFile,O_WRONLY|O_CREAT|O_TRUNC,0600); char buf4096; mm_segment_t fs; fs = get_fs(); set_fs(get_ds(); int i; if(source0 & dest0) do i=sys_read(source,buf,4096); sys_write(dest,buf,i); while(i); else printk(Error!); sys_close(source); sys_close(dest); set_fs(fs); return 10;修改完函數(shù)之后,接下來(lái)要修改系統(tǒng)調(diào)用號(hào)所對(duì)應(yīng)的函數(shù)名,即修改/usr/src/linux-0/arch/x86/include/asm/unistd_32.h該文件定義了系統(tǒng)調(diào)用號(hào),我們只要找一沒(méi)被使用的系統(tǒng)調(diào)用號(hào),用該號(hào)給我們自定義函數(shù)使用,比如#define _NR_sys_mycall337/*定義系統(tǒng)調(diào)用sys_mycall 的系統(tǒng)調(diào)用號(hào)為337*/修改完系統(tǒng)調(diào)用號(hào)后,接下來(lái)要修改系統(tǒng)調(diào)用表,即/usr/src/linux-0/arch/x86/kernel/syscall_table_32.S,這個(gè)文件是用匯編語(yǔ)言編寫(xiě)的,因此要讓自定義的系統(tǒng)調(diào)用相對(duì)于其他系統(tǒng)調(diào)用的順序337個(gè),寫(xiě)上.long sys_mycall /*337*/基本修改完以上源碼后,接下來(lái)對(duì)其進(jìn)行默認(rèn)的凈化、設(shè)置等。使用下列代碼對(duì)其源碼進(jìn)行處理sudo make mrproper 凈化解壓后的源代碼sudo make menuconfig對(duì)內(nèi)核選項(xiàng)進(jìn)行配置如果這一步有錯(cuò)誤可能是正在使用的系統(tǒng)沒(méi)有安裝必要的庫(kù)文件,如ncurses、libncurses*,這時(shí)候需要輸入如下指令來(lái)安裝首先回到系統(tǒng)根目錄sudo apt-get install ncursessudo apt-get install libncurses*依照提示就能安裝好必要的庫(kù)文件了。然后再回到內(nèi)核源碼的目錄下嘗試使用sudo make menuconfig對(duì)內(nèi)核選項(xiàng)進(jìn)行配置。sudo make dep 建立模塊間的依賴信息sudo make clean 刪除配置時(shí)留下的一些不用的文件3. 編譯內(nèi)核接下來(lái)是最費(fèi)時(shí)間的環(huán)節(jié),少則2個(gè)小時(shí),多則3個(gè)小時(shí)的編譯,需要再三確保前面步驟是否正確后再進(jìn)行下一步。sudo make bzImage編譯內(nèi)核這個(gè)過(guò)程大概是20多分鐘sudo make modules編譯內(nèi)核模塊這個(gè)過(guò)程大概要100分鐘150分鐘左右,一般如果有錯(cuò)誤,會(huì)在前十幾分鐘就停止編譯并報(bào)錯(cuò)。4. 安裝內(nèi)核比較簡(jiǎn)單,只需要兩條指令sudo make modules_install 安裝內(nèi)核模塊sudo make install 安裝內(nèi)核安裝完畢后,需要開(kāi)機(jī)時(shí)選擇使用新的Linux核心,要做下列修改:1)復(fù)制內(nèi)核到系統(tǒng)啟動(dòng)引導(dǎo)目錄cp /usr/src/linux-/arch/i386/boot/bzImage /boot/vmlinuz--mykernel2)創(chuàng)建初始RAM磁盤(pán)initrd在創(chuàng)建之前先安裝必要的程序apt-get install bootcd-mkinitramfsmkinitramfs -o /boot/initrd.img-3)更新grub在/boot/grub/grub.cfg中, 復(fù)制一段舊的核心代碼,并將里面linux和initrd中的路徑改為新增的,注意不能用update-grub2在/boot中復(fù)制一個(gè)舊的config-xxxxxx做為自己的4)cd /bootcp initrd.img- initrd-.old以上是備份initrid,下面是修改depmod aupdate-initramfs -k ccd /tmpgzip -dc /boot/initrd.img-| cpio -idtouch lib/modules//modules.depfind ./ | cpio -H newc -o /boot/initrd.img-.newgzip /boot/initrd.img-.newcd /bootmv initrd.img-.new.gz initrd.img-5)重開(kāi)機(jī)測(cè)試5. 測(cè)試功能用C語(yǔ)言編寫(xiě)測(cè)試程序testsys.c,源代碼如下:#include #include #include int main(int argc,char*argv) int i=syscall(337,argv1,argv2); /*337為系統(tǒng)調(diào)用號(hào)*/ printf(successfully!rn); printf(%d,i); return 1;編譯gcc o testsys testsys.c運(yùn)行./testsys test.txt target.txt系統(tǒng)調(diào)用337號(hào)功能,拷貝文件test.txt到target.txt運(yùn)行結(jié)果截圖如下:六、 課程設(shè)計(jì)內(nèi)容三本題是為了更深刻了解模塊機(jī)制,這種機(jī)制可以動(dòng)態(tài)的在內(nèi)核中添加或者刪除模塊。模塊一旦被插入內(nèi)核,他就和內(nèi)核其他部分一樣了。Unix系統(tǒng)將設(shè)備分為三種類型字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)接口;一般對(duì)應(yīng)這三種模塊字符模塊、塊模塊、網(wǎng)絡(luò)模塊。字符設(shè)備,是能夠像字節(jié)流一樣被訪問(wèn)的設(shè)備,由字符設(shè)備驅(qū)動(dòng)程式來(lái)實(shí)現(xiàn)這種特性。下面是一個(gè)的字符設(shè)備驅(qū)動(dòng)程式。源代碼sdev.c#include #include #include #include #include #include #define DEFAULT_MSG default dev datan/*默認(rèn)字符設(shè)備數(shù)據(jù)*/#define DEVICE_NAME sdev/*設(shè)備名*/#define MAXBUF 20/*設(shè)備數(shù)據(jù)緩沖區(qū)大小*/static unsigned char sdev_bufMAXBUF;/*設(shè)備內(nèi)存數(shù)據(jù)緩沖區(qū)*/static int sdev_open (struct inode *inode, struct file *file);static int sdev_release (struct inode *inode, struct file *file);static ssize_t sdev_read (struct file *file, char _user *buf,size_t count, loff_t *pos);static ssize_t sdev_write (struct file *file, const char _user *buf,size_t count, loff_t *pos);static int sdev_open (struct inode *inode, struct file *file) return 0;static int sdev_release (struct inode *inode, struct file *file) return 0;/*從設(shè)備讀取count個(gè)數(shù)據(jù)到用戶數(shù)據(jù)區(qū)buf中*/static ssize_t sdev_read (struct file *file, char _user *buf,size_t count, loff_t *pos) int size = count MAXBUF ? count : MAXBUF; /*選擇讀取數(shù)量 count or 數(shù)據(jù)緩沖區(qū)*/ if (copy_to_user(buf, sdev_buf, size)/*把設(shè)備數(shù)據(jù)copy到用戶空間buf中,數(shù)量為size*/ return -ENOMEM;/*錯(cuò)誤:內(nèi)存不足*/ return size;/*把buf中count個(gè)數(shù)據(jù)寫(xiě)入設(shè)備內(nèi)存空間中*/static ssize_t sdev_write (struct file *filp, const char _user *buf,size_t count, loff_t *pos) int size = count ops = &sdev_fops;/*設(shè)定字符設(shè)備操作函數(shù)指針*/ sdev_cdev-owner = THIS_MODULE;/*設(shè)備的屬主*/ error = cdev_add(sdev_cdev, dev, 1);/*將設(shè)備添加到內(nèi)核中去*/ if (error) printk(設(shè)備添加失??!n); unregister_chrdev_region(dev, 2);/*注銷一個(gè)分配的設(shè)備號(hào)區(qū)域*/ cdev_del(sdev_cdev);/*刪除字符設(shè)備對(duì)象*/ return error; memset (sdev_buf, 0, sizeof(sdev_buf);/*清空設(shè)備緩沖區(qū)數(shù)據(jù)*/ memcpy(sdev_buf, DEFAULT_MSG, sizeof(DEFAULT_MSG);/*設(shè)定設(shè)備緩沖區(qū)默認(rèn)數(shù)據(jù)*/ printk(設(shè)備緩沖區(qū)默認(rèn)數(shù)據(jù): default dev datan);

溫馨提示

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

評(píng)論

0/150

提交評(píng)論