<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《Linux內核設計與實現(xiàn)》讀書筆記(五)- 系統(tǒng)調用

      主要內容:

      1. 什么是系統(tǒng)調用
      2. Linux上的系統(tǒng)調用實現(xiàn)原理
      3. 一個簡單的系統(tǒng)調用的實現(xiàn)

      1. 什么是系統(tǒng)調用

      簡單來說,系統(tǒng)調用就是用戶程序和硬件設備之間的橋梁。

      用戶程序在需要的時候,通過系統(tǒng)調用來使用硬件設備。

      系統(tǒng)調用的存在,有以下重要的意義:

      1)用戶程序通過系統(tǒng)調用來使用硬件,而不用關心具體的硬件設備,這樣大大簡化了用戶程序的開發(fā)。

          比如:用戶程序通過write()系統(tǒng)調用就可以將數(shù)據(jù)寫入文件,而不必關心文件是在磁盤上還是軟盤上,或者其他存儲上。

      2)系統(tǒng)調用使得用戶程序有更好的可移植性。

          只要操作系統(tǒng)提供的系統(tǒng)調用接口相同,用戶程序就可在不用修改的情況下,從一個系統(tǒng)遷移到另一個操作系統(tǒng)。

      3)系統(tǒng)調用使得內核能更好的管理用戶程序,增強了系統(tǒng)的穩(wěn)定性。

          因為系統(tǒng)調用是內核實現(xiàn)的,內核通過系統(tǒng)調用來控制開放什么功能及什么權限給用戶程序。

          這樣可以避免用戶程序不正確的使用硬件設備,從而破壞了其他程序。

      4)系統(tǒng)調用有效的分離了用戶程序和內核的開發(fā)。

          用戶程序只需關心系統(tǒng)調用API,通過這些API來開發(fā)自己的應用,不用關心API的具體實現(xiàn)。

          內核則只要關心系統(tǒng)調用API的實現(xiàn),而不必管它們是被如何調用的。

       

      用戶程序,系統(tǒng)調用,內核,硬件設備的調用關系如下圖:

      image

       

      2. Linux上的系統(tǒng)調用實現(xiàn)原理

      要想實現(xiàn)系統(tǒng)調用,主要實現(xiàn)以下幾個方面:

      1. 通知內核調用一個哪個系統(tǒng)調用
      2. 用戶程序把系統(tǒng)調用的參數(shù)傳遞給內核
      3. 用戶程序獲取內核返回的系統(tǒng)調用返回值

      下面看看Linux是如何實現(xiàn)上面3個功能的。

      2.1 通知內核調用一個哪個系統(tǒng)調用

      每個系統(tǒng)調用都有一個系統(tǒng)調用號,系統(tǒng)調用發(fā)生時,內核就是根據(jù)傳入的系統(tǒng)調用號來知道是哪個系統(tǒng)調用的。

      在x86架構中,用戶空間將系統(tǒng)調用號是放在eax中的,系統(tǒng)調用處理程序通過eax取得系統(tǒng)調用號。

      系統(tǒng)調用號定義在內核代碼:arch/alpha/include/asm/unistd.h 中,可以看出linux的系統(tǒng)調用不是很多。

      2.2 用戶程序把系統(tǒng)調用的參數(shù)傳遞給內核

      系統(tǒng)調用的參數(shù)也是通過寄存器傳給內核的,在x86系統(tǒng)上,系統(tǒng)調用的前5個參數(shù)放在ebx,ecx,edx,esi和edi中,如果參數(shù)多的話,還需要用個單獨的寄存器存放指向所有參數(shù)在用戶空間地址的指針。

      一般的系統(tǒng)調用都是通過C庫(最常用的是glibc庫)來訪問的,Linux內核提供一個從用戶程序直接訪問系統(tǒng)調用的方法。

      參見內核代碼:arch/cris/include/arch-v10/arch/unistd.h

      里面定義了6個宏,分別可以調用參數(shù)個數(shù)為0~6的系統(tǒng)調用

      _syscall0(type,name)
      _syscall1(type,name,type1,arg1)
      _syscall2(type,name,type1,arg1,type2,arg2)
      _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)
      _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)
      _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5)
      _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6)

      超過6個參數(shù)的系統(tǒng)調用很罕見,所以這里只定義了6個。

      2.3 用戶程序獲取內核返回的系統(tǒng)調用返回值

      獲取系統(tǒng)調用的返回值也是通過寄存器,在x86系統(tǒng)上,返回值放在eax中。

       

      3. 一個簡單的系統(tǒng)調用的實現(xiàn)

      了解了Linux上系統(tǒng)調用的原理,下面就可以自己來實現(xiàn)一個簡單的系統(tǒng)調用。

      3.1 環(huán)境準備

      為了不破壞現(xiàn)有系統(tǒng),我是用虛擬機來實驗的。

      主機:fedora16 x86_64系統(tǒng) + kvm(一種虛擬技術,就像virtualbox,vmware等)

      虛擬機: 也是安裝fedora16 x86_64系統(tǒng)(通過virt-manager很容易安裝一個系統(tǒng))

       

      下載內核源碼:www.kernel.org  下載最新的就行

       

      3.2 修改內核源碼中的相應文件

      主要修改以下文件:

      arch/x86/ia32/ia32entry.S
      arch/x86/include/asm/unistd_32.h
      arch/x86/include/asm/unistd_64.h
      arch/x86/kernel/syscall_table_32.S
      include/asm-generic/unistd.h
      include/linux/syscalls.h
      kernel/sys.c

      我在sys.c中追加了2個函數(shù):sys_foo和sys_bar

      如果是在x86_64的內核中增加一個系統(tǒng)調用,只需修改 arch/x86/include/asm/unistd_64.h,比如sys_bar。

      修改內容參見下面的diff文件:

      diff -r new/arch/x86/ia32/ia32entry.S old/arch/x86/ia32/ia32entry.S
      855d854
      <     .quad sys_foo
      diff -r new/arch/x86/include/asm/unistd_32.h old/arch/x86/include/asm/unistd_32.h
      357d356
      < #define __NR_foo    349
      361c360
      < #define NR_syscalls 350
      ---
      > #define NR_syscalls 349
      diff -r new/arch/x86/include/asm/unistd_64.h old/arch/x86/include/asm/unistd_64.h
      689,692d688
      < #define __NR_foo            312
      < __SYSCALL(__NR_foo, sys_foo)
      < #define __NR_bar            313
      < __SYSCALL(__NR_bar, sys_bar)
      diff -r new/arch/x86/kernel/syscall_table_32.S old/arch/x86/kernel/syscall_table_32.S
      351d350
      <     .long sys_foo
      diff -r new/include/asm-generic/unistd.h old/include/asm-generic/unistd.h
      694,695d693
      < #define __NR_foo 272
      < __SYSCALL(__NR_foo, sys_foo)
      698c696
      < #define __NR_syscalls 273
      ---
      > #define __NR_syscalls 272
      diff -r new/kernel/sys.c old/kernel/sys.c
      1920,1928d1919
      < 
      < asmlinkage long sys_foo(void)
      < {
      <     return 1112223334444555;
      < }
      < asmlinkage long sys_bar(void)
      < {
      <     return 1234567890;
      < }

       

      3.3 編譯內核

      #cd linux-3.2.28
      #make menuconfig  (選擇要編譯參數(shù),如果不熟悉內核編譯,用默認選項即可)
      #make all  (這一步真的時間很長......)
      #make modules_install
      #make install  (這一步會把新的內核加到啟動項中)
      #reboot  (重啟系統(tǒng)進入新的內核)

       

      3.4 編寫調用的系統(tǒng)調用的代碼

      #include <unistd.h>
      #include <sys/syscall.h>
      #include <string.h>
      #include <stdio.h>
      #include <errno.h>
      
      
      #define __NR_foo 312
      #define __NR_bar 313
      
      int main()
      {
              printf ("result foo is %ld\n", syscall(__NR_foo));
              printf("%s\n", strerror(errno));
              printf ("result bar is %ld\n", syscall(__NR_bar));
              printf("%s\n", strerror(errno));
              return 0;
      }

      編譯運行上面的代碼:

      #gcc test.c -o test
      #./test

      運行結果如下:

      result foo is 1112223334444555
      Success
      result bar is 1234567890
      Success
      posted @ 2017-08-24 17:24  閆寶平  閱讀(219)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲一区二区日韩综合久久| 国产麻豆一区二区精彩视频 | 国产午夜亚洲精品国产成人| 资源县| 免费的特黄特色大片| 国产69精品久久久久99尤物| 在线 欧美 中文 亚洲 精品| 久久九九99这里有视频| 亚洲a∨无码无在线观看| 人妻精品动漫h无码| 亚洲一区二区日韩综合久久| 国产精品永久久久久久久久久| 国产对白老熟女正在播放| 双乳奶水饱满少妇呻吟免费看| 亚洲av伊人久久综合性色| 五月综合网亚洲乱妇久久| 国产一区二区三区禁18| 久久综合亚洲鲁鲁九月天| 亚洲人妻精品一区二区| 亚洲精品动漫一区二区三| 精品久久久久久亚洲综合网| 亚洲色欲在线播放一区 | 亚洲成色精品一二三区| 国产精品 第一页第二页| 野花社区在线观看视频| 中文字幕日韩精品东京热| 高级艳妇交换俱乐部小说| 精品久久久bbbb人妻| 黑色丝袜脚交视频麻豆| 久久青草国产精品一区| 日本偷拍自影像视频久久| 同仁县| 国产精品一区二区三区色| 人妻无码中文字幕免费视频蜜桃| 在线 欧美 中文 亚洲 精品| 亚洲av永久无码精品水牛影视| 日韩一区二区三区av在线| 日韩AV高清在线看片| 亚洲av不卡电影在线网址最新| 中文字幕日韩人妻一区| 华安县|