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),通過設備驅動,將程序指令 -》 機器理解的語言。
種類
- Monolithic(單片機) kernel
- OS(操作系統)工作在 內核空間
- 沒有 用戶空間,來 load/remove kernal modules
- 也就是:所有的 驅動、文件系統、IPC 都工作在內核空間
- 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