做者 : 韓曙亮java
轉載請出名出處 : http://blog.csdn.net/shulianghan/article/details/38636827linux
操做系統 : git
-- 功能 : 完成基本功能 和 系統管理;shell
-- 組成 : 內核(kernel), 設備驅動程序(driver), 啓動引導程序(bootloader), 命令行(shell), 用戶界面(UI), 文件系統(filesystem), 管理工具;ubuntu
內核組成 : api
-- 中斷 : 響應中斷的中斷服務程序;緩存
-- 調度 : 管理進程間調度的程序, 主要是調度 CPU 執行時間;安全
-- 內存 : 內存管理模塊;服務器
-- 通訊 : 網絡 進程間通訊模塊;網絡
內核提供的保護機制 :
-- 系統態 : 能訪問全部的內存空間 和 硬件設備, 用戶態不能訪問的空間是內核空間;
-- 用戶態 : 只容許使用部分硬件資源的部分功能, 只能訪問內核分配的內存;
系統調用 : 應用程序 經過 系統調用 與內核通訊;
-- 調用過程 : 通常先調用 庫函數, 在經過庫函數 調用內核方法;
庫函數與系統調用關係 :
-- 系統調用是庫函數的一部份 : 有的庫函數須要多個系統調用來完成;
-- 一一對應 : 有的庫函數 與 系統調用是一一對應的關係, 這種狀況下, 至關與應用程序直接在內核運行, 即陷入內核;
設備與內核通訊過程 :
-- a. 打斷內核 : 先發出異步中斷信號, 打斷處理器當前操做, 打斷內核操做;
-- b. 查找中斷 : 內核根據中斷號查找中斷服務程序, 調用程序的中斷處理函數;
-- c. 中斷示例 : 在編輯器中滑動鼠標滾輪, 鼠標會發出一箇中斷信號給內核, 鼠標的緩衝區有數據出現, 內核查找到中斷來自鼠標, 調用中斷處理程序, 執行想要的操做;
中斷程序簡介 :
-- 內核做用 : 執行哪一個中斷須要依靠內核來判斷;
-- 中斷運行環境 : 中斷程序在一個與進程無關的, 專門用於運行中斷處理程序的空間中執行, 這樣作能保證在第一時間響應中斷處理請求;
CPU的三個操做 : 每一個 CPU 一定是三個中的一個;
-- 用戶 進程 : 在用戶空間, 執行用戶進程;
-- 內核 進程 : 在內核空間, 處於進程上下文, 執行進程相關操做;
-- 內核 中斷 : 在內核空間, 處於中斷上下文, 處理中斷;
內核劃分 : 內核是個很大的可執行文件, 會處理不少請求, 內核維持這幾個併發的進程, 每一個進程都會請求系統資源, 如 內存, 網絡 CPU 等;
-- 進程管理 : 負責建立 銷燬進程, 處理進程的輸入輸出, 以及進程間的交互;
-- 內存管理 : 內核的多個模塊 與 內存管理系統經過一套函數進行交互操做;
-- 文件系統 : 內核在非結構化的硬件上創建起一套結構化的文件系統, Linux 支持多個文件系統, ext 是標準的文件系統;
-- 設備控制 : 每一個操做系統都要映射到一個物理設備上, 內核中須要包含全部的驅動;
-- 網絡控制 : 網絡是由操做系統進行控制的, 其消息通常是異步的;
用戶空間 : 權限較低的空間, 該空間對 設備 和 內存的訪問都會受到限制;
內核空間 : 權限最高, 該空間能夠執行任何操做, 能夠訪問全部的設備 和 內存空間;
用戶空間轉到內核空間 : 應用程序發出一個系統調用 或者 被硬件中斷掛起的時候, 會從用戶空間轉到內核空間;
模塊特色 :
-- 註冊 : 模塊須要預先註冊, 才能進行動態加載;
-- 功能 : 模塊實現驅動程序, 文件系統等功能;
-- 加載 : 加載以後模塊運行於內核空間, 與內核組成一體;
模塊相關函數 :
-- init_module : 加載模塊時調用, 預先準備模塊中的函數和變量;
-- cleanup_module : 模塊卸載前調用;
模塊相關命令 :
-- insmod : 加載模塊, 格式 insmod file_name ;
-- rmmod : 卸載模塊, 格式 rmmod file_name ;
-- lsmod : 列出當前使用的模塊, 或者查看 /proc/modules 目錄;
-- modprobe : 探測並加載內核模塊, 給出模塊名稱, 自動尋找加載模塊, 與 insmod 命令的不一樣之處是能夠自動尋找依賴的模塊;
-- depmod : 給模塊生成依賴文件, 生成 /lib/modules/3.11.0-15-generic 文件;
UNIX 內核運行情況 : UNIX 內核是一個 不可分割的靜態可執行庫, 其運行的時候 必須在一個 單獨的地址空間中運行 這個可執行塊;
Linux UNIX 內存管理比較 : MMU 方面;
-- UNIX 內存管理 : UNIX 必須有 MMU (Memory Management Unit 內存管理單元) 頁機制, 該頁機制增強對內存保護, 每一個進程運行在不用的虛擬地址上;
-- Linux 內存管理 : Linux 能夠運行在沒有 MMU 的系統上;
單內核 : 從總體上將內核做爲一個單獨的過程來實現, 運行在一個單獨的地址空間中;
-- 內核間服務通訊 : 全部的內核服務都運行在同一空間, 能夠直接互相調用;
-- 特色 : 該設計使系統簡單, 性能比較高;
-- 但內核系統 : 多數的 UNIX 系統, Linux 系統;
微內核(設計) : 內核的功能分爲多個獨立過程, 每一個過程叫作服務器, 全部的服務器都運行在獨立空間中;
-- 服務器運行空間 : 只有一部份服務器能運行在內核空間中, 其它的服務器在用戶空間中運行;
-- 服務器間消息傳遞 : 採用 進程間通訊 IPC 機制, 內核的各個服務器經過 IPC 機制進行通訊;
-- 服務器空間切換 : 在用戶空間運行的服務器能夠切換到內核空間運行;
微內核的一些設計缺陷 :
-- 開銷大 : 微內核的 IPC 進程間通訊開銷很大, 比函數調用要多;
-- 上下文切換 : 運行在 內核空間 和 用戶空間的 服務器之間進行切換須要時間;
實際實施的微內核 :
-- 服務器位置 : 多數的服務器位於內核空間, 服務器之間能夠相互進行函數調用, 儘可能避免使用 IPC 機制 和 上下文切換;
-- 微內核系統 : Windows 和 Mac OS;
Linux 內核設計 : 模塊化的 多線程 以及內核可調度;
-- 運行空間 : Linux 內核是單內核, 運行在內核空間, 直接調用函數, 無需 IPC 消息傳遞;
-- 吸收的微內核的精華 : 模塊化設計, 搶佔式內核, 支持內核線程, 動態裝載內核模塊;
Linux 與 UNIX 差別 :
-- 對動態加載模塊的支持 : Linux 在須要的時候 動態卸載 和 加載部份內核代碼, UNIX 內核是不可分割的可執行庫;
-- 對 SMP 機制的支持 : SMP (Symmetric Multi-Processing) 對稱多處理機制, 多 CPU 機器上 各 CPU 共享內核和總線資源, Linux 支持, 傳統 UNIX 不支持;
-- 對搶佔支持 : Linux 內核容許在內核執行任務的時候, 優先執行一些任務; 多數 UNIX 不支持;
-- 對線程支持 : Linux 內核不區分線程和進程, 全部的進程對與內核都是同樣的;
內核官網 : https://www.kernel.org/ ;
-- 2.6 最穩定版下載地址 : https://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.63.tar.xz ;
-- 3.16.1 最新的穩定版本內核地址 : https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.1.tar.xz ;
-- 3.14.17 最新內核下載地址(不穩頂) : https://www.kernel.org/pub/linux/kernel/v3.x/testing/linux-3.17-rc1.tar.xz ;
tar.xz 壓縮文件解壓方法 : tar -xvJf linux-2.6.32.63.tar.xz ;
Git下載地址 : git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git ;
-- 下載代碼命令 : git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git;
-- 提交代碼命令 : git pull;
-- 下載過程 :
octopus@octopus:~/develop/git/linux_kernel$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git Cloning into 'linux-2.6'... remote: Counting objects: 3754628, done. remote: Compressing objects: 100% (566292/566292), done. remote: Total 3754628 (delta 3165631), reused 3747365 (delta 3158382) Receiving objects: 100% (3754628/3754628), 793.85 MiB | 435 KiB/s, done. Resolving deltas: 100% (3165631/3165631), done.
Ubuntu 內核源碼地址 : /usr/src/linux-headers-3.11.0-15 ;
-- Ubuntu 內核源碼目錄 :
root@octopus:/usr/src/linux-headers-3.11.0-15# ls arch crypto drivers fs init Kbuild kernel Makefile net scripts sound ubuntu virt block Documentation firmware include ipc Kconfig lib mm samples security tools usr
-- 2.6 最穩定版內核 : linux-2.6.32.63.tar.xz, 解壓命令 tar -xvJf linux-2.6.32.63.tar.xz ;
-- 內核目錄 :
octopus@octopus:~/uplooking/kernel/linux-2.6.32.63$ ls arch CREDITS drivers include Kbuild MAINTAINERS net samples sound virt block crypto firmware init kernel Makefile README scripts tools COPYING Documentation fs ipc lib mm REPORTING-BUGS security usr
-- arch : 特定體系結構源碼, 這裏爲 x86 arm 不一樣型號的 cpu 準備了不一樣的源碼;
-- block : 塊設備相關 I/O 層;
-- crypto : 加密相關的 api;
-- Documention : 內核源碼文檔;
-- drivers : 設備驅動程序;
-- firmware : 使用驅動程序須要的設備固件;
-- fs : 文件系統;
-- including : 內核頭文件;
-- init : 內核引導和初始化;
-- ipc : 進程通訊代碼;
-- kernel : 內核的核心繫統;
-- lib : 通用的內核函數;
-- mm : 內存管理模塊;
-- net : 網絡系統模塊;
-- sample : 示例代碼;
-- scripts : 編譯內核的腳本;
-- security : 安全模塊;
-- sound : 語音模塊;
-- usr : 用戶空間代碼;
-- tools : Linux 工具;
-- virt : 虛擬化基礎結構;
文件介紹 :
-- COPYING : 內核許可證;
-- CREDITS : 內核開發者列表;
-- MAINTAINERS : 維護者列表;
-- Makefile : make 編譯腳本;
使用 make config 命令 : 該命令會逐一遍歷全部配置項, 用戶本身選擇 yes(y) no(N) module(?), 所需時間很長;
-- 配置詳情 :
octopus@octopus:~/uplooking/kernel/linux-2.6.32.63$ make config scripts/kconfig/conf arch/x86/Kconfig * * Linux Kernel Configuration * * * General setup * Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [N/y/?]
使用 make menuconfig 命令 :
-- 圖形界面 :
配置保存文件 : make menu 圖形界面保存的配置文件是在根目錄下的 .config 文件, 該文件中保存這 一個個的鍵值對;
-- 配置文件內容 :
# # Automatically generated make config: don't edit # Linux kernel version: 2.6.32.63 # Mon Aug 18 17:17:46 2014 # # CONFIG_64BIT is not set CONFIG_X86_32=y # CONFIG_X86_64 is not set CONFIG_X86=y CONFIG_OUTPUT_FORMAT="elf32-i386" CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" CONFIG_GENERIC_TIME=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_GENERIC_CLOCKEVENTS=y
-- tristate : 能取值 y, n 和 m, 對應配置界面中的 <>;
-- bool : 是 tristate 的一種, 只能取值 y 和 n, 對應配置界面的 [];
-- string : 取值字符串;
-- hex : string 的一種, 取值十六進制數;
-- int : string 的一種, 取值十進制數;
顯示詳細配置解析 : 在 menuconfig 中將光標停在配置項, 而後按下 ? 鍵, 便可彈出詳細配置信息;
-- 示例圖片 : 其中說明了該配置項做用, 以及配置文件位置, 該配置項的位置在 /arch/Kconfig 中的第 5 行;
-- 配置代碼 :
config OPROFILE tristate "OProfile system profiling (EXPERIMENTAL)" depends on PROFILING depends on HAVE_OPROFILE select RING_BUFFER select RING_BUFFER_ALLOW_SWAP help OProfile is a profiling system capable of profiling the whole system, include the kernel, kernel modules, libraries, and applications. If unsure, say N.
Kconfig 中的配置解析 :
-- config : 變量名;
-- tristate : menuconfig 界面中顯示的選項名稱;
-- default : 默認值;
-- depends on : 依賴哪些變量;
-- select : 選擇變量;
-- help : 幫助信息, menuconfig 中光標移動到選項上, 點擊 ? 顯示的信息;
Makefile 對 .config 的依賴 :
a. obj-$(CONFIG_PLIP) + = plip.o 選項 : CONFIG_PLIP 這個選項定義在 .config 文件中;
-- CONFIG_PLIP=y : 那麼將編譯本目錄下的 plip.c 文件並將其功能集成進 zimage;
-- CONFIG_PLIP=n : 不編譯;
-- CONFIG_PLIP=m : 那麼將編譯本目錄下的 plip.c 文件生成模塊 plip.ko;
b. obj-$(CONFIG_GIANFAR) + = gianfar_driver.o 選項 :
-- CONFIG_GIANFAR = y : 編譯本目錄下的 ianfar.c,gianfar_ethtool.c,gianfar_mii.c,gianfar_sysfs.c 文件並將其功能集成進 zimage;
-- CONFIG_GIANFAR = n : 不編譯;
-- CONFIG_GIANFAR = m : 以上文件生成模塊gianfar_driver.ko;
c. obj-$(CONFIG_ATL1) + = atl1 選項 :
-- CONFIG_ATL1 = y : 遞歸進入本目錄的字目錄 atl1, 並根據該子目錄下的 Makefile 文件的內容決定該子目錄如何進行編譯;
-- 其它情況 : 不編譯;
簡單命令 : 直接使用 make 命令進行編譯;
過濾命令行輸入 : 將 make 編譯信息輸出到文件中, 警告 和 錯誤 會輸出到命令行;
-- 輸出發到文件 : 使用 make > ../make_log 命令, 會自動將無關的日誌存放到 make_log 文件中, 錯誤和警告提示會顯示出來;
-- 輸出到黑洞 : 使用 make > /dev/null 命令, 輸出的日誌信息會自動;
並行編譯 : make 能夠進行多做業並行編譯, 在多核的機器上這樣進行編譯效率很高;
-- 並行編譯弊端 : 若是 Makefile 出現依賴錯誤, 並行編譯會報錯, 使用 單做業 make 能夠編譯經過, 內核無此類錯誤, 能夠並行編譯;
-- 使用命令 : make -jn , 其中 n 是一個整數, 例如 make -j4 就是開起 4 個做業同時編譯;
-- 多做業編譯並輸出文件 : make -j4 > make_log, 開啓四個做業同時進行編譯, 並將編譯輸出信息存放到 make_log 中;
編譯過程 : 使用 make -j4 > make_log 命令, 省略了一部份;
octopus@octopus:~/uplooking/kernel/linux-2.6.32.63$ make -j4 > make_log scripts/mod/modpost.c: In function ‘get_markers’: scripts/mod/modpost.c:1562: warning: ignoring return value of ‘asprintf’, declared with attribute warn_unused_result scripts/mod/modpost.c: In function ‘add_marker’: scripts/mod/modpost.c:1982: warning: ignoring return value of ‘asprintf’, declared with attribute warn_unused_result scripts/kallsyms.c: In function ‘read_symbol’: scripts/kallsyms.c:112: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result WARNING: modpost: Found 2 section mismatch(es). To see full details build your kernel with: 'make CONFIG_DEBUG_SECTION_MISMATCH=y'
編譯和安裝系統 : 本人用的 Ubuntu 系統, 安裝內核比較麻煩, 這裏只列出 Redhat 系統安裝內核的流程, 即 在 ubuntu 上編譯, 在 Redhat 上安裝;
文件位置 : 編譯好的內核位於 arch 對應體系結構的目錄下的 boot 目錄下;
-- 使用默認編譯好的配置內核地址 : arch/i386/boot ;
octopus@octopus:~/uplooking/kernel/linux-2.6.32.63/arch/i386/boot$ ls bzImage
/boot 目錄 : 內核文件存放在 /boot 目錄下, 下面列舉除了 boot 目錄下的文件;
[root@ip28 boot]# ls config-2.6.18-164.el5 initrd-2.6.18-164.el5.img System.map-2.6.18-164.el5 grub symvers-2.6.18-164.el5.gz vmlinuz-2.6.18-164.el5
-- 內核文件 : 其中的 vmlinuz-2.6.18-164.el5 就是內核, 將 bzImage 文件更名爲 vmlinuz-2.6.32.63 便可, 後面是版本號, 該版本是 Linux 內核的 2.6.32.63 版本;
文件位置 : 每一個系統中該文件的位置不一樣, 在 redhat 中內核配置文件是 /etc/grub.conf 文件;
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hda1 # initrd /boot/initrd-version.img #boot=/dev/hda default=0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (2.6.18-164.el5) root (hd0,0) kernel /boot/vmlinuz-2.6.18-164.el5 ro root=LABEL=/ console=tty0 console=ttyS0,9600n8 ide0=noprobe clock=tsccount initrd /boot/initrd-2.6.18-164.el5.img
模塊安裝介紹 : modules 安裝能夠自動完成, 首先切入到 root 權限下, 執行 make modules_install 命令, 便可將編譯好的模塊安裝到 /lib/modules 目錄下;
生成目錄 : 編譯的是時候在內核源碼根目錄生成一個 System.map 的對照表, 這份對照表是 內核中的符號 和 地址對應起來, 好比函數的地址, 變量的地址等;
00000000 A VDSO32_PRELINK 00000040 A VDSO32_vsyscall_eh_frame_size 000001d5 A kexec_control_code_size 00000400 A VDSO32_sigreturn 0000040c A VDSO32_rt_sigreturn 00000414 A VDSO32_vsyscall 00000424 A VDSO32_SYSENTER_RETURN 01000000 A phys_startup_32 c1000000 T _text c1000000 T startup_32 c1000054 t default_entry
不能使用標準庫 : 內核中是不存在 標準庫 和 標準頭文件的;
-- 沒有引用 : 標準庫實質上就是調用內核中的東西, 此時內核還不存在;
-- 性能考慮 : 連接執行標準庫性能很低, 對於內核來講下降性能是致命的;
使用頭文件 : 內核中實現了大部分 C 函數, 只要將相關的頭文件引入便可;
-- 基本頭文件 : 這類頭文件在 include 目錄下的, 如 字符串處理相關的頭文件路徑是 include/linux/string.h, 引入 <linux/string.h> 便可使用裏面的方法;
-- 體系結構相關頭文件 : 這類頭文件在 arch/architecture/include/asm 目錄下, 如 x86 相關的體系結構頭文件在 arch/x86/include/asm 目錄下, 引入的時候引入 <asm/xxx.h> 便可;
內核C語言符合的標準 : 內核不符合 ANSI C 標準, 符合 ISO C99 和 GNU C 標準;
內聯函數介紹 : 函數會在其調用的位置展開, 沒有函數調用和返回的開銷;
-- 函數調用開銷 : 函數調用的時候須要 寄存器的存儲和恢復;
-- 內聯函數優勢 : 編譯器會把函數代碼和其自己一塊兒優化;
-- 內聯函數缺點 : 代碼展開後會佔用跟多空間, 佔用更多的指令緩存, 內核中把對時間要求高 而且 自己比較短 的函數定義爲內聯函數;
內聯函數定義 : 使用 sttaic inline 限定函數;
-- 示例 : static inline void hello(char * argv);
-- 使用 static 限制 : 編譯時不會爲其建立函數體;
嵌入彙編 : 使用 asm() 指令嵌入彙編;
-- 前提 : C 語言中嵌入的彙編須要與體系結構對應才能夠, 例如在筆記本上執行的 C 程序必須嵌入 x86 的彙編才能夠, 不能使用 arm 彙編;
-- 示例 : asm volatile("mov %1, %0\n\t" : "=r"(output) : "r"(input));
-- 使用場景 : 在內核中 體系結構底層代碼 或者 對時間要求嚴格的地方使用 彙編語言實現;
選擇優化 : gcc 編譯器會根據分支選擇優化, 條件不多出現的代碼不進行優化, 條件不少時候出現的時候才優化;
-- 示例 : likely() 和 unlikely();
標記分支示例 : if(istrue){} 是條件;
-- 標記爲不多發生的狀況 : if(unlikely(istrue)){};
-- 標記爲常常發生的狀況 : if(likely(istrue)){};
用戶空間的內存保護 : 當用戶程序出現非法內存訪問, 內核就會發送錯誤信號, 殺死整個進程;
內核出現內存非法訪問 : 會致使整個內核 oops, 這種錯誤很常見, 並且很難排查;
-- 技巧 : 內核中的內存不分頁, 用掉哪些內存都要記住, 不然會出現錯誤;
用戶空間使用浮點數 : 用戶進行浮點運算的時候, 內核會進行從整數到浮點數操做的模式轉換;
內核空間使用浮點數 : 內核不能完美支持浮點操做, 其自己不能陷入, 若是非要使用的話 須要人工操做浮點寄存器, 過程至關繁瑣;
用戶棧 : 用戶空間的棧很大, 能夠存放巨大的結構體等大數據;
內核棧 : 內核的棧很小, 32位 x86 體系結構上 是 8KB, 64 位的是 16 KB;
內核的同步併發機制 : 內核常常產生競爭, 須要併發訪問共享數據, 須要有同步機制保證不出現競爭條件;
-- Linux系統搶佔屬性 : Linux 是搶佔式多任務操做系統, 內核必須和任務同步, 內核中一段代碼可能會被另外一段搶佔, 幾段代碼可能訪問同一資源, 所以須要 自旋鎖 信號量等機制保護;
-- Linux 系統對稱多處理(SMP)屬性 : 多個處理器執行內核代碼 可能會致使訪問同一資源, 這裏也使用 自旋鎖 和 信號量機制;
-- 中斷保護 : 中斷可能在一段代碼訪問資源的時候到來, 中斷處理程序又可能訪問同一資源, 又出現多個代碼訪問同一資源;
驅動概念 :
-- 實現位置 : 驅動在內核中實現, 通常在內核中的 driver 目錄下;
-- 驅動做用 : 驅動的做用是提供 機制(實現什麼功能), 不是提供 策略(用戶如何使用這種功能), 編寫訪問硬件的內核代碼的時候, 不要給用戶強加策略;
可加載模塊 : 能夠在內核運行時加載的代碼叫模塊, 每一個模塊由目標代碼組成, 能夠在內核運行的時候動態鏈接到內核中;
-- 機制特色 : 這是一種能夠動態加載功能單元來擴展功能的機制, 相似與插件;
-- 與驅動關係 : 內核爲每一個驅動建立不一樣的模塊, 實現驅動的擴展性;
驅動分類 : 驅動分爲 字符設備, 塊設備 和 網絡設備;
字符設備概念 : 這種設備能夠像字節流同樣訪問, 字符設備驅動程序實現這種特性;
-- 字符設備訪問方式 : 經過 /dev 下的字符設備文件來訪問, 該驅動程序須要實現 open close rad write 系統調用;
-- 順序訪問 : 大部分字符設備只能順序訪問數據, 指針不能先後移動, 如 串口驅動, 只能順序讀寫數據;
-- 靈活訪問 : 有些字符設備能夠移動指針訪問, 如 framebuffer 設備;
塊設備概念 : 這種設備按照文件塊訪問數據, 如 一塊爲 512 字節, 那麼會按照 512 字節訪問設備;
-- 塊設備訪問方式 : 經過 /dev 下面的文件系統訪問;
-- 與字符設備區別 : 內核內部管理數據的方式不一樣, 內核和驅動的接口不一樣;
-- 訪問方式 : 塊設備除了提供與字符設備相同的接口以外, 還要提供專門面向塊設備的接口;
-- 塊設備與文件系統關係 : 塊設備支持文件系統掛載, 其可以容納文件系統, 應用程序能夠經過文件系統訪問塊設備;
網絡設備概念 : 網絡設備不在 /dev 下表示, 是經過單獨的網絡接口來表明這種設備的;
-- 訪問方式 : 網絡設備須要經過網絡接口進行訪問;
-- 實現方式 : 內核與網絡設備通訊 與 字符設備 和 塊設備都不一樣, 是調用一套數據傳輸相關的 api 完成這種操做;
設備文件簡介 :
-- 概念 : 文件系統上的一個節點, 是一種特殊的文件, 每一個設備文件表明了一個設備;
-- 位置 : 設備文件通常在 /dev 目錄下;
-- 建立命令 : 使用 mknod 命令進行建立;
-- 設備接口 : 設備文件是應用程序和設備驅動之間的接口, 應用程序經過操做設備文件使用設備驅動的功能;
-- 與字符和塊設備對應 : 字符設備 和 塊設備 一定與一個設備文件對應;
驅動位置 :
-- 內核源碼中的位置 : 內核中的驅動在根目錄下的 drivers 目錄下;
octopus@octopus:~/uplooking/kernel/linux-2.6.32.63/drivers$ pwd /home/octopus/uplooking/kernel/linux-2.6.32.63/drivers octopus@octopus:~/uplooking/kernel/linux-2.6.32.63/drivers$ ls accessibility built-in.o dio hwmon Kconfig message oprofile ps3 sh usb acpi cdrom dma i2c leds mfd parisc rapidio sn uwb amba char edac ide lguest misc parport regulator spi video ata clocksource eisa idle macintosh mmc pci rtc ssb virtio atm connector firewire ieee1394 Makefile modules.order pcmcia s390 staging vlynq auxdisplay cpufreq firmware ieee802154 mca mtd platform sbus tc w1 base cpuidle gpio infiniband md net pnp scsi telephony watchdog block crypto gpu input media nubus power serial thermal xen bluetooth dca hid isdn memstick of pps sfi uio zorro
-- Linunx系統中的位置 : /usr/src/linux-headers-3.11.0-15/drivers ;
root@octopus:/usr/src/linux-headers-3.11.0-15/drivers# ls accessibility bus devfreq gpu infiniband mailbox mtd pinctrl remoteproc spi vfio zorro acpi cdrom dio hid input Makefile net platform reset ssb vhost amba char dma hsi iommu md nfc pnp rpmsg staging video ata clk edac hv ipack media ntb power rtc target virt atm clocksource eisa hwmon irqchip memory nubus pps s390 tc virtio auxdisplay connector extcon hwspinlock isdn memstick of ps3 sbus thermal vlynq base cpufreq firewire i2c Kconfig message parisc ptp scsi tty vme bcma cpuidle firmware ide leds mfd parport pwm sfi uio w1 block crypto fmc idle lguest misc pci rapidio sh usb watchdog bluetooth dca gpio iio macintosh mmc pcmcia regulator sn uwb xen root@octopus:/usr/src/linux-headers-3.11.0-15/drivers# pwd /usr/src/linux-headers-3.11.0-15/drivers
-- block : 塊設備驅動;
-- char : 虛擬中斷驅動;
-- serial : 串口驅動;
-- net : 網絡設備驅動;
-- vedio : framebuffer 設備驅動;
-- sound : 聲卡驅動;
octopus@octopus:~/uplooking/kernel/linux-2.6.32.63/drivers$ dmesg [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Initializing cgroup subsys cpuacct [ 0.000000] Linux version 3.11.0-15-generic (buildd@akateko) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #25~precise1-Ubuntu SMP Thu Jan 30 17:42:40 UTC 2014 (Ubuntu 3.11.0-15.25~precise1-generic 3.11.10) [ 0.000000] KERNEL supported cpus: [ 0.000000] Intel GenuineIntel [ 0.000000] AMD AuthenticAMD [ 0.000000] NSC Geode by NSC [ 0.000000] Cyrix CyrixInstead [ 0.000000] Centaur CentaurHauls [ 0.000000] Transmeta GenuineTMx86
做者 : 韓曙亮
轉載請出名出處 : http://blog.csdn.net/shulianghan/article/details/38636827