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内核原理与分析》第七周作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS3幻灯片制作心得
- 下一篇: HDU 5936 Difference