<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[橙子和小果的博客]]></title><description><![CDATA[百分之99的认知，百分之1的代码]]></description><link>https://blog.youkuaiyun.com/tsb151</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tsb151]]></copyright><item><title><![CDATA[Android.bp入门指南之浅析Android.bp语法]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/120725042</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/120725042</guid><author>tsb151</author><pubDate>Tue, 12 Oct 2021 15:50:05 +0800</pubDate><description><![CDATA[Android源码编译系列博客: 
 
 Android.bp你真的了解吗 Android.bp入门指南之Android.mk转换成Android.bp Android.bp入门指南之浅析Android.bp语法 Android.bp正确姿势添加宏控制编译指南 Android高版本P/Q/R源码编译指南 如何在线查看Android源码自带学习文档docs 
 
 
 
引言 
   在前面的章节初始Android.bp里面我们对Android.bp有了一个基本的认识，知道了它是干啥的。算了吗，还是再介绍一遍]]></description><category></category></item><item><title><![CDATA[一篇文章了解相见恨晚的 Android Binder 进程间通讯机制]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/120724861</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/120724861</guid><author>tsb151</author><pubDate>Tue, 12 Oct 2021 15:39:41 +0800</pubDate><description><![CDATA[最近在学习Binder机制，在网上查阅了大量的资料，也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客，都是从底层开始讲的，全是C代码，虽然之前学过C和C++，然而各种函数之间花式跳转，看的我都怀疑人生。毫不夸张的讲每看一遍都是新的内容，跟没看过一样。后来又看到了Gityuan的博客看到了一些图解仿佛发现了新大陆。 
下面就以图解的方式介绍下Binder机制，相信你看这篇文章，一定有所收获。 
什么是 Binder？ 
Binder是Android系统中进程间通讯（IPC）的一]]></description><category></category></item><item><title><![CDATA[usb gadget configfs 验证]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/108428221</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/108428221</guid><author>tsb151</author><pubDate>Sun, 06 Sep 2020 09:51:52 +0800</pubDate><description><![CDATA[内核打开对应的宏
1、必须打开CONFIG_CONFIGFS_FS和CONFIG_USB_LIBCOMPOSITE的宏，前者为用户空间提供访问配置内核驱动的configfs文件系统，后者提供usb gadget composite框架；
2、必须打开UDC(USB Device Controller)的配置，这个是配置硬件控制器。我这里使用CONFIG_USB_CHIPIDEA和CONFIG_USB_CHIPIDEA_UDC；
3、如果使用mass storage功能，需要打开USB_CONFIGFS_MA]]></description><category></category></item><item><title><![CDATA[Android ramdisk,boot,system.img 解包和打包]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/108046797</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/108046797</guid><author>tsb151</author><pubDate>Mon, 17 Aug 2020 00:20:03 +0800</pubDate><description><![CDATA[一、ramdisk介绍
ramdisk通过字面意思就大概能理解意思，ram disk虚拟内存盘，将ram模拟成硬盘来使用的文件系统。对于传统的磁盘文件系统来说，这样做的好处是可以极大提高文件访问速度；但由于是ram，所以在掉电后，这部分内容不能保存。ramdisk文件系统是在系统上电后直接从磁盘一次性加载到内存，在整个运行期间都不会有写回操作，所以，任何修改都掉电后丢失。
二、ramdisk.img介绍
ramdisk.img是编译Android生成的一个镜像文件，最后和kernel一起打包生成boot.i]]></description><category></category></item><item><title><![CDATA[linux的initrd机制和initramfs机制之initramfs]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/108046748</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/108046748</guid><author>tsb151</author><pubDate>Sun, 16 Aug 2020 23:55:43 +0800</pubDate><description><![CDATA[下面来介绍一下initramfs
initramfs是编到内核中的一种根文件系统，使用的是cpio格式，处理流程和我们之前介绍的initrd机制的cpio格式的流程几乎一样，
只不过这个是编译到内核里的，需要用到时内核会自行解压使用。我们在编内核的时候，可以通过
Initramfs source file(s) 来设置需要编入内核的文件系统的路径。
General setup —&gt;  （就是CONFIG_BLK_DEV_INITRD）
[*] Initial RAM filesystem and RA]]></description><category></category></item><item><title><![CDATA[linux的initrd机制和initramfs机制之initrd]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/108046730</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/108046730</guid><author>tsb151</author><pubDate>Sun, 16 Aug 2020 23:54:39 +0800</pubDate><description><![CDATA[以2.6以后的内核讨论
一、概念
什么是initrd？
initrd的解释是initialized RAM disk，就是启动的时候由uboot来初始化内存，当做disk来使用。在uboot启动的时候，
uboot会将存储介质中（如Flash）的initrd文件加载到内存，内核启动时会在访问挂载的根文件系统前先访问该内存中的
initrd文件系统。在uboot配置了initrd的情况下，文件系统启动被分成两个阶段，第一阶段先执行initrd文件系统中
的"某个可执行文件"（linuxrc或init，下面会讲]]></description><category></category></item><item><title><![CDATA[Linux--根文件系统的挂载过程分析]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/108046079</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/108046079</guid><author>tsb151</author><pubDate>Sun, 16 Aug 2020 23:31:02 +0800</pubDate><description><![CDATA[前言：
本篇文章以S3C6410公版的Linux BSP和U-Boot来进行分析，文中所有提及的名词和数据都是以该环境为例，所有的代码流程也是以该环境为例来进行分析。哈哈。如果有不正确或者不完善的地方，欢迎前来拍砖留言或者发邮件到guopeixin@126.com进行讨论，先行谢过。
简单的来说，根文件系统包括虚拟根文件系统和真实根文件系统。在Kernel启动的初始阶段，首先去创建虚拟的根文件系统，接下来再去调用do_mount来加载真正的文件系统，并将根文件系统切换到真正的文件系统，也即真实的文件系统。
]]></description><category></category></item><item><title><![CDATA[VCC、VDD、VEE、VSS的区别]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107822308</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107822308</guid><author>tsb151</author><pubDate>Wed, 05 Aug 2020 18:46:05 +0800</pubDate><description><![CDATA[电路设计以及PCB制作中，经常碰见电源符号：VCC、 VDD、VEE、VSS，他们具有什么样的关系?
一、解释
VCC：C=circuit 表示电路的意思, 即接入电路的电压
VDD：D=device 表示器件的意思, 即器件内部的工作电压;
VSS：S=series 表示公共连接的意思，通常指电路公共接地端电压
二、说明


对于数字电路来说，VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc&gt;Vdd)，VSS是接地点。


有些IC既有VDD引脚又有VCC引脚，说明这种器件自身带有电压转换]]></description><category></category></item><item><title><![CDATA[【Linux中断子系统】中断上下文中为什么不能休眠？]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107753378</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107753378</guid><author>tsb151</author><pubDate>Mon, 03 Aug 2020 00:31:49 +0800</pubDate><description><![CDATA[参考1：

原帖地址：http://bbs.chinaunix.net/thread-2115820-1-1.html

    1.进入中断处理程序---&gt;2.保存关键上下文----&gt;3.开中断（sti指令）---&gt;4.进入中断处理程序的 handler---&gt;5.关中断（cli指令）----&gt;6.写EOI寄存器（表示中断处理完成）----&gt;7.开中断。

硬中断：
对应于上图的1、2、3步骤，在这几个步骤中，所有中断是被屏蔽的，如果在这个时候睡眠了，操作系统不会收到任]]></description><category></category></item><item><title><![CDATA[为什么函数调用要用栈实现？]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107752860</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107752860</guid><author>tsb151</author><pubDate>Sun, 02 Aug 2020 22:27:34 +0800</pubDate><description><![CDATA[“调用栈”（call stack）既可以指具体实现，也可以指一种抽象概念——由“栈帧￼”（stack frame）或者叫“活动记录”（activation record）构成的栈。
 函数调用的局部状态之所以用栈来记录是因为这些数据的存活时间满足“后入先出”（LIFO）顺序，而栈的基本操作正好就是支持这种顺序的访问。
举例说，假如有下面程序：
int main() {
  a();
  return 0;
}
 
void a() {
  b();
}
 
void b() {
  c();
}
 
voi]]></description><category></category></item><item><title><![CDATA[Linux中I2C子系统框架]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107609273</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107609273</guid><author>tsb151</author><pubDate>Mon, 27 Jul 2020 12:21:35 +0800</pubDate><description><![CDATA[在linux中的i2c分层结构，也是代码的分层结构。

这张图片是从程序调用角度的i2c结构图，其中左侧的/sys和/dev也就是用户访问设备的方式。

代码调用层次图
有时候代码比任何文字描述都来得直接，但是过多的代码展示反而让人觉得枯燥。这个时候，需要一幅图来梳理一下上面的内容
　上面这些代码的展示是告诉我们：linux内核和芯片提供商为我们的的驱动程序提供了 i2c驱动的框架，以及框架底层与硬件相关的代码的实现。
　　剩下的就是针对挂载在i2c两线上的i2c设备了device，而编写的即具体设备驱动了]]></description><category></category></item><item><title><![CDATA[linux内核input子系统解析]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107588170</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107588170</guid><author>tsb151</author><pubDate>Sun, 26 Jul 2020 00:55:25 +0800</pubDate><description><![CDATA[linux内核input子系统解析

时间：2017-01-04作者：华清远见

Android、X windows、qt等众多应用对于linux系统中键盘、鼠标、触摸屏等输入设备的支持都通过、或越来越倾向于标准的input输入子系统。

因为input子系统已经完成了字符驱动的文件操作接口，所以编写驱动的核心工作是完成input系统留出的接口，工作量不大。但如果你想更灵活的应用它，就需要好好的分析下input子系统了。

一、input输入子系统框架

下图是input输入子系统框架，输入子系统由输入子系]]></description><category></category></item><item><title><![CDATA[SEAndroid安全机制框架分析]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107588088</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107588088</guid><author>tsb151</author><pubDate>Sun, 26 Jul 2020 00:43:09 +0800</pubDate><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们知道，Android系统基于Linux实现。针对传统Linux系统，NSA开发了一套安全机制SELinux，用来加强安全性。然而，由于Android系统有着独特的用户空间运行时，因此SELinux不能完全适用于Android系统。为此，NSA针对Android...]]></description><category></category></item><item><title><![CDATA[【Android系统开发】SEAndroid权限解决方法汇总]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107379882</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107379882</guid><author>tsb151</author><pubDate>Thu, 16 Jul 2020 12:00:11 +0800</pubDate><description><![CDATA[前言：
从android5.x开始，引入严格的selinux权限管理机制，经常会遇到各种avc denied的log。
 SEAndroid就是SElinux的增强型版本。
确认问题
先排查是否由SElinux策略导致的问题
串口输入：setenforce 0
串口输入：getenforce 0 即进入了permissive

1. 强制关闭SEAndroid的方法：
1.1 方法一


如果是user版本固件，则在bootcmd加入androidboot.selinux =permissive即可


如]]></description><category></category></item><item><title><![CDATA[【Linux中断子系统】学习中断必备的基础知识之GIC控制器]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107376995</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107376995</guid><author>tsb151</author><pubDate>Thu, 16 Jul 2020 10:30:35 +0800</pubDate><description><![CDATA[通用中断控制器GIC
1.1 GIC简介
GIC 的全称是 generate interrupt controller，即 通用中断控制器。它是由 ARM公司 开发的一个 中断硬件IP，主要用于管理外设中断。
中断为什么需要管理呢？要解决这个问题，我们需要知道 ARM核CPU 的一些小知识。在我们的 ARM核 上，其实只有 2根 中断线，也就是 IRQ(普通中断) 和 FIQ(快速中断)，我们一个SoC 有许多许多个片上外设，这些片上外设如串口UART、I2C总线 等等都需要使用到中断，但是我们只有 2根 ]]></description><category></category></item><item><title><![CDATA[【Linux中断子系统】学习中断必备的基础知识之中断与异常]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107376013</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107376013</guid><author>tsb151</author><pubDate>Thu, 16 Jul 2020 10:07:26 +0800</pubDate><description><![CDATA[异常
1.1 异常与中断
异常 和 中断 这 2 个词相信在各位学习Linux的读者严重不是很陌生。这 2 者在笔者理解来是属于 CPU 的概念，每个 CPU 都会发生 异常 和 中断。


异常：在《ARM嵌入式系统开发》中的定义是 需要中止指令正常执行的任何情形。而这样的情形在 ARM 架构中一共有 7 种，分别是 复位、中断请求(irq)、快速中断请求(fiq)、软件中断(swi/svc)、数据访问中止、预取指中止 及 未定义指令。当 CPU 触发异常时，对自行切换到每种异常相应的 模式，然后跳到 异]]></description><category></category></item><item><title><![CDATA[【Linux中断子系统】疑问记录]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107372189</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107372189</guid><author>tsb151</author><pubDate>Wed, 15 Jul 2020 22:42:38 +0800</pubDate><description><![CDATA[IRQ Number  软件虚拟的 标识外设中断
HW interrupt ID 硬件上的标识外设中断 
1、irq domain干什么用的，为什么要使用它？
irq domain就是指中断领域，任何超出这个范围的定义就没有意义了。
IRQ domain来描述一个中断控制器（IRQ Controller）所管理的中断源。换句话说，每个中断控制器都有自己的domain。我们可以将IRQ Domain看作是IRQ Controller的软件抽象。
这里所说的“中断控制器”，不仅指硬件上实际存在的中断控制器，也可]]></description><category></category></item><item><title><![CDATA[【Linux中断子系统】HW interrupt ID与IRQ number的关系]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107371226</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107371226</guid><author>tsb151</author><pubDate>Wed, 15 Jul 2020 22:01:46 +0800</pubDate><description><![CDATA[下面图片总结了﻿Linux kernel的中断子系统之（二）：IRQ Domain介绍的内容。
图片来自Linux 中断 —— GIC (中断号映射)博客。
可以完整知道内核如何将dts中的中断属性翻译成HW interrupt ID，以及如何将HW interrupt ID与IRQ number关联起来。


...]]></description><category></category></item><item><title><![CDATA[内核中断号必须要跟硬件中断号一致吗]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107370229</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107370229</guid><author>tsb151</author><pubDate>Wed, 15 Jul 2020 20:56:43 +0800</pubDate><description><![CDATA[首先说明，答案是否定的，内核中断号可以与硬件中断号不一致，但是这是个无聊的问题。。实用价值不大。但是却可以引起对内核软件中断号与硬件中断号关系的思考。
两者的关系我觉得可以从中断的初始化和分发过程来一探究竟。
这里就从ARM PPC MIPS 3款主流嵌入式处理器架构的内核代码框架中来分析下他们中断的初始化和分发过程。

一 中断的初始化
对于中断初始化，在系统启动过程中，这3款处理器架构的内核软件框架中都会有相应的中断初始化函数.

内核启动函数start_kernel中会调用init_IRQ来进行中断初]]></description><category></category></item><item><title><![CDATA[USB具体通讯过程（含枚举过程）]]></title><link>https://blog.youkuaiyun.com/tsb151/article/details/107369061</link><guid>https://blog.youkuaiyun.com/tsb151/article/details/107369061</guid><author>tsb151</author><pubDate>Wed, 15 Jul 2020 19:53:51 +0800</pubDate><description><![CDATA[/***********************************************************************USB入门系列：1、USB行业标准介绍2、USB具体通讯过程3、USB中端点详细了解4、USB传输之控制传输......(待补充)********************************...]]></description><category></category></item></channel></rss>