Linux第三周作業

1.三個法寶
①存儲程序計算機工作模型,計算機系統最最基礎性的邏輯結構;

②函數調用堆棧,堆棧完成了計算機的基本功能:函數的參數傳遞機制和局部變量存取 ;

③中斷,多道程序操作系統的基點,沒有中斷機制程序只能從頭一直運行結束才有可能開始運行其他程序。

2.堆棧的基本功能:
(1)函數調用框架、傳遞參數(32位)、保存返回地址(如eax保存返回值/內存地址)、提供局部變量空間

(2)與堆棧相關的寄存器:esp和ebp
與堆棧相關的操作:push(入棧時esp指針會減4)、pop(出棧時esp指針會加4)

(3)CS:eip總是指向下一條指令的地址
C代碼中嵌入匯編代碼

一、實驗要求
完成一個簡單的時間片輪轉多道程序內核代碼,代碼見視頻中或從mykernel找。
詳細分析該精簡內核的源代碼并給出實驗截圖,撰寫一篇署名博客,并在博客文章中注明“真實姓名(與最后申請證書的姓名務必一致) + 原創作品轉載請注明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 ”,博客內容的具體要求如下:
題目自擬,內容圍繞操作系統是如何工作的進行;
博客中需要使用實驗截圖
博客內容中需要仔細分析進程的啟動和進程的切換機制
總結部分需要闡明自己對“操作系統是如何工作的”理解。
二、實驗過程
首先通過cd LinuxKernel/Linux-3.9.4,“cd”表示進入目錄Linux-3.9.4,用rm -rf mykernel命令強力刪除mykernel。使用命令patch -pl< ../mykernel_for_linux3.9.4sc.patch,patch命令用于為特定軟件包打補丁,該命令使用diff命令對源文件進行操作。格式:patch [選項] [原始文件 [補丁文件]
1249774-20171019214528396-698987615.png

在Linux系統中,專門提供了一個make命令來自動維護目標文件,與手工編譯和連接相比,make命令的優點在于他只更新修改過的文件(在Linux中,一個文件被創建或更新后有一個最后修改時間,make命令就是通過這個最后修改時間來判斷此文件是否被修改),(make還是不太懂)使用命令qemu -kernel arch/x86/boot/bzImage搭建目標環境

1249774-20171019214539193-432658422.png
1249774-20171019214608724-2004631184.png
通過cd mykernel ,打開mykernel目錄,用ls命令看到目錄內容中包括 mymain.c ,myinterrupt.c,使用命令vi mymain.c以及vi myinterrupt.c可以看到代碼
1249774-20171019215854287-193941297.png

1249774-20171019215857084-1920002623.png

可以看到每當i增加100000會執行(printf函數輸出my_ start_ kernel _ here …)時會觸發一次時鐘中斷,在由時鐘中斷處理函數輸出(>..>>my_timer_handler<<…<)
二 操作系統內核源代碼分析
首先是mypcb.h
+#define MAX_TASK_NUM 10 // max num of task in system //進程參與內核時間片轉,這個系統最多有10個進程
+#define KERNEL_STACK_SIZE 1024*8 //每個進程棧的大小
+#define PRIORITY_MAX 30 //priority range from 0 to 30

  • +/* CPU-specific state of this task */
    +struct Thread {
  • unsigned long ip;//point to cpu run address //用于eip的保存
  • unsigned long sp;//point to the thread stack's top address //用于esp的保存
  • //todo add other attrubte of system thread
    +};
    +//PCB Struct
    +typedef struct PCB{ //用于表示一個進程,定義了進程管理相關的數據結構
  • int pid; // pcb id //進程編號
  • volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
  • char stack[KERNEL_STACK_SIZE];// each pcb stack size is 1024*8
  • /* CPU-specific state of this task */
  • struct Thread thread;
  • unsigned long task_entry;//the task execute entry memory address 進程第一次執行開始的地方
  • struct PCB *next;//pcb is a circular linked list //用于構造進程鏈表
  • unsigned long priority;// task priority
  • //todo add other attrubte of process control block
    +}tPCB;
  • +//void my_schedule(int pid);
    +void my_schedule(void); //調用了my_schedule
    接下來是mymain.c
    +tPCB task[MAX_TASK_NUM];
    +tPCB * my_current_task = NULL;
    +volatile int my_need_sched = 0; //定義一個標志,用來判斷是否需要調度
  • +void my_process(void);
    +unsigned long get_rand(int );
  • +void sand_priority(void)
    +{
  • int i;
  • for(i=0;i<MAX_TASK_NUM;i++)
  •   task[i].priority=get_rand(PRIORITY_MAX);
    +}
    +void __init my_start_kernel(void)
    +{
  • int pid = 0; 初始化一個進程0
  • /* Initialize process 0*/
  • task[pid].pid = pid;
  • task[pid].state = 0;/* -1 unrunnable, 0 runnable, >0 stopped */
  • // set task 0 execute entry address to my_process
  • task[pid].task_entry = task[pid].thread.ip = (unsigned long)my_process;
  • task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
  • task[pid].next = &task[pid];
  • /fork more process /
  • for(pid=1;pid<MAX_TASK_NUM;pid++)
  • {
  •    memcpy(&task[pid],&task[0],sizeof(tPCB));
  •    task[pid].pid = pid;
  •    task[pid].state = -1;
  •    task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
  • task[pid].priority=get_rand(PRIORITY_MAX);//each time all tasks get a random priority //每個進程都有自己的堆棧,把創建好的新進程放到進程列表的尾部
  • }
  • task[MAX_TASK_NUM-1].next=&task[0];
  • printk(KERN_NOTICE "\n\n\n\n\n\n system begin :>>>process 0 running!!!<<<\n\n");
  • /* start process 0 by task[0] */
  • pid = 0;
  • my_current_task = &task[pid];
    +asm volatile(
  • "movl %1,%%esp\n\t" /* set task[pid].thread.sp to esp */
  • "pushl %1\n\t" /* push ebp */
  • "pushl %0\n\t" /* push task[pid].thread.ip */
  • "ret\n\t" /* pop task[pid].thread.ip to eip */
  • "popl %%ebp\n\t"
  • :
  • : "c" (task[pid].thread.ip),"d" (task[pid].thread.sp) /* input c or d mean %ecx/%edx*/
    +);
    +}
    +void my_process(void) //定義所有進程的工作,if語句表示循環1000萬次才有機會判斷是否需要調度。
    +{
  • int i = 0;
  • while(1)
  • {
  •    i++;
  •    if(i%10000000 == 0)
  •    {
  •        if(my_need_sched == 1)
  •        {
  •            my_need_sched = 0;
  •   sand_priority();
  •   my_schedule();  
  •  }
  •    }
  • }
    +}//end of my_process
  • +//produce a random priority to a task
    +unsigned long get_rand(max)
    +{
  • unsigned long a;
  • unsigned long umax;
  • umax=(unsigned long)max;
  • get_random_bytes(&a, sizeof(unsigned long ));
  • a=(a+umax)%umax;
  • return a;
    +}

轉載于:https://www.cnblogs.com/2017yaya/p/7675254.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391098.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么時候使用靜態方法

問題&#xff1a;什么時候使用靜態方法 I am wondering when to use static methods? Say if I have a class with a few getters and setters, a method or two, and I want those methods only to be invokable on an instance object of the class. Does this mean I shou…

RESTful API淺談

2019獨角獸企業重金招聘Python工程師標準>>> 上半年時候&#xff0c;部門有組織的討論了一下實踐微服務的技術話題&#xff0c;主要內容是SOA服務和微服務各自的優勢和難點&#xff0c;其中有提到關于RESTful API設計方法。 正好最近在深入的學習HTTP協議&#xff0…

spring自動注入--------

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:p"http://www.springframework.org/schema/p"xmlns:c"http://www.springframework.org/schema/c"xmlns…

變量的作用域和生存期:_生存分析簡介:

變量的作用域和生存期:In the previous article, I have described the Kaplan-Meier estimator. To give a quick recap, it is a non-parametric method to approximating the true survival function. This time, I will focus on another approach to visualizing a surviv…

數字孿生營銷_如何通過數字營銷增加您的自由職業收入

數字孿生營銷There are a lot of ways we could go with this topic as it’s a huge one, but I just want to cover the nuggets here and make it simple as well as practical to understand and implement.我們可以采用很多方法來處理這個主題&#xff0c;因為它是一個很大…

您的網卡配置暫不支持1000M寬帶說明

國內寬帶網速越來越快&#xff0c;運營商更是在今年初紛紛推進千兆寬帶業務。為了讓用戶更好地了解網絡狀況&#xff0c;360寬帶測速器發布新版&#xff0c;優化了寬帶測速范圍&#xff0c;可有效支持最高1000&#xff2d;的帶寬測量。此外&#xff0c;寬帶測速器能檢測用戶網卡…

教輔的組成(網絡流果題 洛谷P1231)

題目描述 蒟蒻HansBug在一本語文書里面發現了一本答案&#xff0c;然而他卻明明記得這書應該還包含一份練習題。然而出現在他眼前的書多得數不勝數&#xff0c;其中有書&#xff0c;有答案&#xff0c;有練習冊。已知一個完整的書冊均應該包含且僅包含一本書、一本練習冊和一份…

Java中怎么樣檢查一個字符串是不是數字呢

問題&#xff1a;Java中怎么樣檢查一個字符串是不是數字呢 在解析之前&#xff0c;怎么樣檢查一個字符串是不是數字呢 回答一 這些通常是由一個簡單的用戶自定義函數去解決的&#xff08;即&#xff0c;自帶的 “isNumeric” 函數&#xff09; 例如 public static boolean…

小程序支付api密鑰_如何避免在公共前端應用程序中公開您的API密鑰

小程序支付api密鑰問題 (The Problem) All you want to do is fetch some JSON from an API endpoint for the weather, some book reviews, or something similarly simple.您要做的就是從API端點獲取一些有關天氣的JSON&#xff0c;一些書評或類似的簡單內容。 The fetch qu…

永無止境_永無止境地死:

永無止境Wir befinden uns mitten in der COVID-19-Pandemie und damit auch im Mittelpunkt einer medialen Geschichte, die durch eine noch nie dagewesene Komplexitt und Dynamik gekennzeichnet ist. Wie kann Informationsdesign helfen, diese Explosion von Nachrich…

HDU4612 Warm up —— 邊雙聯通分量 + 重邊 + 縮點 + 樹上最長路

題目鏈接&#xff1a;http://acm.split.hdu.edu.cn/showproblem.php?pid4612 Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 7206 Accepted Submission(s): 1681 Problem DescriptionN planets are …

Android sqlite load_extension漏洞解析

路人甲 2015/09/25 14:540x01 sqlite load_extensionSQLite從3.3.6版本&#xff08;http://www.sqlite.org/cgi/src/artifact/71405a8f9fedc0c2&#xff09;開始提供了支持擴展的能力&#xff0c;通過sqlite_load_extension API&#xff08;或者load_extensionSQL語句&#xf…

去除Java字符串中的空格

問題&#xff1a;去除Java字符串中的空格 俺有一個像這樣的字符串 mysz "namejohn age13 year2001";我想要去除字符串里面的空格。我嘗試使用 trim() &#xff0c;但是呢它只去除了字符串前后的空格。我也嘗試用 ("\W", “”)&#xff0c;但是它把也給搞…

谷歌瀏覽器bug調試快捷鍵_Bug壓榨初學者指南:如何使用調試器和其他工具查找和修復Bug

谷歌瀏覽器bug調試快捷鍵As web developers, it often feels like we spend more time fixing bugs and trying to solve problems than we do writing code. In this guide well look at some common debugging techniques, so lets get stuck in.作為Web開發人員&#xff0c;…

吳恩達神經網絡1-2-2_圖神經網絡進行藥物發現-第1部分

吳恩達神經網絡1-2-2預測溶解度 (Predicting Solubility) 相關資料 (Related Material) Jupyter Notebook for the article Jupyter Notebook的文章 Drug Discovery with Graph Neural Networks — part 2 圖神經網絡進行藥物發現-第2部分 Introduction to Cheminformatics 化學…

再利用Chakra引擎繞過CFG

xlab 2015/12/24 15:00Author:[email protected]0x00 前言本文源自一次與TK閑聊&#xff0c;期間得知成功繞過CFG的經過與細節(參考&#xff1a;[利用Chakra JIT繞過DEP和CFG])。隨即出于對技術的興趣&#xff0c;也抽出一些時間看了相關的東西&#xff0c;結果發現了另一處繞…

論文搜索源

中國科學院文獻情報中心 見下圖 中國計算機學會推薦國際學術會議和期刊目錄 EI學術會議中心,        engieer village 轉載于:https://www.cnblogs.com/cxy-941228/p/7693097.html

重學TCP協議(10)SYN flood 攻擊

1.SYN flood 攻擊 SYN Flood&#xff08;半開放攻擊&#xff09;是一種拒絕服務&#xff08;DDoS&#xff09;攻擊&#xff0c;其目的是通過消耗所有可用的服務器資源使服務器不可用于合法流量。通過重復發送初始連接請求&#xff08;SYN&#xff09;數據包&#xff0c;攻擊者能…

大數據入門課程_我根據數千個數據點對互聯網上的每門數據科學入門課程進行了排名...

大數據入門課程by David Venturi大衛文圖里(David Venturi) A year ago, I dropped out of one of the best computer science programs in Canada. I started creating my own data science master’s program using online resources. I realized that I could learn everyt…

python 數據框缺失值_Python:處理數據框中的缺失值

python 數據框缺失值介紹 (Introduction) In the last article we went through on how to find the missing values. This link has the details on the how to find missing values in the data frame. https://medium.com/kallepalliravi/python-finding-missing-values-in-…