91aaa在线国内观看,亚洲AV午夜福利精品一区二区,久久偷拍人视频,久久播这里有免费视播

<strong id="fvuar"></strong>

  • <sub id="fvuar"><dl id="fvuar"><em id="fvuar"></em></dl></sub>

    1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

      手機(jī)站
      千鋒教育

      千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

      千鋒教育

      掃一掃進(jìn)入千鋒手機(jī)站

      領(lǐng)取全套視頻
      千鋒教育

      關(guān)注千鋒學(xué)習(xí)站小程序
      隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

      當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > ubuntu如何添加系統(tǒng)調(diào)用

      ubuntu如何添加系統(tǒng)調(diào)用

      來(lái)源:千鋒教育
      發(fā)布人:wjy
      時(shí)間: 2022-12-26 16:39:35 1672043975

        【目的】

        理解系統(tǒng)調(diào)用的概念,熟悉系統(tǒng)調(diào)用的用法。

        【環(huán)境】

        PC:ubuntu 12.04

        內(nèi)核:Linux:3.2.0

        【要求】

        編程創(chuàng)建系統(tǒng)調(diào)用sunpluscall(),實(shí)現(xiàn)功能是顯示字符串到屏幕上。

        編譯3.2.0內(nèi)核,用新內(nèi)核引導(dǎo)系統(tǒng)。

        編程調(diào)用自己創(chuàng)建的系統(tǒng)調(diào)用。

        【原理】

        操作系統(tǒng)是用戶(hù)與計(jì)算機(jī)之間的接口,用戶(hù)通過(guò)操作系統(tǒng)的幫助,可以快速、有效和安全可靠地使用計(jì)算機(jī)系統(tǒng)中的各種資源來(lái)解決自己的問(wèn)題。為了使用戶(hù)方便的使用操作系統(tǒng),OS向用戶(hù)提供了“用戶(hù)與操作系統(tǒng)的接口”。這種接口支持用戶(hù)與操作系統(tǒng)之間進(jìn)行交互,這些接口可以被分為命令和程序接口兩種。前者直接提供給用戶(hù)在鍵盤(pán)終端上使用;后者則是提供給用戶(hù)(主要是程序員)編程時(shí)使用。而要學(xué)習(xí)系統(tǒng)調(diào)用,首先要從程序接口入手。

        1、 程序接口

        程序接口是操作系統(tǒng)專(zhuān)門(mén)為用戶(hù)程序設(shè)置的,也是用戶(hù)程序取得OS服務(wù)的唯一途徑。程序接口通常由系統(tǒng)調(diào)用組成。在每個(gè)操作系統(tǒng)中,通常都有幾十上百條系統(tǒng)調(diào)用,它們的作用各有不同,有的用于進(jìn)程控制、有的用于存儲(chǔ)管理、有的用于文件管理等等。在MS WINDOWS下面進(jìn)行過(guò)WIN32編程的人員應(yīng)該對(duì)windows提供的API函數(shù)有一定的印象,這些API函數(shù)就是windows操作系統(tǒng)提供給程序員的系統(tǒng)調(diào)用接口。而Linux作為一個(gè)操作系統(tǒng),當(dāng)然有它自己的系統(tǒng)調(diào)用。

        2、 系統(tǒng)調(diào)用

        通常,在OS的核心中都設(shè)置了一組用于實(shí)現(xiàn)各種系統(tǒng)功能的子程序,并將它們提供給程序員調(diào)用。程序員在需要OS提供某種服務(wù)的時(shí)候,便可以調(diào)用一條系統(tǒng)調(diào)用命令,去實(shí)現(xiàn)希望的功能,這就是系統(tǒng)調(diào)用。各個(gè)不同的操作系統(tǒng)有各自的系統(tǒng)調(diào)用,正如前文所講的windows API,便是windows的系統(tǒng)調(diào)用,linux的系統(tǒng)調(diào)用與之不同的是linux由于內(nèi)核代碼完全公開(kāi),所以可以細(xì)致的分析出其系統(tǒng)調(diào)用的機(jī)制。

        1、 系統(tǒng)調(diào)用和普通過(guò)程的區(qū)別

        (1)運(yùn)行于不同的系統(tǒng)狀態(tài)

        如前所述,用戶(hù)程序可以通過(guò)系統(tǒng)調(diào)用進(jìn)入系統(tǒng)空間,而普通過(guò)程則只能在用戶(hù)空間當(dāng)中運(yùn)行。

        (2)通過(guò)軟中斷切換

        由于用戶(hù)程序使用系統(tǒng)調(diào)用后要進(jìn)入系統(tǒng)空間,所以需要調(diào)用一個(gè)軟中斷;而普通過(guò)程在被調(diào)用時(shí)沒(méi)有這個(gè)過(guò)程。

        2、 系統(tǒng)調(diào)用的類(lèi)型

        系統(tǒng)調(diào)用的作用與它所在的操作系統(tǒng)有密切關(guān)系,根據(jù)操作系統(tǒng)的性質(zhì)不同,它們所提供的系統(tǒng)調(diào)用會(huì)有一定的差異,不過(guò)對(duì)于普通操作系統(tǒng)而言,應(yīng)該具有下面幾類(lèi)系統(tǒng)調(diào)用。

        (1)進(jìn)程控制類(lèi)型。

        (2)文件操縱類(lèi)型。

        (3)進(jìn)程通信類(lèi)型。

        (4)數(shù)據(jù)管理類(lèi)型。

        3、 系統(tǒng)調(diào)用的實(shí)現(xiàn)機(jī)制。

        由于操作系統(tǒng)的不同,其系統(tǒng)調(diào)用的實(shí)現(xiàn)方式可能不同,然而實(shí)現(xiàn)機(jī)制應(yīng)該是大致相同的,一般包含下面幾個(gè)步驟:

        (1)設(shè)置系統(tǒng)調(diào)用號(hào)

        在系統(tǒng)當(dāng)中,往往設(shè)置多條系統(tǒng)調(diào)用命令,并賦予每條系統(tǒng)調(diào)用命令一個(gè)唯一的系統(tǒng)調(diào)用號(hào)。

        (2)處理系統(tǒng)調(diào)用

        操作系統(tǒng)當(dāng)中有個(gè)一張系統(tǒng)調(diào)用入口表。表中的每個(gè)表目都對(duì)應(yīng)一條系統(tǒng)調(diào)用命令,它包含有該系統(tǒng)調(diào)用自帶參數(shù)的數(shù)目、系統(tǒng)調(diào)用命令處理程序的入口地址等等。操作系統(tǒng)內(nèi)核便是根據(jù)所輸入的系統(tǒng)調(diào)用號(hào)在該表中查找到到相應(yīng)的系統(tǒng)調(diào)用,進(jìn)而轉(zhuǎn)入它的入口地址去執(zhí)行它。

        【實(shí)現(xiàn)步驟】

        1、拷貝源碼

        拷貝linux-3.2.tar.bz2 到虛擬機(jī)/usr/src目錄下

        2、解壓源碼

        #tar xvjf linux-3.2.tar.bz2

        3、添加源代碼

        #vi linux-3.2/kernel/sunplus.c

        新建一個(gè)文件sunplus.c。在此文件中添加系統(tǒng)調(diào)用函數(shù)源代碼,該函數(shù)的名稱(chēng)應(yīng)該是新的系統(tǒng)調(diào)用名稱(chēng)前面加上sys_標(biāo)志。假設(shè)新加的系統(tǒng)調(diào)用為sunpluscall,則該函數(shù)應(yīng)該這樣寫(xiě)

        #include

        asmlinkage long sys_sunpluscall(void)

        {

        printk(KERN_EMERG "this is sunpluscall KERN_EMERG\n");

        printk(KERN_ALERT "this is sunpluscall KERN_ALERT\n");

        printk(KERN_CRIT "this is sunpluscall KERN_CRIT\n");

        printk(KERN_ERR "this is sunpluscall KERN_ERR\n");

        printk(KERN_WARNING "this is sunpluscall KERN_WARNING\n");

        printk(KERN_NOTICE "this is sunpluscall KERN_NOTICE\n");

        printk(KERN_INFO "this is sunpluscall KERN_INFO\n");

        printk(KERN_DEBUG "this is sunpluscall KERN_DEBUG\n");

        return 0;

        }

        4、修改Makefile(編譯內(nèi)核時(shí)編譯源代碼)

        把sunplus.c添加到kernel目錄下的Makefile中,使其在make編譯內(nèi)核的時(shí)候能編譯到內(nèi)核中。

        #vi linux-3.2/kernel/Makefile

        在14行 obj-y += groups.o 下面插入一行

        obj-y += sunplus.o

        如圖:

      ubuntu如何添加系統(tǒng)調(diào)用1

        5、鏈接新的系統(tǒng)調(diào)用

        添加新的系統(tǒng)調(diào)用之后,下一個(gè)任務(wù)是讓LINUX內(nèi)核的其余部分知道該程序的存在。增加新函數(shù)的鏈接,需要進(jìn)行下面的操作。

        (1)為新的系統(tǒng)調(diào)用添加系統(tǒng)調(diào)用號(hào)

        系統(tǒng)調(diào)用號(hào)的定義格式如下:

        #define __NR_name NNN

        其中,name用系統(tǒng)調(diào)用名稱(chēng)代替,而NNN是該系統(tǒng)調(diào)用對(duì)應(yīng)的號(hào)碼。應(yīng)該將新的系統(tǒng)調(diào)用名稱(chēng)加到清單的最后,并給它分配已經(jīng)用到的系統(tǒng)調(diào)用號(hào)后面的一個(gè)號(hào)碼。

        LINUX內(nèi)核自身用到的系統(tǒng)調(diào)用號(hào)已經(jīng)用到348了。而如果讀者還要自行增加系統(tǒng)調(diào)用,就必須從349開(kāi)始。

        #vi linux-3.2/arch/x86/include/asm/unistd_32.h

        在文件356行#define __NR_process_vm_writev 348 下面插入一行

        #define __NR_sunpluscall 349

        把 #define NR_syscalls 349

        修改成

        #define NR_syscalls 350

        NR_syscalls 這個(gè)宏表示系統(tǒng)調(diào)用的總個(gè)數(shù)。

        如圖:

      ubuntu如何添加系統(tǒng)調(diào)用2

        (2)修改系統(tǒng)調(diào)用的指針列表

        vi linux-3.2/arch/x86/kernel/syscall_table_32.S

        在文件350行.long sys_process_vm_writev 下面添加一行

        .long sys_sunpluscall

        如圖:

      ubuntu如何添加系統(tǒng)調(diào)用3

        (3)vi linux-3.2/arch/x86/ia32/ia32entry.S

        在文件854行.quad compat_sys_process_vm_eritev 下面添加一行

        .quad sys_sunpluscall

        如圖:

      ubuntu如何添加系統(tǒng)調(diào)用4

        6、重新編譯、安裝

        (1)清除殘留的.config和.o

        在linux-3.2 目錄下 輸入命令

        #make mrproper

        該命令的功能在于清除當(dāng)前目錄下殘留的.config和.o文件,這些文件一般是以前編譯時(shí)未清理而殘留的。而對(duì)于第一次編譯的代碼來(lái)說(shuō),不存在這些殘留文件,所以可以略過(guò)此步,但是如果該源代碼以前被編譯過(guò),那么強(qiáng)烈建議執(zhí)行此命令,否則后面可能會(huì)出現(xiàn)未知的問(wèn)題。

        (2)配置編譯選項(xiàng)

        作為操作系統(tǒng)的內(nèi)核,其內(nèi)容和功能必然非常繁雜,包括處理器調(diào)度,內(nèi)存管理,文件系統(tǒng)管理,進(jìn)程通訊以及設(shè)備管理等等,而對(duì)于不同的硬件,其配置選項(xiàng)也不相同,所以在編譯源代碼之前必須設(shè)置編譯選項(xiàng)。

        配置命令有 make menuconfig 或者make xconfig。我使用的是make menuconfig,但是前提條件是要裝ncurses。

        1)輸入命令:

        sudo apt-get install libncurses5-dev

        更新安裝ncurses。 注意一定要聯(lián)網(wǎng)。

        2)輸入命令 :

        make menuconfig

        注意把vmware放大到全屏終端放大到全屏,因?yàn)檩斎雖ake menuconfig 命令后會(huì)彈出一個(gè)窗口出來(lái),如果不放大會(huì)出錯(cuò),彈不出窗口。

      ubuntu如何添加系統(tǒng)調(diào)用5

        選擇exit,保存默認(rèn)配置

      ubuntu如何添加系統(tǒng)調(diào)用6

        (3)編譯內(nèi)核

        1)清除以前編譯生成的 .o 等文件。輸入命令:

        make clean

        2)編譯內(nèi)核 此步大約需要 一個(gè)半到兩個(gè)小時(shí)(看機(jī)器的性能)。 輸入命令:

        make bzImage

        3)編譯modules 輸入命令:

        make modules

        4)安裝modules 就是把剛才編譯生產(chǎn)的modules拷到系統(tǒng)文件夾下,以供新內(nèi)核調(diào)用。 輸入命令:

        make modules_install

        5)建立要載入ramdisk的映像文件

        如果linux系統(tǒng)安裝在scsi磁盤(pán)上,這步是必須的,否則可以跳過(guò)。

        切換至/usr/src目錄

        輸入命令:

        mkinitramfs -o /boot/initrd.img-3.2.0 3.2.0

        (4)安裝內(nèi)核

        輸入命令:

        make install

        此時(shí)系統(tǒng)會(huì)把linux內(nèi)核的鏡像文件還有System.map考入到/boot下,然后會(huì)自動(dòng)生成引導(dǎo)菜單。

        7、配置grub

        配置grub引導(dǎo)程序

        ubuntu系統(tǒng)中g(shù)rub的默認(rèn)等待時(shí)間為0,要想進(jìn)入grub菜單,就要修改下等待時(shí)間。

        修改系統(tǒng)文件/etc/default/grub

        將GRUB_HIDDEN_TIMEOUT=0改為GRUB_HIDDEN_TIMEOUT=10

        如圖:

      ubuntu如何添加系統(tǒng)調(diào)用7

        修改系統(tǒng)文件/etc/default/grub后需用update-grub命令自動(dòng)生成啟動(dòng)的選項(xiàng)。

        執(zhí)行

        sudo update-grub

        要想系統(tǒng)重啟后的grub引導(dǎo)界面有我們安裝好的內(nèi)核選項(xiàng)我們還需修改/boot/grub/grub.cfg 文件。

        屏蔽 124行 的 // submenu "Previous Linux versions" {

        在125行 加入一個(gè) {

        如圖:

      ubuntu如何添加系統(tǒng)調(diào)用8

        8、重啟ubuntu

        重啟后按 “shift”鍵, 選擇 Ubuntu , Linux 3.2.0 選項(xiàng)

        如圖:

      ubuntu如何添加系統(tǒng)調(diào)用9

        9、測(cè)試

        (1)編寫(xiě)測(cè)試代碼

        調(diào)用系統(tǒng)調(diào)用的方式是使用_syscall宏。2.6.18版本之前的內(nèi)核,在include/asm-i386/unistd.h文件中定義有7個(gè)_syscall宏,分別是:

        1 _syscall0(type,name)

        2 _syscall1(type,name,type1,arg1)

        3 _syscall2(type,name,type1,arg1,type2,arg2)

        4 _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)

        5 _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)

        6 _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5)

        7 _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6)

        但是自2.6.19版本開(kāi)始,_syscall宏被廢除,我們需要使用syscall函數(shù),通過(guò)指定系統(tǒng)調(diào)用號(hào)和一組參數(shù)來(lái)調(diào)用系統(tǒng)調(diào)用。

        syscall函數(shù)原型為:

        int syscall(int number, ...);

        其中number是系統(tǒng)調(diào)用號(hào),number后面應(yīng)順序接上該系統(tǒng)調(diào)用的所有參數(shù)。

        #include <stdio.h>

        #include <stdlib.h>

        #include

        #include "../linux-3.2/arch/x86/include/asm/unistd_32.h"

        int main(int argc, char *argv[])

        {

        syscall(349);

        return 0;

        }

        (2)測(cè)試

        測(cè)試代碼寫(xiě)完后編譯

        gcc test.c -o test

        注意 系統(tǒng)調(diào)用里的打印printk是有優(yōu)先級(jí)的,在使用printk時(shí)可指定printk的優(yōu)先級(jí),只有printk的優(yōu)先級(jí)大于終端時(shí),終端上才會(huì)顯示出printk打印出的內(nèi)容。

        打印方法1:

        切換至字符模式

        打印方法2:

        使用dmesg函數(shù)

        Ubuntu切換到字符模式下的方法:

        按 ctl + alt + F1 (F1~F6)

        切換回圖形界面的方法

        按 alt + F7

      tags:
      聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
      10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
      請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
      免費(fèi)領(lǐng)取
      今日已有369人領(lǐng)取成功
      劉同學(xué) 138****2860 剛剛成功領(lǐng)取
      王同學(xué) 131****2015 剛剛成功領(lǐng)取
      張同學(xué) 133****4652 剛剛成功領(lǐng)取
      李同學(xué) 135****8607 剛剛成功領(lǐng)取
      楊同學(xué) 132****5667 剛剛成功領(lǐng)取
      岳同學(xué) 134****6652 剛剛成功領(lǐng)取
      梁同學(xué) 157****2950 剛剛成功領(lǐng)取
      劉同學(xué) 189****1015 剛剛成功領(lǐng)取
      張同學(xué) 155****4678 剛剛成功領(lǐng)取
      鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
      董同學(xué) 138****2867 剛剛成功領(lǐng)取
      周同學(xué) 136****3602 剛剛成功領(lǐng)取
      相關(guān)推薦HOT
      為什么SpringBoot的 jar 可以直接運(yùn)行?

      一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫(xiě),它是一種壓縮文件格式,可以將Java項(xiàng)目的類(lèi)文件、資源文件以及依賴(lài)庫(kù)等...詳情>>

      2023-10-14 23:01:49
      站群服務(wù)器是什么?

      站群服務(wù)器的含義與用途站群服務(wù)器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個(gè)人擁有,并且經(jīng)常會(huì)互相鏈...詳情>>

      2023-10-14 22:46:12
      自編碼器是什么?

      一、自編碼器原理自編碼器的設(shè)計(jì)靈感源于神經(jīng)科學(xué)中關(guān)于感知系統(tǒng)的認(rèn)知原理,它的核心思想是將輸入數(shù)據(jù)經(jīng)過(guò)編碼過(guò)程,形成一個(gè)隱藏層的特征表示...詳情>>

      2023-10-14 22:41:10
      什么是云網(wǎng)融合?

      一、云網(wǎng)融合的定義云網(wǎng)融合是指將云計(jì)算與網(wǎng)絡(luò)技術(shù)相結(jié)合,實(shí)現(xiàn)資源的共享、業(yè)務(wù)的協(xié)同,將網(wǎng)絡(luò)與云端服務(wù)深度融合,提供更靈活、高效、安全的...詳情>>

      2023-10-14 22:31:47
      什么是setnx、Redlock、Redisson?

      一、setnxsetnx是Redis中的一個(gè)命令,用于將鍵值對(duì)(key-value)設(shè)置到Redis數(shù)據(jù)庫(kù)中。其中,setnx表示”Set if Not Exists”,即當(dāng)...詳情>>

      2023-10-14 22:22:53