怎么修改Android 的Linux内核?

怎么修改Android 的Linux内核?,第1张

Android 产品中,内核格式是Linux标准的zImage,根文件系统采用ramdisk格式。这两者在Android下是直接合并在一起取名为boot.img,会放在一个独立分区当中。这个分区格式是Android自行制定的格式。

Android开发时,最标准的做法是重新编译于内核和根文件系统,然后调用Android给的命令行文件mkbootimg(out/host/linux-x86/bin/)来打包。

在制作手机ROM时,有时会单独编译内核或抽出根文件进行修改内容,比如我只编译内核,其余的地方不变。这样重新安装巨大的Android开发环境实在不划算。因此很多boot.img解包工具被人开发出来,这一些工具都是把内核和根文件系统从一个现成的boot.img抽取出来,修发后再次打包还原。

一.常见的解包工具

因为boot.img的格式比较简单,它主要分为三大块(有的可能有四块)

因此很多人开发分析工具,有是linux shell脚本,比如repack-zImage,也有人采用perl,还有C语言编写的 unbootimg,

我使用的是在源码位置system/core/mkbootimg/ 下的 mkbootimg。为了简化,蓝点工坊把与mkbootimg中打包工具和解包工具以及所包含的libmincrpty库抽出来,并且重写一个Makefile,作为开源项目。

使用者只需要在linux(需安装gcc,make,一般是标配)或windows(需要安装mingw)的命令行执行make,即可产生可执行文件mkbootimg ,unpackbootimg。

二.解/打包工具使用

解包工具:unpackbootimg

常见格式

unpackbootimg -i .\tmp\boot.img -o .\out

这一句命令行表示把boot.img解包,所有文件输出到out目录下

它会解压出如下文件:

boot.img-zImage (内核文件)

boot.img-ramdisk.gz (根文件系统打包文件)

boot.img-cmdline (mkbootimg cmdline参数)

boot.img-pagesize (mkbootimg pagesize参数)

boot.img-base (mkbootimg base参数)

打包工具:mkbootimg (Android自带)

常见的命令格式:

./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img --base 02e00000

这句含义是把内核文件zImage和boot目录下的根文件压缩包 boot.img-ramdisk.gz打包成boot.img.

其中cmdline和base的值均来源于unpackbootimg的结果

2.6.18-238.el5 内核版本类的信息是不能修改的

机器主机名倒是可以修改,使用hostname xxxx,修改为你自己电脑的名字,重启后失效

要永久生效的话,修改/etc/sysconfig/network

[root@linux-node2 ~]# cat /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=yes

HOSTNAME=linux-node2

作为用户程序和系统硬件之间的接口,内核在确保Red Hat Enterprise Linux 应用到广泛到物理和虚拟硬件环境中发挥来重要作用。

识别运行内核

1. cat /etc/redhat-release 安装的Red Hat Enterprise Linux 版本

2. uname -r 当前运行的内核版本

3. yum list installed kernel/* 安装的内核版本

4. uname -m 或arch 当前运行所在处理器体系结构

5.uname -a 查看内核信息

有时,内核会发出日志消息。这些消息记录在/var/log/messages文件中,标记为kernel服务。

内核模块

模块加载和卸载

● 在引导时加载的核心内核映像位于/boot/vmlinuz-VERSION.

● 虽然可以安装多个内核,但是只有一个是当前运行的内核。若要更改内核,必须重新引导系统。

● 每个内核都包含一组动态加载的模块,这些模块与该内核兼容,保留在/lib/modules/VERSION/ 中。

● 通常,根据需要加载和卸载模块,无需用户(或管理员)交互。

● 可以使用 lsmod 列出当前加载的模块。

● 有时,可能需要使用modprobe MODULENAME 手动加载模块。

● 可以使用modprobe -r MODULENAME 删除不再使用的模块。

可以在 /lib/modules/2.6.32-71.el6.x86_64/kernel 目录下查看内核模块信息

modprobe -l 列出所加载的模块

示例:

# modprobe -l | grep nf_conntrack_ftp

# modprobe nf_conntrack_ftp

# lsmod | grep nf_conntrack_ftp

# modprobe -r nf_conntrack_ftp

内核更新:

下载新内核rpm包

理论上应使用rpm -Uvh kernel-name.rpm 但是如果使用U的话会使当前运行的系统挂掉,

所以用 rpm -ivh kernel-name.rpm 全新安装内核

在 /boot 中会出现一个新的内核

在 /boot/grub/grub.conf 中 default=0 表示使用新内核,此时需重启才能使用到新内核。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7518482.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存