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

歡迎訪問 生活随笔!

生活随笔

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

windows

HDU操作系统课程设计实验一

發布時間:2023/12/10 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU操作系统课程设计实验一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HDU操作系統課程設計實驗一

  • 實驗一:Linux內核編譯及添加系統調用
    • 一、設計目的
    • 二、內容要求
    • 三、實驗內容
      • 修改Linux內核標簽
      • 添加系統調用
      • 編譯內核
      • 顯示當前系統名稱和版本的系統調用
      • 修改nice和prio值的系統調用
      • 改變主機名稱為自定義字符串的系統調用
    • 四、實驗核心代碼

實驗一:Linux內核編譯及添加系統調用

這是一個很簡單、基礎的實驗,只需要看懂源碼,然后在源碼中稍作修改就行。注意:編譯內核花費時間比較長,長則一天,短則2-3小時,如果用虛擬機記得多開機器核心數目(機器核心數目越多越快,但不要超過物理機的核心數目)和內存(內存不足會導致中途編譯失敗),最好一次成功。

一、設計目的

Linux是開源操作系統,用戶可以根據自身系統需要裁剪、修改內核,定制出功能更加合適、運行效率更高的系統,因此,編譯Linux內核是進行內核開發的必要基本功。
在系統中根據需要添加新的系統調用是修改內核的一種常用手段,通過本次實驗,讀者應理解Linux系統處理系統調用的流程以及增加系統調用的方法。

二、內容要求

1、內核修改時有自己標簽,用 dmesg驗證
2、Linux內核標簽(系統啟動顯示一次)
3、顯示當前系統名稱和版本的系統調用
4、修改nice和prio值的系統調用功能
5、改變主機名稱為自定義字符串的系統調用

三、實驗內容

修改Linux內核標簽

找到init/main.c中的start_kernel函數,加入一句pr_notice(“學號 姓名”);//pr_notice()用來打印內核日志,可以用dmesg命令查看代碼。

添加系統調用

1.分配系統調用號,修改系統調用表
查看系統調用表(arch/x86/entry/syscalls/syscall_64.tbl),每個系統調用在表中占一個表項,其格式為<系統調用號><commom/64/x32><系統調用名><服務例程入口地址>,在表中為系統調用添加一個系統調用號。
2.申明系統調用服務例程原型
Linux系統調用服務例程的原型聲明在文件linux-4.12/include/linux/syscalls.h中,可在文件末尾添加類似asmlinkage long sys_zwhsyscall(void);的系統調用代碼。
3.實現系統調用服務例程
下面為新調用編寫服務例程,通常添加在sys.c文件中,其完整路徑為linux-5.9.1/kernel/sys.c。具體編程思路可以看下面。
4.重新編譯內核
5.編寫用戶態程序測試系統調用

編譯內核

  • 在開始完全重新編譯之前,需要用makemrproper命令清除殘留的.config和.o文件。
  • 運行make menuconfig命令配置內核。
  • 內核配置完成后,執行make命令,開始編譯內核。
  • 執行make modules命令,開始編譯模塊。
  • 執行make modules_install命令,開始安裝模塊。執行make install命令,開始安裝內核。
  • 執行update-grub2命令,自動修改grub引導程序。
  • 執行reboot命令,重啟系統。
  • 顯示當前系統名稱和版本的系統調用

    顯示當前系統名稱和版本的系統調用函數可以參考linux-5.9.1/kernel/sys.c中的newuname函數。
    linux-5.9.1的newuname函數(不一定適用于其他版本)
    SYSCALL_DEFINEX類型函數的格式:SYSCALL_DEFINEX(函數名,參數變量類型1,參數變量名1,…,…參數變量類型X,參數變量名X),系統調用函數的定義格式。

    SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name) {struct new_utsname tmp;down_read(&uts_sem);memcpy(&tmp, utsname(), sizeof(tmp));up_read(&uts_sem);if (copy_to_user(name, &tmp, sizeof(tmp)))return -EFAULT;if (override_release(name->release, sizeof(name->release)))return -EFAULT;if (override_architecture(name))return -EFAULT;return 0; }

    修改nice和prio值的系統調用

    修改nice和prio值的系統調用可以通過set_user_nice()函數改變進程的nice值,從而改變prio值,實現系統調用的功能。

    SYSCALL_DEFINE5(mysetnice,pid_t,pid,int,flag,int,nicevalue,void __user*,prio,void __user*,nice){struct pid * kpid;struct task_struct * task;kpid = find_get_pid(pid);/* 返回pid */task = pid_task(kpid, PIDTYPE_PID);/* 返回task_struct */int n;n = task_nice(task);/* 返回進程當前nice值 */int p;p = task_prio(task);/*返回進程當前prio值*/if(flag == 1){printk("Change nice: %d ,prio: %d ",n,p);set_user_nice(task, nicevalue);/* 修改進程nice值 */n = task_nice(task);/*重新取得進程nice值*/p = task_prio(task);/*重新獲取進程prio值 這里和參考資料不一樣!!! */printk("to nice: %d ,prio: %d\n",n,p);copy_to_user(nice,&n,sizeof(n));/*將nice值拷貝到用戶空間*/copy_to_user(prio,&p,sizeof(p));/*將prio值拷貝到用戶空間*/return 0;}else if(flag == 0){printk("nice : %d ,prio: %d\n",n,p);copy_to_user(nice,&n,sizeof(n));/*將nice值拷貝到用戶空間*/copy_to_user(prio,&p,sizeof(p));/*將prio值拷貝到用戶空間*/return 0;}return EFAULT; }

    改變主機名稱為自定義字符串的系統調用

    改變主機名稱為自定義字符串的系統調用函數可以參考linux-5.9.1/kernel/sys.c中的sethostname函數。
    可以用uname -n命令來查看,修改hostname但不修改hostname的映射可能會導致shell命令使用警告(不影響使用),重啟(hostname會改為默認值)或添加映射,即可解決。
    linux-5.9.1的sethostname函數(不一定適用于其他版本)

    SYSCALL_DEFINE2(sethostname, char __user *, name, int, len) {int errno;char tmp[__NEW_UTS_LEN];if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN))return -EPERM;if (len < 0 || len > __NEW_UTS_LEN)return -EINVAL;errno = -EFAULT;if (!copy_from_user(tmp, name, len)) {struct new_utsname *u;down_write(&uts_sem);u = utsname();memcpy(u->nodename, tmp, len);memset(u->nodename + len, 0, sizeof(u->nodename) - len);errno = 0;uts_proc_notify(UTS_PROC_HOSTNAME);up_write(&uts_sem);}return errno; }

    四、實驗核心代碼

    sys.c:系統調用函數代碼。
    mychangename.c:測試mychangename的系統調用,功能是改變主機名稱為自定義字符串的系統調用。
    mysetnice.c:測試mysetnice系統調用的程序,功能是修改nice和prio值的系統調用功能。
    myshowname.c:測試myshowname系統調用的程序,功能是顯示當前系統名稱和版本的系統調用。
    完整代碼詳見:HDU-operation-system-course-design-code/實驗一/

    總結

    以上是生活随笔為你收集整理的HDU操作系统课程设计实验一的全部內容,希望文章能夠幫你解決所遇到的問題。

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