【Android系列1.0 驅動開發 --- Linux 驅動 內核】

參考文檔

Context

  • 當探索Binder機制,引出很多Linux相關概念。說Binder是驅動程序,Binder用了內存共享、匿名內存共享。
  • Binder由 Client、Service、ServiceManager、Binder驅動程序 四個大模塊組成那個。
  • 那什麼是驅動程序?什麼是內存共享?
  • 怎用從Linux的角度看待Binder、Android

總結

驅動:用於被加載到內核,來操作指定的kernal module(外設(鼠標、鍵盤)、虛擬設備(如Android裏的binder))。

個人推論

Linux裏everything is file,平常用的網卡、鼠標都被當做文件(設備文件),掛載在文件系統中。 虛擬設備(不依賴於特定的物理硬件,僅是內核自身提供的某種功能)

可以在module中註冊,應用調用設備文件,read、write、ioctl等system call(系統調用)時,要執行的操作(驅動)。

相當於屏蔽了硬件的細節,只要調用native層的read、write、ioctl

kernel

以下目錄、內容是針對Linux系統

  • 2千多萬行的代碼
  • 操作系統的核心
  • 系統硬件 和 應用的溝通媒介(mediator),通過設備驅動,將程序指令 -》 機器理解的語言。

種類

  1. Monolithic(單片機) kernel
    • OS(操作系統)工作在 內核空間
    • 沒有 用戶空間,來 load/remove kernal modules
    • 也就是:所有的 驅動、文件系統、IPC 都工作在內核空間
  2. Modular(模塊化的) kernal
    • OS只有一部分load進了 內核空間
    • 可以隨時,根據需求,load kernal module到內核 (減輕了OS壓力)

Kernal Module

  • kernel的一部分
  • kernel不可能支持所有硬件,所以程序員 寫一部分代碼(kernel modules)來支持某種硬件,併發布
  • 當kernal modules專用於控制外設的讀取時,也被稱爲 驅動(device driver)

Modular kernal

  • /proc/devices 文件包含 設備major numbers 到 設備類型(主要是:字符、塊類型設備)的映射,kernal通過load適當的module讀取設備。

左側爲設備的major number(內核用於識別 外設類型),右側爲設備類型

[root@linuxnix ~]# head /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
  • /proc/modules 包含現在被load的modules

左側第一列爲 module name

[root@linuxnix ~]# head /proc/modules
ebtable_filter 12827 0 - Live 0xffffffffa0657000
ebtables 35009 1 ebtable_filter, Live 0xffffffffa0649000
ip6table_filter 12815 0 - Live 0xffffffffa048a000
ip6_tables 26901 1 ip6table_filter, Live 0xffffffffa0641000
iptable_filter 12810 0 - Live 0xffffffffa048f000
vmw_vsock_vmci_transport 30577 0 - Live 0xffffffffa0481000
vsock 34855 3 vmw_vsock_vmci_transport, Live 0xffffffffa0463000
snd_seq_midi 13565 0 - Live 0xffffffffa05f0000
snd_seq_midi_event 14899 1 snd_seq_midi, Live 0xffffffffa063c000
intel_powerclamp 14419 0 - Live 0xffffffffa0631000
  • /sys/module/<module_name> 目錄查看驅動(modular kernal)的相關設置
[root@linuxnix ~]# cd /sys/module/sd_mod
[root@linuxnix sd_mod]# ls
coresize  holders  initsize  initstate  notes  refcnt  rhelversion  sections  srcversion  taint  uevent
[root@linuxnix sd_mod]# cat initstate
live
[root@linuxnix sd_mod]#
[root@linuxnix sd_mod]# cat rhelversion
7.3

管理kernel module的命令

lsmod and modprobe commands

lsmod從/proc/modules文件中獲取 已加載的驅動信息

Last login: Tue Oct 24 21:24:04 2017 from 49.180.168.95
root@linuxnix:~# lsmod
Module                  Size  Used by
ufs                    73728  0
msdos                  20480  0
xfs                   970752  0
ppdev                  20480  0
kvm_intel             172032  0
kvm                   544768  1 kvm_intel
irqbypass              16384  1 kvm
crct10dif_pclmul       16384  0
crc32_pclmul           16384  0
ghash_clmulni_intel    16384  0
joydev                 20480  0
input_leds             16384  0
serio_raw              16384  0
parport_pc             32768  0
pvpanic                16384  0
parport                49152  2 ppdev,parport_pc
ib_iser                49152  0
rdma_cm                49152  1 ib_iser

kernal modules相關命令

modprobe

remove module

[root@linuxnix ~]# modprobe -rv sr_mod 
rmmod sr_modrmmod 
rmmod cdrom

load model

[root@linuxnix ~]# modprobe -v sr_mod
insmod /lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/cdrom/cdrom.ko
insmod /lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/scsi/sr_mod.ko
[root@linuxnix ~]#

modinfo

展示相關信息

[root@linuxnix ~]# modinfo sd_mod
filename:       /lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/scsi/sd_mod.ko
alias:          scsi:t-0x0e*
alias:          scsi:t-0x07*
alias:          scsi:t-0x00*
alias:          block-major-135-*
alias:          block-major-134-*
alias:          block-major-133-*
alias:          block-major-132-*
alias:          block-major-131-*
alias:          block-major-130-*
alias:          block-major-129-*
alias:          block-major-128-*
alias:          block-major-71-*
alias:          block-major-70-*
alias:          block-major-69-*
alias:          block-major-68-*
alias:          block-major-67-*
alias:          block-major-66-*
alias:          block-major-65-*
alias:          block-major-8-*
License:        GPL
description:    SCSI disk (sd) driver
author:         Eric Youngdale
rhelversion:    7.3
srcversion:     3BCC1FE5C7B281E00A15BEF
depends:        crc-t10dif
intree:         Y
vermagic:       3.10.0-514.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        D4:88:63:A7:C1:6F:CC:27:41:23:E6:29:8F:74:F0:57:AF:19:FC:54
sig_hashalgo:   sha256
發佈了194 篇原創文章 · 獲贊 31 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章