下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
課程設(shè)計說明課程名稱 操作系統(tǒng)課程設(shè) 業(yè):物聯(lián)網(wǎng)工 班級 2012級2設(shè)計人 2012010519102015116一、課程設(shè)計題目:Linux二、設(shè)計原始資料:1OperatingSystemConceptAbrahamSilberschatz 5、Linux六、命題發(fā)出日期: 設(shè)計要 總 proc偽文件系統(tǒng)及CMOS實時信 設(shè)計要 總 使用seq-file機制proc進(jìn)程信 設(shè)計要 總 設(shè)計要 總 設(shè)計要 總 總 1、通過完成一個簡單的Linux內(nèi)核模塊的添加和運行工作,了解并21、完成kello.c2kello.cMakefile3、完成kello.ko456kello.c代碼的修改,使其能夠在用戶界面上輸出信息,以及一定1、用gedit編輯工具完成kello.c2kello.cMakefile與普通C語言撰寫的應(yīng)用程序o.c相比,內(nèi)核模塊的編譯比較復(fù)雜,這是因為在編譯的過需要當(dāng)前內(nèi)核模塊的支持。我們需要首先編寫一個Makefile文件,與kello.c的編寫一樣,可以vi工具或者gedit代碼撰寫完成后,文件保存為Makefile與kello.c文件放置在同一個文件夾下?,F(xiàn)在我們可以開始LKM的編譯了。首先執(zhí)行l(wèi)s命令,查看并確認(rèn)kello.c和Makefile存在當(dāng)期工作 下,然后運行make指令。 sudoinsmodkello.ko sudormmoddmesg4、LKMkello.cMakefile文件。其內(nèi)容如下:obj-:=KDIR:=/lib/modules/$(suname-r)/build:=$(spwd)$(MAKE)-C$(KDIR)SUBDIRS=$(PWD)rm-r-f.tmp_versions*.mod.c.*.cmd*.o*.symvers對該文件的解釋是這樣的:KERNELRELEASEMakefile中定義的一個變量,在第一次執(zhí)行此Makefile時,KERNELRELEASE沒有被定義,所以make將執(zhí)行else之后的內(nèi)容。如果make的目標(biāo)是clean,直接執(zhí)行clean操作,然后結(jié)束。當(dāng)沒有make的目標(biāo)時,make執(zhí)行默認(rèn)操作,即default后的指令,此時-C$(KDIR)指明跳轉(zhuǎn)到內(nèi)核源 下那里的=$(PWD)表明需要返回到當(dāng)前 繼續(xù)讀入、執(zhí)行當(dāng)前的Makefile。當(dāng) 返回時,KERNELRELEASE已被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續(xù)else之前的內(nèi)容。else之前的內(nèi)容為kbuild語法的語句,指明模塊源碼中各文件的依賴關(guān)系,以及要生成的目標(biāo)模塊名,obj-m:=kello.o表示編譯連接后將生成kello.o模塊,而kello.o文件默認(rèn)則是由kello.c文件編譯生成的。5在內(nèi)核中定義了0~7總計8staticchar*log_level[]={KERN_EMERG0,表示等級最高。此時調(diào)用printkprintk(“<0>o,studentsfromSDUST!Thisisinkernelspace!\n"printk(KERN_EMERG"\no,studentsfromSDUST!Thisisinkernelspace!\n");6、intk函數(shù)還可以輸出相關(guān)參數(shù),例如如下printk(KERN_DEBUG"Wearehere:%s:%dat%s()/n",FILE ,LINE ,FUNCTION 其中FILE 表示源代碼文件,以絕對路徑的方式出現(xiàn),LINE 表示這行printk允許在這個源代碼文件中的第幾行,這是一個很好的給出調(diào)測點位置的信息。這個同樣可以用在用戶程序。另外DATE 和TIME也是經(jīng)常使用用的兩個。這4個宏,在debug中會經(jīng)常使用。還有一個常用的是FUNCTION 表示處在哪個函數(shù)中,也是比較好的定位方式。這些宏均可以在用戶程序中使用,對debug非常有幫7kello.c代碼的修改,使其能夠在用戶界面上輸出信息,以及一定運行結(jié)果及分1、用gedit編輯工具完成kello.c2kello.c代碼對應(yīng)的Makefile上述代碼撰寫完成后,文件保存為Makefile與kello.c文件放置在同一個文件夾下?,F(xiàn)在我們可以開始LKM的編譯了。首先執(zhí)行l(wèi)s命令,查看并確認(rèn)kello.c和Makefile存在當(dāng)期工作 下,然后運行make指3、完成kello.ko4printk(“<0>o,studentsfromSDUST!Thisisinkernelspace!\n"printk(KERN_EMERG"\no,studentsfromSDUST!Thisisinkernelspace!\n");5kello.c代碼的修改,使其能夠在用戶界面上輸出信息,以及總本次設(shè)計的重點有兩個的c庫。MakefileMakefile文件的撰寫是內(nèi)核編程必要的procCMOS1LKM機制添加系統(tǒng)功能,并支持應(yīng)用程序使用該功2Linuxmycatproc3LKM模塊,并對比,更深刻地理解內(nèi)核模塊編1、在Linux中有一個應(yīng)用非常廣泛令:cat,它的作用很多,其中一個2mycat.c代碼的編輯,$gccmycat.c-o文件編譯成功后,按著文件中說明的方法運行$./mycat<filename>可以是mycat.cpp或其他文件的名稱。請觀察命令3、對照代碼、結(jié)合操作系統(tǒng)課程內(nèi)容、以及圖2.1,4、運行本節(jié)命令,5、代碼編輯完成后,請保存為cmos.c。然后在相同文件夾下編輯Makefile文件,內(nèi)容如下:Makefile保存后,在同一 下運行make;如果報錯,請根據(jù)錯誤提示修改;如果一切順利,那么就生成了cmos.ko文件,可以使用ls命令查看。這表示初步的編譯已經(jīng)通過了。確認(rèn)cmos.ko生成后,可以通過如下命令來添加該LKM模塊:$sudoinsmodcmos內(nèi)核源文件,Makfile6cmos.ko內(nèi)核模塊,cat、mycat應(yīng)用程序進(jìn)1$cat$cat$cat$cat$cat$cat$cat$cat2、完成如下代碼的撰寫,mycat.c#include<fcntl.h>//foropen()#include<stdio.h>//forperror()#include<unistd.h>//forread(),write(),close()intmain(intargc,char*argv[]){inti,fd,ch;//declarelocalvariablesfor(i=1;i<argc;i++){fd=open(argv[i],O_RDONLYif(fd<0){perror(argv[i]);continue;while(read(fd,&ch,1)==1)write(STDOUT_FILENO,&ch,1);close(fd);}}文件保存后,可以按著文件頭部注釋中說明的方法進(jìn)行編譯,$gccmycat.c-o文件編譯成功后,按著文件中說明的方法運行$./mycat<filename>mycat.cpp或其他文件的名稱。觀察命令運行后的3、運行本節(jié)命令,查看輸出結(jié)果。$catproc/cpuinfoCPU(型號,,緩存大小等)$cat/proc/modules-$cat/proc/meminfo-$cat/proc/iomemIO$cat/proc/self/maps-cat$cat/proc/devices-$cat/proc/filesystems-$cat/proc/version-4、代碼編輯完成后,cmos.c。然后在相同文件夾下編輯obj-m:=cmos.oKDIR:=/lib/modules/$(suname-r)/buildPWD:=$(spwd)$(MAKE)-C$(KDIR)SUBDIRS=$(PWD)rm-r-f.tmp_versions*.mod.c.*.cmd*.o*.symversMakefile保存后,在同一下運行make;如果報錯,請根據(jù)錯誤提示修改;如果一切順利,cmos.ko文件,ls命令查看。這表示初步的編譯已經(jīng)通過了。確認(rèn)cmos.ko生成后,可以通過如下命令來添加該LKM模塊:$sudoinsmod 下查看是否生成了cmos偽文件,也可以使用dmesg來查看內(nèi)核日志中的模塊添加信息。一切順利沒有問題,我們可以運行如下命令來RTC信息了:$cat/proc/cmos你的顯示器上的輸出結(jié)果是什么?是不是RTC信息不斷的在刷屏?按<Ctrl>+C組合鍵,可以停止刷屏。查看我們的cmos.c內(nèi)核源文件,可以確認(rèn)我們確實是只想輸出一次RTC信息啊,但為什么一直在不斷的輸出呢?現(xiàn)在再嘗試使用我們自己開發(fā)的mycat應(yīng)用程序來查看RTC輸出:$./mycat5、“新內(nèi)核新特性:ubuntu14.04LTSproc特性”刪除了老內(nèi)核環(huán)境支持的多個版本的proc創(chuàng)建方法。目前3.13.0proc_create,其函數(shù)原型為staticinlinestructproc_dir_entry*proc_create(constchar*name,umode_tmode,structproc_dir_entry*parent,conststructfile_operations*proc_fops){returnproc_create_data(name,mode,parent,proc_fops,}該函數(shù)是一個內(nèi)聯(lián)函數(shù)(inline),proc_creat_dataproc_creat-data的原型如下externstructproc_dir_entry*proc_create_data(constchar*,umode_t,structproc_dir_entry*,conststructfile_operations*,void*);所以嚴(yán)格的說,在版本的Linux內(nèi)核中,proc偽文件事實上只有一新版本的Linux內(nèi)核刪除了在ubuntu12.04LTS(Linux3.2.0內(nèi)核)經(jīng)常使用的proc直接讀和寫的函數(shù)。也就是說,在ubuntu12.04LTS中我們使用一個proc自定義的讀函數(shù)就可以正確的讀出相關(guān)信息了。為此,在新版Linuxprocseq_file機制綁定在一起了。也就是說,在Linux新版本的內(nèi)核中proc偽文件的讀寫等操作都是根據(jù)seq_file機制來進(jìn)行的。運行結(jié)果及分1、$cat$cat$cat$cat$cat$cat$cat$cat2、$sudoinsmod3、嘗試使用自己開發(fā)的mycat應(yīng)用程序來查看RTC$./mycat總/proc偽文件系統(tǒng)提供了一個基于文件形式的Linux內(nèi)部接口。它可些狀態(tài)往往都是處于內(nèi)核空間的,對程序員來說是作系統(tǒng)隔絕開的。通過本次設(shè)計,我們可以看到為了解決應(yīng)用程序與內(nèi)核數(shù)據(jù)的問題,也即我們不可能讓一個類似于cat的應(yīng)用程序直接去讀CMOS中的RTC信息,我們添加了一個cmos.ko內(nèi)核模塊,該模塊創(chuàng)建了一個名為cmos的proc偽文件,通過這個偽文件我們就可以直接從硬件設(shè)備CMOS中RTC信息了。當(dāng)用戶程序,比如cat,要打開/proc/cmos偽文件或者/proc/cmos的信息時,cat程序中的標(biāo)準(zhǔn)庫函數(shù)把相應(yīng)的操作參數(shù)傳遞給操作系統(tǒng)內(nèi)核對應(yīng)的LKM模塊,也即我們編寫的cmos.ko,由cmos.ko調(diào)用相應(yīng)的內(nèi)核操作函數(shù)打開該設(shè)備或者相關(guān)信息,然后把操作結(jié)果返1、通過使用seq-file機制proc進(jìn)程信息,了解seq_file機制,理解Linux重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct;2、通過利用seq_fileproc偽文件,Linux內(nèi)核task_structPCB(ProcessControlBlock)的信息。1、了解seq_file2、實現(xiàn)procseq_file32步輸出結(jié)果進(jìn)行分析,查看并分析查看/proc/tasklist的信息4、重新編輯編輯代碼并運試新的tasklist模塊,并用mycat和cat命1、編輯tasklist.c內(nèi)核代碼,添加到當(dāng)前內(nèi)核中運行,并且通過mycat和cat命令查看/proc/tasklist的信息。實現(xiàn)proc偽文件與seq_file機制的綁定,通過proc偽文件tasklist當(dāng)前系統(tǒng)中進(jìn)程的pid、狀態(tài)、進(jìn)程名稱等信 在my_proc_entryproc_create(modname0NULL&my_proc);中傳遞了參數(shù)&my_proc作為定義的proc偽文件tasklist的操作函數(shù),它的具體staticconststructfile_operationsmy_proc{.owner= = = =.release=其中my_open函數(shù)是自己寫的,但是只有一句就是調(diào)用seq_open函數(shù)。seq_open通常在打開文件的時候使用;seq_read,seq_lseek和seq_releaseread,llseekrelease,由頭文件seq_file.h定義,在seq_file.c中實現(xiàn)。2、查看/proc/tasklist的信息,3、重新編輯代碼并運試新的tasklist模塊,并用mycat和cat命令分1是否存在差異,并分析。運行結(jié)果及分11procseq_file機制是這樣綁定在一起的文件級別的操作綁定。proc在創(chuàng)建后,seq_file機制支持的打開、讀、寫(seq_open、seq_read、seq_write)等函數(shù)進(jìn)行文件級別的操作;工作,那么我們就需要自己重寫這些函數(shù),這些函數(shù)都需要在file_operations結(jié)構(gòu)體中,并在proc文件創(chuàng)建時作為參數(shù)傳遞進(jìn)去,即proc_create中記錄級別的遍歷操作。如果在遍歷seq_file對象時需要完成我們自己的工作,那么就需要定義我們自己的遍歷操作函數(shù),即:start、next、stop和show四個函數(shù),并且把相關(guān)的操作函數(shù)放在seq_operations結(jié)構(gòu)體中,這個結(jié)構(gòu)體需要作為參數(shù)在proc偽文件打開時傳遞進(jìn)去,即seq_open的22通過重寫cmos內(nèi)核代碼,讓其不再刷屏,mycat函數(shù)能夠33./mycat/proc/tasklist1中,讀一次相當(dāng)于調(diào)用上面的四個函數(shù),之前自己寫的procread065,所以會一直讀,會刷屏。Mycat1,而myprocread直接返回總在使用seq-file機制proc進(jìn)程信息的設(shè)計中通過創(chuàng)建一個內(nèi)核模塊,利用proc偽文件系統(tǒng)以及seq_file機制,我學(xué)會了怎樣去查看進(jìn)程的信息。在這其中比較困惑的是proc怎樣和seq_file機制綁定在一起的。概括來說,procseq_open、seq_read、seq_write等函數(shù)來進(jìn)行操作,所以創(chuàng)建proc文件時要在proc_create中傳入需要使file_operations作為參數(shù),其中的操作函數(shù)可以自己重新定義。在遍歷proc文件中的每個記錄時需要使用seq_operations中指定的四個操作函數(shù)(必須指定,而且也只有四個):start、show、next和stop,這個結(jié)構(gòu)體需要在打開proc文件時作為參數(shù)傳遞給seq_open函數(shù)。事實上,在本章實驗中我們遍歷進(jìn)程Linux進(jìn)程控制塊結(jié)構(gòu)task_struct時其實使用的是task_struct鏈表自帶的遍歷機制,比如宏定義next_task、初始位置init_task等。1、通過POSIX多線程創(chuàng)建,了解基于POSIX多線程編程下加鎖和不加鎖兩種情況的區(qū)別,理解并掌握POSIX多線程環(huán)境下利用同步機制解2、通過Linux多線程創(chuàng)建,了解基于Linux多線程編程下加鎖和不加鎖兩種情況的區(qū)別,理解并掌握Linux多線程環(huán)境下利用同步機制解決多1、掌握基于POSIX會IEEE開發(fā)的標(biāo)準(zhǔn)族,部分已經(jīng)被ISO接受為國際標(biāo)準(zhǔn)。IEEEStd.1003.1-1990或POSIX.1為操作系統(tǒng)的服務(wù)例程提供了源代碼級別的C2、掌握基于Linux雖然Linux支持POSIX的多線程編程,但是Linux也有自己一套用于基于POSIX多線程編1、基于POSIX在主線創(chuàng)建一個新的線程,完成一個從1到UPPER(指定的累加2、基于POSIX在主線創(chuàng)建兩個新線程,合作完成一個從1到UPPER(指定的累3、基于POSIX常見的機制是同步機制在主線創(chuàng)建兩個新線程使用基于互斥鎖的同步機制合作完成一個從1到UPPER(指定的累加次數(shù)上限)的累加工作,1、基于Linux定次數(shù)的累加工作,指定累加次數(shù)為upper。也就是說最終累加結(jié)果為:2、基于Linux多線程編程:TestAndSet在主線創(chuàng)建四個新的進(jìn)程,分別使用臨界區(qū)模型完成對一個共享變量counterupper。3、基于Linux線程主動放棄CPUintnanospleep(conststructtimespec*req,structtimespec一行則是用于說明使用的tsStruct結(jié)構(gòu)體timespecStructtime_ttv_sec;/*seconds秒Longinttv_nsec;/*nanoseconds納秒}nanosleep函數(shù)功能是暫停某個線程直到規(guī)定的時間后恢復(fù),參數(shù)seq就是要暫停的時間其中req->tv_sec是以秒為單位而tv_nsec以納秒為單位,范圍是[0, ]。由于調(diào)用nanosleep是使用線程進(jìn)入TASK_RUNNING狀態(tài),這就意味著有可能會沒有等到規(guī)定的時間就因為當(dāng)然是在rem不為空的情況下。運行結(jié)果及分12345、TestAndSet6總本次多線程環(huán)境下的競爭條件與同步機制設(shè)計對Linux支持的線程創(chuàng)建機制進(jìn)行了一個簡單的對比分析。其中pthread函數(shù)庫支持用戶級的線mutexspinlocksemaphoreLinuxLinuxclone的線程由內(nèi)核實現(xiàn)調(diào)度。根據(jù)內(nèi)核數(shù)據(jù)的粒度不同、范圍不同,Linux同步機制同樣有的選擇,包括原子操作、內(nèi)存屏障、自旋鎖、信號量1、通過對進(jìn)程控制塊task_struct中的mm_struct變量mm的操作,了棧、以及引入的動態(tài)庫等。2、通過mm中的vm_struct變量mmap的操作,了解每個段的運行情1mm.cMakefile21mm.cMakefile圖5.1是Operatingsystemconcepts中的一個關(guān)于內(nèi)存地址映射的基本示意圖。它說明了在In IA32結(jié)構(gòu)中從邏輯地址到物理地址的映0MAX-1,MAXpagingpaging
圖 兩線程使用互斥鎖同步完成一個計數(shù)工selector1613TIIA328k8kRPL。段寄存
16位16位段基地址全局段表寄全局段表寄存5.2從邏輯地址到線性地址(虛擬地址)5.2·CPUselector:offset”·在段寄存器中裝入段選擇符,同時把32位地址偏移量裝入某個寄存器·根據(jù)選擇符中的索引值、TI及RPL值,再根據(jù)相應(yīng)描述符表中的段地址和段界限,進(jìn)行一系列檢查;如果該段無問題,就取出相應(yīng)的描述·將描述符中的32位段址和放在ESI、EDI等中的32位有效地址相32page頁頁0圖5.3 Linux線性空間在32位平臺上為4GB的固定大小。linux內(nèi)核將這4G字節(jié)的空間分為兩部分。內(nèi)核使用最高的1G字節(jié)(從虛地址0xC 0xFFFFFFFF,地址0x 因為每個進(jìn)程可以通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核,因此,Linux內(nèi)核空間由系統(tǒng)內(nèi)的所有進(jìn)程共享。于是,從具體進(jìn)程的角度看,每個進(jìn)程可以擁有4G(0~3G,在系統(tǒng)啟動時,Linux內(nèi)核映像被裝入到物理地址0x 地方,即1MB開始區(qū)間前面1M空間留做他用。Linux內(nèi)核映像應(yīng)該在虛內(nèi)存的內(nèi)核空間中,所以程序在內(nèi)映像時在所有的符號地址加上一個偏移量0xC 對比較簡單的。給定一個虛地址X,其對應(yīng)的物理地址為“X-PAGE_OFFSET”;反之,給定一個物理地址Y,則其對應(yīng)的虛地址為“Y+PAGE_OFFSET相對于內(nèi)核空間而言,Linux形成的空洞(holes)則可以放入動態(tài)文件。盡管每個用戶進(jìn)程可以擁3GBLinux每個Linux進(jìn)程都需要創(chuàng)建多個段,這些段對應(yīng)不同的虛擬區(qū)域。一個虛存區(qū)域是虛存空間中的續(xù)區(qū)域,在這個區(qū)域中的信息具有相同的操作和特性。Linuxtaskstructstructvolatile unsigned structmm_struct structthread_struct /*其他省略task_struct被稱為進(jìn)程控制塊PCB,因為它記錄每一個進(jìn)程所mmstruct,被稱為“內(nèi)存描述符”。mmstructLinux在Linux系統(tǒng)中,進(jìn)程控制塊task_struct是內(nèi)核中的數(shù)據(jù)結(jié)mmmm_struc
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年小區(qū)電梯廣告合同
- 2025年多功能展覽中心項目可行性研究報告
- 2025年城市綠色交通規(guī)劃項目可行性研究報告
- 2025年智能公共照明系統(tǒng)項目可行性研究報告
- 2025年開放共享的智慧教育平臺可行性研究報告
- 2025年兒童早教中心開發(fā)可行性研究報告
- 湖南水利合同范本
- 中介建檔協(xié)議書
- 燃?xì)獍踩珔f(xié)議合同
- 樂山市2023下半年四川樂山大佛風(fēng)景名勝區(qū)管理委員會考核招聘事業(yè)單位人員考核筆試歷年參考題庫典型考點附帶答案詳解(3卷合一)
- 學(xué)堂在線 雨課堂 學(xué)堂云 大數(shù)據(jù)機器學(xué)習(xí) 期末考試答案
- 英語配音環(huán)節(jié)教學(xué)課件
- 企業(yè)檔案安全教育培訓(xùn)課件
- 房地產(chǎn)質(zhì)量管理體系與措施
- 2025中國工業(yè)傳感器行業(yè)市場白皮書
- 陳列考核管理辦法
- 天津醫(yī)院節(jié)能管理辦法
- 電力設(shè)計行業(yè)標(biāo)準(zhǔn)有效版本清單(2025版)
- 中國金屬鈰行業(yè)調(diào)查報告
- JG/T 382-2012傳遞窗
- 礦山電工培訓(xùn)教材
評論
0/150
提交評論