版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程設(shè)計(jì)說(shuō)明課程名稱(chēng) 操作系統(tǒng)課程設(shè) 業(yè):物聯(lián)網(wǎng)工 班級(jí) 2012級(jí)2設(shè)計(jì)人 2012010519102015116一、課程設(shè)計(jì)題目:Linux 5、Linux六、命題發(fā)出日期: LK 模塊的編譯、添加和撤 XXXXX XXXXX XXX XXXXX XXXXX XXXXX XXXXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXXXX 19XXXXX 19XXXXX 20XXXXX 30XXXXXXX 30XXXXX 30XXXXX 31XXXXX 31XXXXXX 311、通過(guò)……,了解…,理解21、2、3、設(shè)計(jì)說(shuō)明(含系統(tǒng)框圖和(或)主要算法的流程圖運(yùn)行結(jié)果及分總procCMOS1LKM2Linuxmycat,了解proc3LKM模塊,并對(duì)比,更深刻地理解內(nèi)核模塊編程,1、在Linux中有一個(gè)應(yīng)用非常廣泛令:cat,它的作用很多,其中一個(gè)是2mycat.c代碼的編輯,文件保存后,可以按著文件頭部注釋中說(shuō)明的方法進(jìn)行編譯,$gccmycat.c-o文件編譯成功后,按著文件中說(shuō)明的方法運(yùn)行$./mycat<filename>可以是mycat.cpp或其他文件的名稱(chēng)請(qǐng)觀察命令運(yùn)3、對(duì)照代碼、結(jié)合操作系統(tǒng)課程內(nèi)容、以及圖2.1,4、運(yùn)行本節(jié)命令,5、代碼編輯完成后,請(qǐng)保存為cmos.c。然后在相同文件夾下編輯Makefile文件,內(nèi)容如下:Makefile保存后,在同一 下運(yùn)行make;如果報(bào)錯(cuò),請(qǐng)根據(jù)錯(cuò)誤提示修改;如果一切順利,那么就生成了cmos.ko文件,可以使用ls命令查看。這表示初步的編譯已經(jīng)通過(guò)了。確認(rèn)cmos.ko生成后,可以通過(guò)如下命令來(lái)添加該LKM模塊:$sunsmodcmos內(nèi)核源文件,Makfile6、添加、撤銷(xiāo)cmos.ko內(nèi)核模塊,并使用cat、mycat應(yīng)用程序進(jìn)試1$cat/pro$cat$cat$cat$cat$cat$cat$cat2、完成如下代碼的撰寫(xiě),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);}}文件保存后,可以按著文件頭部注釋中說(shuō)明的方法進(jìn)行編譯,$gccmycat.c-o文件編譯成功后,按著文件中說(shuō)明的方法運(yùn)行$./mycat<filename>mycat.cpp3運(yùn)行本節(jié)命令,查看輸出結(jié)果$cat/prouinfo-CPU的信息(型號(hào),家族,緩存大小等)$cat/proc/modules-$cat/proc/meminfo-$cat/proc/iomemIO$cat/proc/self/maps-進(jìn)程cat實(shí)際的進(jìn)程空間分$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*.oMakefile保存后,在同一 下運(yùn)行make;如果報(bào)錯(cuò),請(qǐng)根據(jù)錯(cuò)誤提示修改;如果一切順利,那么就生成了cmos.ko文件,可以使用ls命令查看這表示初步的編譯已經(jīng)通過(guò)了確認(rèn)cmos.ko生成后,可以通過(guò)如下命令來(lái)添加該LKM模塊:$sunsmod 下查看是否生成了cmos偽文件,也可以使用dmesg來(lái)查看內(nèi)核日志中的模塊添加信息一切順利沒(méi)有問(wèn)題,我們可以運(yùn)行如下命令來(lái)RTC信息了:$cat/proc/cmos你的顯示器上的輸出結(jié)果是什么?是不是RTC信息不斷的在刷屏?按<Ctrl>+C組合鍵,可以停止刷屏。查看我們的cmos.c內(nèi)核源文件,可以確認(rèn)我們確實(shí)是只想輸出一次RTC信息啊,但為什么一直在不斷的輸出呢?現(xiàn)在再?lài)L試使用我們自己開(kāi)發(fā)的mycat應(yīng)用程序來(lái)查看RTC輸出:$./mycat5、“新內(nèi)核新特性:ubuntu14.04LTSproc特性”刪除了老內(nèi)核環(huán)境支持的多個(gè)版本的procLinuxproc_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ù)是一個(gè)內(nèi)聯(lián)函數(shù)(inline),proc_creat_dataproc_creat-data的原型如下externstructproc_dir_entry*proc_create_donstchar*,umode_t,structproc_dir_entry*,conststructfile_operations*,void*);所以嚴(yán)格的說(shuō),在版本的Linux內(nèi)核中,proc偽文件事實(shí)上只有一新版本的Linux內(nèi)核刪除了在ubuntu12.04LTS(Linux3.2.0內(nèi)核)經(jīng)常proc,ubuntu12.04LTS中我們使用一個(gè)proc自定義的讀函數(shù)就可以正確的讀出相關(guān)信息了。為此,在新版本Linuxprocseq_file機(jī)制綁定在一起了。也就是說(shuō),在Linux新版本的內(nèi)核中proc偽文件的讀寫(xiě)等操作都是根據(jù)seq_file機(jī)制來(lái)進(jìn)行的。運(yùn)行結(jié)果及分1、$cat/pro$cat$cat$cat$cat$cat$cat$cat2、$sunsmod3、嘗試使用自己開(kāi)發(fā)的mycat應(yīng)用程序來(lái)查看RTC$./mycat總/proc偽文件系統(tǒng)提供了一個(gè)基于文件形式的Linux接口。它可些狀態(tài)往往都是處于內(nèi)核空間的,對(duì)程序員來(lái)說(shuō)是作系統(tǒng)隔絕開(kāi)的。通過(guò)本次設(shè)計(jì),我們可以看到為了解決應(yīng)用程序與內(nèi)核數(shù)據(jù)的問(wèn)題,也即我們不可能讓一個(gè)類(lèi)似于cat的應(yīng)用程序直接去讀CMOS中的RTC信息,我們添加了一個(gè)cmos.ko內(nèi)核模塊,該模塊創(chuàng)建了一個(gè)名為cmosproc偽文件,CMOS中RTC信息了。當(dāng)用戶(hù)程序,比如cat,要打開(kāi)/proc/cmos偽文件或/proc/cmos的信息時(shí),cat程序中的標(biāo)準(zhǔn)庫(kù)函數(shù)把相應(yīng)的操作參數(shù)傳遞給操作系統(tǒng)內(nèi)核對(duì)應(yīng)的LKM模塊,也即我們編寫(xiě)的cmos.ko,由cmos.ko調(diào)用相應(yīng)的內(nèi)核操作函數(shù)打開(kāi)該設(shè)備或者相關(guān)信息,然后把操作結(jié)果返1、通過(guò)使用seq-file機(jī)制proc進(jìn)程信息,了解seq_file機(jī)制,理解Linux重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct;2seq_fileproc偽文件,Linux內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct,也就是進(jìn)程控制塊PCB(ProcessControlBlock)的信息1、了解seq_file2、實(shí)現(xiàn)procseq_file/proklist的信4、重新編輯編輯代碼并運(yùn)試新的tasklist模塊,并用mycat和cat命1、編輯tasklist.c內(nèi)核代碼,添加到當(dāng)前內(nèi)核中運(yùn)行,并且通過(guò)mycat和cat命令查看/proklistproc偽文件與seq_fileproctasklistpid在my_proc_entryproc_create(modname0,NULL,&my_proc);了參數(shù)&my_procproctasklist的操作函數(shù),它的具體staticconststructfile_operationsmy_proc{.owner= = = =.release=其中my_open函數(shù)是自己寫(xiě)的,但是只有一句就是調(diào)用seq_open函數(shù)。seq_open通常在打開(kāi)文件的時(shí)候使用;seq_read,seq_lseek和seq_releaseread,llseekrelease,由頭文件seq_file.h定義,在seq_file.c中實(shí)現(xiàn)。2、查看/proklist的信息,觀察這些進(jìn)程處于什么狀態(tài)3、重新編輯代碼并運(yùn)試新的tasklist模塊,并用mycat和cat命令分1是否存在差異,并分析。運(yùn)行結(jié)果及分11procseq_file機(jī)制是這樣綁定在一起的文件級(jí)別的操作綁定。proc在創(chuàng)建后,seq_file機(jī)制支持的打開(kāi)、讀、寫(xiě)(seq_open、seq_read、seq_write)等函數(shù)進(jìn)行文件級(jí)別的操作;工作,那么我們就需要自己重寫(xiě)這些函數(shù),這些函數(shù)都需要在file_operations結(jié)構(gòu)體中,并在proc文件創(chuàng)建時(shí)作為參數(shù)傳遞進(jìn)去,即proc_create中seq_file對(duì)象時(shí)需要完成我們自己的工作,那么就需要定義我們自己的遍歷操作函數(shù),即:startnextstopshow四個(gè)函數(shù),并且把相關(guān)的操作函數(shù)放在seq_operations結(jié)構(gòu)體中,這個(gè)結(jié)構(gòu)體需要作為參數(shù)在proc偽文件打開(kāi)時(shí)傳遞進(jìn)去,即seq_open的第二22通過(guò)重寫(xiě)cmos內(nèi)核代碼,讓其不再刷屏,mycat函數(shù)能夠運(yùn)33兩次運(yùn)行./mycat/proklist顯示不一樣1中,讀一次相當(dāng)于調(diào)用上面的四個(gè)函數(shù),之前自己寫(xiě)的procread065,所總在使用seq-file機(jī)制proc進(jìn)程信息的設(shè)計(jì)中通過(guò)創(chuàng)建一個(gè)內(nèi)核模塊,利用proc偽文件系統(tǒng)以及seq_file機(jī)制,我學(xué)會(huì)了怎樣去查看進(jìn)程的信息。在這其中比較困惑的是proc怎樣和seq_file機(jī)制綁定在一起的。概括來(lái)說(shuō),procseq_open、seq_read、seq_write等函數(shù)來(lái)進(jìn)行操作,所以創(chuàng)建proc文件時(shí)要在proc_create中傳入需要使用的file_operations作為參數(shù),其中的操作函數(shù)可以自己重新定義。在遍歷proc文件中的每個(gè)記錄時(shí)需要使用seq_operations中指定的四個(gè)操作函數(shù)(必須指定,而且也只有四個(gè)):start、show、nextstop,這個(gè)結(jié)構(gòu)體需要在打procseq_open,在本章實(shí)驗(yàn)中我們遍歷進(jìn)程Linux進(jìn)程控制塊結(jié)構(gòu)task_struct時(shí)其實(shí)使用的是task_struct鏈表自帶的遍歷機(jī)制,比如宏定義next_task、初始位置init_task等。1、通過(guò)POSIX多線程創(chuàng)建,了解基于POSIX多線程編程下加鎖和不加鎖兩種情況的區(qū)別,理解并掌握POSIX多線程環(huán)境下利用同步機(jī)制解決2、通過(guò)Linux多線程創(chuàng)建,了解基于Linux多線程編程下加鎖和不加鎖兩種情況的區(qū)別,理解并掌握Linux多線程環(huán)境下利用同步機(jī)制解決多1、掌握基于POSIX會(huì)IEEE開(kāi)發(fā)的標(biāo)準(zhǔn)族,部分已經(jīng)被ISO接受為國(guó)際標(biāo)準(zhǔn)。IEEEStd.1003.1-1990或POSIX.1為操作系統(tǒng)的服務(wù)例程提供了源代碼級(jí)別的C2、掌握基于Linux雖然Linux支持POSIXLinux也有自己一套用于基于POSIX多線程編1、基于POSIX在主線創(chuàng)建一個(gè)新的線程,完成一個(gè)從1到UPPER(指定的累加2、基于POSIX在主線創(chuàng)建兩個(gè)新線程,合作完成一個(gè)從1到UPPER(指定的累3、基于POSIX常見(jiàn)的機(jī)制是同步機(jī)制。在主線創(chuàng)建兩個(gè)新線程,使用基于互斥鎖的1PE(指定的累加次數(shù)上限總的累加次數(shù)不變?;贚inux多線程編1、基于Linux定次數(shù)的累加工作,指定累加次數(shù)為upper。也就是說(shuō)最終累加結(jié)果為:2、基于Linux多線程編程:TestAndSet在主線創(chuàng)建四個(gè)新的進(jìn)程,分別使用臨界區(qū)模型完成對(duì)一個(gè)共享變量counterupper。3、基于Linux線程主動(dòng)放棄CPU。intnanospleep(conststructtimespec*req,structtimespec一行則是用于說(shuō)明使用的tsStruct結(jié)構(gòu)體timespecStructtime_ttv_sec;/*seconds秒Longinttv_nsec;/*nanoseconds納秒}nanosleep函數(shù)功能是暫停某個(gè)線程直到規(guī)定的時(shí)間后恢復(fù),參數(shù)seq就是要暫停的時(shí)間其中req->tv_sec是以秒為單位而tv_nsec以納秒為單位,范圍是[0, ]。由于調(diào)用nanosleep是使用線程進(jìn)入TASK_RUNNING狀態(tài),這就意味著有可能會(huì)沒(méi)有等到規(guī)定的時(shí)間就因?yàn)槠渌盘?hào)而被喚醒,此時(shí)函數(shù)返回-1,且還剩余的時(shí)間會(huì)被記錄在rem中,當(dāng)然是在rem不為空的情況下。運(yùn)行結(jié)果及分12345、TestAndSet6總本次多線程環(huán)境下的競(jìng)爭(zhēng)條件與同步機(jī)制設(shè)計(jì)對(duì)Linux支持的線程創(chuàng)建機(jī)制進(jìn)行了一個(gè)簡(jiǎn)單的對(duì)比分析。其中pthread函數(shù)庫(kù)支持用戶(hù)級(jí)的線自旋鎖spinlock、信號(hào)量semaphore等,這些機(jī)制都在Linux內(nèi)核中得到了支持。而Linux通過(guò)clone函數(shù)支持內(nèi)核級(jí)的線程創(chuàng)建,創(chuàng)建的線程由 1、通過(guò)對(duì)進(jìn)程控制塊task_struct中的mm_struct變量mm的操作,了以及引入的動(dòng)態(tài)庫(kù)等。2、通過(guò)mm中的vm_struct變量mmap的操作,了解每個(gè)段的運(yùn)行情1mm.cMakefile21mm.cMakefile從邏輯地址到物理地址的過(guò)圖5.1是Operatingsystemconcepts中的一個(gè)關(guān)于內(nèi)存地址的基本示意圖。它說(shuō)明了在In IA32結(jié)構(gòu)中從邏輯地址到物理地址的過(guò)程。邏輯地址可以看做是CPU發(fā)出的地址,從某種程度上講野可以看做
pagingpaging圖 兩線程使用互斥鎖同步完成一個(gè)計(jì)數(shù)工從邏輯地址到線性地址空間的過(guò)程見(jiàn)圖。圖5.2中斷寄存器中的RPL。段寄存
16位16位段基地址以及段的5.2從邏輯地址到線性地址(虛擬地址)5.2·CPUselector:offset”32·根據(jù)選擇符中的索引值、TI及RPL值,再根據(jù)相應(yīng)描述符表中的段地址將描述符中的32位段址和放在ESIEDI等中的32位有效地址相加,3200
page頁(yè)圖5.3 頁(yè)Linux線性空間在32位平臺(tái)上為4GB的固定大小linux內(nèi)核將這4G字節(jié)的空間分為兩部分。內(nèi)核使用最高的1G字節(jié)(從虛地址0xC 0xFFFFFFFF,地址0x 到0xBFFFFFFF)則由各個(gè)進(jìn)程使用,稱(chēng)為“用戶(hù)空間。(0~3G,在系統(tǒng)啟動(dòng)時(shí),Linux0x開(kāi)始的地方,即1MB開(kāi)始區(qū)間前面1M空間留做他用。Linux內(nèi)核映像應(yīng)該在虛擬0xC,這樣內(nèi)核映像在內(nèi)核空間的實(shí)際起始地址是0xC.而在從虛擬地址到實(shí)際物理地址時(shí),內(nèi)核空間 )開(kāi)始。由此可見(jiàn),內(nèi)核時(shí)相對(duì)反之,給定一個(gè)物理地址Y,則其對(duì)應(yīng)的虛地址為“Y+PAGE_OFFSET其中棧空間自頂向下增長(zhǎng),而堆空間則自下而上增長(zhǎng)。在堆和棧之間形成的空洞(holes)則可以放入動(dòng)態(tài)文件。盡管每個(gè)用戶(hù)進(jìn)程可以擁有3GB的用戶(hù)空間,但這是虛擬地址空間,用戶(hù)在這個(gè)虛擬內(nèi)存中并不能真正運(yùn)行,必須把用戶(hù)空間中的虛地址最終到實(shí)際的物理空間才行,而這種的建立和管理則是由我們上一節(jié)上述的段機(jī)制和頁(yè)機(jī)制完成的。Linux一個(gè)虛存區(qū)域是虛存空間
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)實(shí)虛擬技術(shù)的
- 公司解散清算專(zhuān)項(xiàng)法律服務(wù)人員調(diào)配方案
- 小學(xué)數(shù)學(xué)教師考試試題及答案
- 2026年房地產(chǎn)市場(chǎng)風(fēng)險(xiǎn)評(píng)估方法
- 2026年流體力學(xué)在船舶建造中的關(guān)鍵作用
- 市馬龍縣中級(jí)社會(huì)工作者考試《社會(huì)工作綜合能力》押題密卷及答案
- 安全風(fēng)險(xiǎn)預(yù)測(cè)方法講解
- 2022年廣西科技師范學(xué)院教師招聘考試試題及答案
- 特種設(shè)備安全管理考核試題題庫(kù)及答案
- 數(shù)控車(chē)高級(jí)技師理論試卷及答案
- 2025年山東省濟(jì)南市中考英語(yǔ)真題卷含答案解析
- 侍酒師崗前實(shí)操操作考核試卷含答案
- 2025-2026學(xué)年六年級(jí)英語(yǔ)上冊(cè)期末試題卷(含聽(tīng)力音頻)
- 【一年級(jí)】【數(shù)學(xué)】【秋季上】期末家長(zhǎng)會(huì):花開(kāi)有“數(shù)”一年級(jí)路【課件】
- 2025四川成都高新區(qū)婦女兒童醫(yī)院招聘技師、醫(yī)生助理招聘5人參考題庫(kù)附答案解析
- 初中語(yǔ)文新課程標(biāo)準(zhǔn)與解讀課件
- 中建通風(fēng)與空調(diào)施工方案
- GB/T 3683-2023橡膠軟管及軟管組合件油基或水基流體適用的鋼絲編織增強(qiáng)液壓型規(guī)范
- 浙江省通用安裝工程預(yù)算定額第八冊(cè)
- 高考語(yǔ)言運(yùn)用題型之長(zhǎng)短句變換 學(xué)案(含答案)
- 2023年婁底市建設(shè)系統(tǒng)事業(yè)單位招聘考試筆試模擬試題及答案解析
評(píng)論
0/150
提交評(píng)論