有些廠商沒有公開 Kernel 原始碼,但可以下載 Linux 官方的原始碼來編譯模塊,其實安卓的核心就是 ARM 版的 Linux 核心,修改的範圍差異其實不大,加上一些廠商自訂的驅動而已,該死的是這些廠商的驅動,網路上幾乎找不到,沒發怖原始碼就沒辦法完整編譯核心。但模塊還是可以編譯,畢竟手機要外接的 USB 裝置,在 Linux 底下可以驅動,就有辦法移值到 Android 上面。只是把驅動的原始碼編譯成 ARM 版而已。
# USB Modem 驅動
Device Drivers > USB support
<M> USB Modem (CDC ACM) support
模塊 cdc-acm.ko
# USB ATAPI 驅動
Device Drivers > USB support
<M> Freecom USB/ATAPI Bridge support
模塊 ums-freecom.ko
# USB 無線網卡驅動
Device Drivers > Network device support > Wireless LAN
選擇需要的驅動
範例: Atheros 晶片無線網卡
<M> Atheros Wireless Cards --->
<M> Atheros 802.11n wireless cards support (Atheros ath9k)
<M> Atheros HTC based wireless cards support (Atheros ath9k HTC)
<M> Linux Community AR9170 802.11n USB support
<M> Atheros mobile chipsets support
<M> Atheros ath6kl SDIO support
<M> Atheros ath6kl USB support
<M> Atheros AR5523 wireless driver support
<M> Atheros 802.11ac wireless cards support (Atheros ath10k)
<M> Qualcomm Atheros WCN3660/3680 support
# USB 藍芽驅動
Networking support > Bluetooth subsystem support > Bluetooth device drivers
<M> HCI USB driver
<M> HCI UART driver
<M> HCI BCM203x USB driver
<M> HCI BPA10x USB driver
<M> HCI BlueFRITZ! USB driver
# USB 網卡驅動
Device Drivers > Network device support > USB Network Adapters
<M> USB Pegasus/Pegasus-II based ethernet device support
<M> USB RTL8150 based ethernet device support
<M> Realtek RTL8152 Based USB 2.0 Ethernet Adapters
* 去除模塊 vermagic 字串驗證
函數 check_modinfo
/* This is allowed: modprobe --force will invalidate it. */
if (!modmagic) {
err = try_to_force_load(mod, "bad vermagic");
if (err)
return err;
} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
pr_err("%s: version magic "%s" should be "%s"
",
mod->name, modmagic, vermagic);
return -ENOEXEC;
}
去掉 return err 跟 return -ENOEXEC;
以上是原始碼的修改參考方向,實際上還是要改解壓縮的核心。
# 取得函數符號位址
手機連接電腦
adb shell
su
echo 0 > /proc/sys/kernel/kptr_restrict
cat /proc/kallsyms |grep load_module
c02b358c t load_module
cat /proc/kallsyms |grep check_version
c02b1fa8 t check_version.part.5