日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

20169217 《Linux内核原理与分析》第七周作业

發布時間:2024/4/15 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 20169217 《Linux内核原理与分析》第七周作业 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 首先完善一下上周的作業,上周的嵌入式匯編并沒有編譯成功,究其原因,還是我對傳參理解不到位,write函數的3個參數都要傳遞才行,并不是只傳謠打印的字符串就行。

? 在老師的指導下并且參考了毛衛華同學的代碼之后,終于編譯成功啦!

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int main() {char* msg = "liuhongyi20169217";int len = 17;int result = 0;asm volatile ("mov %2, %%edx;\n\r" /*傳入參數:要顯示的字符串長度*/"mov %1, %%ecx;\n\r" /*傳入參賽:文件描述符(stdout)*/"mov $1, %%ebx;\n\r" /*傳入參數:要顯示的字符串*/"mov $4, %%eax;\n\r" /*系統調用號:4 sys_write*/"int $0x80" /*觸發系統調用中斷*/:"=m"(result) /*輸出部分:本例并未使用*/:"m"(msg),"r"(len) /*輸入部分:綁定字符串和字符串長度變量*/:"%eax"); return 0; }

??? 下面我們就基于上周完成的嵌入式匯編的代碼完成本周的實驗。

??? 首先根據mooc的課程的要求執行實驗第一部分:

???

??? 1.更新menu代碼到最新版。

cd LinuxKernel rm menu -rf git clone https://github.com/mengning/menu.git cd menu

??? 2.在main函數中增加menuconfig。

??? 3.增加對應的write和writeasm函數。

??? 基于上節課調用函數的代碼,編寫代碼如下:

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int writetext() {write(1,"liuhongyi20169217",17);return 0; }int writeasm() {char* msg = "liuhongyi20169217";int len = 17;int result = 0;asm volatile ("mov %2, %%edx;\n\r" /*傳入參數:要顯示的字符串長度*/"mov %1, %%ecx;\n\r" /*傳入參賽:文件描述符(stdout)*/"mov $1, %%ebx;\n\r" /*傳入參數:要顯示的字符串*/"mov $4, %%eax;\n\r" /*系統調用號:4 sys_write*/"int $0x80" /*觸發系統調用中斷*/:"=m"(result) /*輸出部分:本例并未使用*/:"m"(msg),"r"(len) /*輸入部分:綁定字符串和字符串長度變量*/:"%eax"); return 0; }int main() {PrintMenuOS();SetPrompt("MenuOS>>");MenuConfig("version","MenuOS V1.0(Based on Linux 3.18.6)",NULL);MenuConfig("quit","Quit from MenuOS",Quit);MenuConfig("time","Show System Time",Time);MenuConfig("time-asm","Show System Time(asm)",TimeAsm);MenuConfig("writetext","writetext",writetext);MenuConfig("writeasm","write(asm)",writeasm);ExecuteMenu(); }

??? 4.重新編譯

$ make rootfs

??? 實驗的第一部分就完成了,現在進行實驗的第二部分。

??? 使用qemu命令重新啟動內核并使用-s和-S參數,命令如下:

$ cd /home/shiyanlou/LinuxKernel $ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

???

??? 此時使用gdb進行調試,重新開一個窗口,并且輸入如下命令:

$ gdb (gdb) file linux-3.18.6/vmlinux (gdb) target remote:1234 (gdb) continue

?? 系統調用流程圖如下:??

? ???

遇到問題:

??? 本次實驗從一開始就遇到比較棘手的問題,那就是無法搭建實驗環境。無論是用自己的虛擬機還是用實驗樓的虛擬實驗環境,都無法從實驗給的鏈接中更新git,所以導致后續的實驗無法順利完成,但是我根據mooc上講的內容,將實驗步驟列了出來。解決方案目前還沒有,希望老師給予指導。

??? 書上內容總結:

??? 教材內容第9,10章主要介紹了同步和并發的概念和Linux解決同步和并發的方案,即鎖和原子操作。

??? 1.最簡單的確保同步的方法,原子操作。我的理解就是將數據的讀寫和對數據的操作捆綁到一起執行,在這個過程中不能被打斷,這樣便可以保證同步。

??? 2.介紹了解決并發執行的機制,鎖。并討論了多種鎖機制,內核中最普通的鎖是自旋鎖,輕量級單獨持有者的鎖是爭用時忙,還有睡眠鎖mutex。我對于鎖機制的理解是黨多個線程搶占同一資源時,需要先行進入的的線程對資源進行鎖定,待執行完成后,再釋放資源給其他線程。

轉載于:https://www.cnblogs.com/dkyliuhongyi/p/6019972.html

總結

以上是生活随笔為你收集整理的20169217 《Linux内核原理与分析》第七周作业的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。