⑴ linux kernel 何时上报uevent
uevent可以实现内核通知上层的一种机制,最常见的电池状态的变化就是kernel uevent通知的,每次百分比或者其他的变化通过power_supply_changed通知上层update;
每个device下面都有kobj,找到device就可以通过kobject_uevent_env 通知android了;
以拔出T卡为例,内核通知上层。这里的T卡是一种sdio设备,普通TF卡是块设备,安卓通过块设备可以知道T卡的移除。
kernel:
Index: kernel/drivers/mmc/host/msm_sdcc.c
===================================================================
--- kernel/drivers/mmc/host/msm_sdcc.c (revision 10898)
+++ kernel/drivers/mmc/host/msm_sdcc.c (working )
@@ -77,6 +77,8 @@
#define MSM_MMC_BUS_VOTING_DELAY 200 /* msecs */
#define INVALID_TUNING_PHASE -1
+struct device *mmc1_dev;
+static int obj_enable =0;
+static int set_kobject_env(const char *val, struct kernel_param *kp)
+{
+ printk("%s called 00 \n",__func__);
+ kobject_uevent_env(&mmc1_dev->kobj, KOBJ_CHANGE, NULL);
+ return 0;
+}
+mole_param_call(obj, set_kobject_env, param_get_uint,
+ &obj_enable, 0644);
+
static irqreturn_t
msmsdcc_platform_status_irq(int irq, void *dev_id)
{
@@ -6186,6 +6205,11 @@
ret = device_create_file(&pdev->dev, &host->idle_timeout);
if (ret)
goto remove_polling_file;
+
+ if(mmc->index ==1)
+ mmc1_dev = &pdev->dev;
+
+
return 0;
java:
if (new File("/sys/devices/platform/msm_sdcc.3/uevent").exists()) {
mInvalidChargerObserver.startObserving(
"DEVPATH=/devices/platform/msm_sdcc.3");
}
private final UEventObserver mInvalidChargerObserver = new UEventObserver() {
@Override
public void onUEvent(UEventObserver.UEvent event) {
Slog.v(TAG, "Uevent changed ");
final int invalidCharger = "1".equals(event.get("SWITCH_STATE")) ? 1 : 0;
synchronized (mLock) {
if (mInvalidCharger != invalidCharger) {
mInvalidCharger = invalidCharger;
updateLocked();
}
}
}
};
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html
⑵ 玩游戏后手机显示修改内核什么意思
一、 提取 zImage 内核文件
在提取zImage 前,必须确保自己拥有 root 权限。
输入命令:
ls -l /dev/block/platform/msm_sdcc.1(具体设备具体定)/by-name,
找到 boot 这一项,记下路径
将boot导出为boot.img
dd if=/dev/block/mmcblk0p19 of=/data/local/boot.img
adb pull /data/local/boot.img boot.img
使用abootimg工具,该工具见附件解开boot.img
将 zImage 文件复制为文件名为 z.gz 的文件,并使用 010editor 查找十六进制1f 8b 08 00,找到后把前面的数据全删掉,使 kernel.gz 文件变成标准的 gzip 压缩文件,这样子就可以使用 gunzip 解压了。
命令:gunzip z.gz
生成文件z就是祼二进制文件zImage。
二、 提位、修改关键代码
zImage文件可以直接使用 IDA 去打开,但需要设置参数。
在上图,设置处理器类型为ARM Little-endian,点【ok】后,弹下图
在 ROM start address 和 Loading address 填0xc0008000,点【ok】,IDA显示效果如下图所示,没有函数名,不方便定位代码。
先回到root下的adb shell,输入命令:
echo 0 > /proc/sys/kernel/kptr_restrict
关闭符号屏蔽
再输入以下命令查看这两函数的地址
回到 IDA,按 g 跳转到c01b083c(__task_pid_nr_ns)地址处,在光标放在在该函数处:
然后按x,弹出引用搜索框
在搜索框里,找到sub_c02b9ff8(proc_pid_status)地址对应的函数,双击它,如果 IDA 没有分析出该函数,就进行以下操作:
按shift+f12,搜索TracerPid,找到以下项
双击它,看到
再双击【DATA XREF: sub_c02b9ff8+190】,IDA就能分析出sub_c02b9ff8函数了,然后重新搜索sub_c01b083c的引用。找到后,双击它,得以下图:
经本人分析得到的修改方法是把MOVEQ R10, R0替换为MOV R10, #0,机器码为00 A0 A0 E3,指令的文件偏移为(C02BA568-C0008000=2B2568),及把BL sub_C01B083C替换为MOV R0, #0,机器码为00 00 A0 E3,指令的文件偏移为(C01B083C-C0008000=1A883C)。
至少,内核文件修改成功。
三、刷回手机
刷回前需要先打包 boot.img 文件
使用命令压缩成z.gz:gzip -n -f -9 z
使用010editor 将 z.gz 的二进制数据覆盖到原zImage 文件的1F 8B 08 00处的位置(新的z.gz文件必须比原 z.gz 文件小,并且回写回去时不能改变原zImage文件的大小及修改原 zImage 文件后面的内容,否则会很麻烦),这时得到了zImage文件。
执行命令abootimg --create boot.img -f bootimg.cfg -k zImage -r initrd.img得到boot.img文件。
手机重启进入刷机模式,然后,执行命令fastboot flash boot boot.img。
完成刷机后,重新开机,就大功告成了。
四、 还原砖头
刷内核,不免会有刷成砖头的情况。
使用步骤1中提取到的原版boot.img,在刷机模式下,执行 fastboot flash boot boot.img 就还原系统了。
⑶ 如何进入安卓手机linux内核
一、需要准备的东西
1
手机必须要Root,没有的度娘解决。
2
首先安装 终端模拟器 软件,稍后有用,度娘一下搞定了。
3
然后是Busybox,这是一款高度集成的Linux小工具集合,也很容易找到,安装好就行。
4
安装Android VNC ,用于连接远程桌面。
5
手机内核必须支持loop和ext2文件系统,实践证明ext3,ext4也是可以的。
(1)检验是否支持loop设备
打开 终端模拟器,键入命令 ls /dev/block看是否有loopN设备,N是数字。
(2)ext支持不好确定,多数安卓都支持,毕竟是Linux系统出身嘛,后续交代。
6
由于sourceforge服务器在地球的另一面的美国,所以访问速度自然是不用吐槽的啦,不过还好镜像服务器还是不少的,可以网络搜索sorceforge镜像
选择你喜欢用的系统下载下来吧。
这里要下载两个文件
(1)、镜像文件
有三个版本,完整版(Large)、精简版(smalll)、核心版(core)
可以在服务器相应文件夹下找到zip文件,大小约500MB,解压出来2GB左右。
* 注:完整版和精简版有桌面程序,核心版只有命令行界面
(2)、脚本文件
在相应Linux发行版文件夹里面找到,带script的zip文件就是了,也下载下来。
END
二、后续操作
下载镜像和脚本文件之后在/sdcard上创建一个文件夹,名字与相应的linux发行版名字相同,将下载到的zip文件解压到此处,镜像和脚本都要解压到这个文件夹。
比如笔者的Ubuntu 10.04就是在/sdcard上创建一个名为ubuntu的文件夹,然后把ubuntu.img和ubuntu.sh解压到/sdcard/ubuntu/即可。
然后就是最重要的一步修改脚本了,许多人不成功就是这里没有修改了。
先看一下脚本文件吧!所有的脚本都是差不多的欧!
如图
找到图上第三行的位置,
mount -o remount,rw /dev/block/mmcblk0p5 /system
我们看到这是挂载/system为 可写 状态,但是这里却是挂载的固定是'/dev/block/mmcblk0p5',这肿么可以??要知道安卓的硬件是遍地开花、各式各样都有,/system的所在的设备也各不相同,比如我的是在/dev/block/mmcblk0p19,以前用的是mmcblk0p12,根本不可能统一的
所以我们需要找到/system究竟对应的是那个分区。
方法:给个比较可靠的方法吧,下载一个和你的手机相对应的刷机包,打开\META-INF\com\google\android\updater-script文件,搜索"/dev/block"关键字,找到一条与system相关的一行,看到了这样一行
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "0", "/system");
那个带/dev/block的那个就是你的system分区,用它来替换原来脚本的那一个 /dev/block/mmcblk0p5吧!
我的修改结果是
mount -o remount,rw /dev/block/platform/msm_sdcc.1/by-name/system /system
这里因人而异,不要照搬哦!
然后打开终端模拟器,测试一下
1.输入 su 并回车,获取root权限
2.输入 cd /sdcard/ubuntu 进入脚本文件所在目录,这里ubuntu替换你创建的文件夹名字
3.输入 sh ubuntu.sh ,运行ubuntu系统
到这里理论上是应该成功了
出现图一这样的情况时就要输入分辨率了,我的是1280x720,比较常用的还有800x600等
输入1280x720 ,回车
等待出现 root@localhost:/# 你的Linux已经启动成功啦
终端模拟器以经连接到ubuntu的终端了
但是没有桌面让我们怎样愉快的玩耍呀?
所以打开AndroidVNC,配置一下 参数
Nickname:随便写
Password :你的Linux名称,我的是ubuntu
Address : 因为是本机运行,所以写 localhost 或者 127.0.0.1
Port : 默认5900
Username:root
Color Format : 24-color (4bpp)
然后点击左上角Connect即可
然后就看见了我们期待已久的Ubuntu界面里
但是还有个问题,不支持中文是一个蛋疼的问题啊
所以在安卓系统上找个中文ttf(直接复制/system/fonts/DroidSansFallback.ttf也是可以的)放到/sdcard
进Linux系统后复制字体到
/usr/share/fonts/truetype/ttf-dejavu
重启就能再见到亲切的中文了!
在Linux界面下
1.音量键相当于键盘的上下箭头↑↓
2.双指可以缩放界面,双指滑动可以滚屏
3.按下菜单键-send 可以 触发特殊键 比如 ctrl + alt + delete 关机重启
4.菜单键- Input Mode 可以选择 鼠标操作方式 , 推荐选择touchPad 把触屏当触摸板用
⑷ 如何把OPPO R821s的外置存储改为内置存储下面的命令怎么改才能内外呼唤 dev_moun
这个是无法修改的,系统存储不能修改的
⑸ linux下怎么编译单片机c代码,怎么下载到51单片机上呢
1.编译软件用sdcc
2.sdcc不支持keil51c 的一些语法。要做以下修改:
sbitled1=P1^0; 改为 #define led1 P1_0
中断函数interrupt改为__interrupt
单个位 P1^0 改为P1_0
若vim安装插件YCM的话,要在.ycm_extra_conf.py加入以下两个路径
/usr/share/sdcc/include
/usr/share/sdcc/include/mcs51
没创建一个工程都要拷贝一份.ycm_extra_conf.py到该工程的目录下。
3.编译用命令
` sdcc 目标文件
4.烧录软件用stcflash.py,该软件只能支持stc89c52rc,不支持stc89c52。我自己亲自试过。
sudo python ./stcflash.py 目标文件
⑹ linux相同流程操作怎么形成命令或者脚本
shell脚本后面跟文件名 sudo sh XXX.sh xxx.c
脚本里$1替换xxx.c