Linux

调试

Ubuntu12.04使用串口调试Android实现(硬件USB转串口PL2303+软件Minicom)

http://blog.csdn.net/lxc1014/article/details/9052677


面向对象:

input_handler中的多态实现:input是一个大类 ,对input这个大类open的时候,调用对应inpu_handler的open.   如果初始化的是input_register_handler(&mousedev_handler),则调用的是mousedev_handler的open,  如果初始化的是input_register_handler(&evdev_handler);,则调用evdev_handler的open.




进程和线程

数据是进程对进程的,端口是为了确定进程的。
进程:内存空间是独享,安全性高。进程中包括线程
线程:内存空间可以共享,高并发,稳定性差。
进程是系统分配资源的最小单位,线程是调度的最小单位。
节俭资源,线程见方便通信
POSIX接口,pthread.h,连接时需要使用库libpthread.a


 

目标:会裁剪android内核

1号进程(一般是init进程)永远不会终止。
它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),
但是它以超级用户特权运行。

内核空间:访问的空间更加广泛;用户空间:访问空间有限

进程的创建
fork()函数复制时将父进程的所有资源都通过复制数据结构进行了复制,然后传递给子进程,所以fork()函数不用带参数;
clone()函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定。

fork()的返回值,fork函数被调用一次但返回两次。返回0表示运行在子进程中;大于0表示运行在父进程中,代表的是子进程ID;返回-1表示出错。
      那个线程先运行,取决于内核的调度算法。


exec
在调研fork函数创建子进程后,只是提供一个执行进程的环境,具体要执行那个进程,往往要调用一种exec函数以执行另一个程序

父子进程之间的区别:
进程ID不同;
子进程的tms_utime,tms_stime,tms_cutime以及tms_tstime设置为0;
父进程设置的锁,子进程不继承。
子进程的未决警告被清除。
子进程的未决信号集设置为空集。

写时拷贝
    从代码运行看,子进程中先修改了变量的值,并不影响父亲进程,说明数据段,栈(当然包括其他用户空间内存),
子进程是申请了新的物理空间。可以自己验证代码段,BSS段,堆空间等。流中缓冲区,会缓冲没有刷新的信息,且缓冲区
在用户空间中,也会被子进程复制一份。
    但是从打印的地址来看(&),好像是一样的,又是同一段内存。其实不一样,因为&打印的是在进程中的虚拟地址,而不是物理地址
编号;虚拟内存管理技术,每个进程采用的虚拟地址空间是没有任何联系的,是独立的,用户空间大小为3G,地址为0到0xbfffffff。
内核空间大小为3G到4G.用户进程通常情况只能访问用户空间的虚拟地址,不能访问内核空间。例外的情况是通过系统调用访问内核空间。

进程空间
用户空间和进行对应,所有当进程切换,用户空间就会跟着变化。


进程的创建
每个进程在生成的时候会分配Task_struct和两页或一页的内存作为该进程进行系统调用或者中断时的内核栈。

调度
学习调度策略,调度时机,调度步骤
调度:肯定是从就绪的进程中选择,不会从阻塞的进程中选择。
最适合的:就有选择策略决定。调度时机,调度步骤


时钟中断随时都在发生

调度标志need_resched
表明是否需要重新执行一次调度
设置时机:
当某个进程耗尽它的时间片时,会设置这个标志。(意思是说,需要重新调度了)
当一个优先级更高的进程进入可执行状态的时候,也会设置这个标志。(意思是:可以发生抢占了)

总的调度:设的优先级高选谁,
linux有两种调度类:完全公平调度类CFS(包含SCHED_NORMAL,SCHED_BATCH,SCHED__IDEL调度策略),实时调度类(SCHED_FIFO和包含SCHED_RR调度策略)。
进程和调度策略对应。

当一个程序运行在用户态和内核态的时候,是有不同的堆栈的。
进程的四个要素:
1.有一段程序供其执行;
2.有专用的内核空间堆栈;
3.内核中有一个task_struct数据结构
4.有独立的用户空间

linux中,线程、进程都是使用task_struct来表示,它包含了大量描述
进程/线程的信息。
有共享的用户空间---是用户线程
没有用户空间-------是内核线程

内核线程没有用户空间,连共享的用户空间都没有。

task_struct是由内核来维护。2.6的内核,当创建一个进程的时候,会跟系统申请8k或4k的页面,页面的底部就是thread_info,其他
的空间是用做堆栈的。

操作系统原理中,进程的经典的三态:运行,就绪和阻塞。

进程两大类:实时进程,非实时进程
nice值是人为可控制,正真的优先级不是nice,只能通过Nice值来干涉而已。
凡是这种内核根据是IO消耗型还是处理器消耗型来动态调整优先级的这种进程称为非实时进程(也叫动态进程)。
实时进程不会被内核改变它的优先级。


内核子系统
Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)5个子系统组成。
进程调度(SCHED)控制着进程对CPU的访问;内存管理(MM)允许多个进程安全地共享主内存区域;虚拟文件系统(VirtulFile System VFS)隐藏了各种不同硬件的具体细节,
为所有设备提供了统一的接口,VFS还支持多达数十种不同的文件系统,这也是Linux较有特色的一部分。网络接口(NET)提供了对各种网络标准协议的存取和各种网络硬件的支持。
进程间通信(IPC)支持进程间各种通信机制。



内存管理

段式管理,页式管理都是针对处理器来说的。
任何一个物理地址可以表示为PA=段寄存器的值*16(段基地址)+逻辑地址(段内偏移)

页式管理
cr3寄存器--页目录基地址(创建页表和页目录的时候创建,每一个进程都有一个不同的页目录和页表)
高10位   --页目录的偏移量 (页目录存放的是页表的基地址)
中间10位 ---页表的偏移量 (页表存放的是一个存储单元的基地址)
低12位--一个存储单元的偏移量


书籍(看书,不理解的话找视频和资料来看):
三、内核驱动层

    1. 《Linux内核设计与实现》

    Linux开发四大名著之一,简称LKD。是迅速理解Linux整体框架的最佳选择。

    2. 《深入理解Linux内核》

    Linux开发四大名著之一,简称ULK。理解Linux内核的最佳选择。
  
    3.《Linux设备驱动程序》

    Linux开发四大名著之一,简称LDD。理解Linux驱动的最佳选择。

    4.《深入理解Linux内核架构》

    Linux开发四大名著之一,简称PLKA。理解Linux架构的最佳选择。

  二、框架层

    框架层相对稳定,国内原创书籍质量也比较高。推荐下面的学习资料:

    1. 《Android系统源代码情景分析》和老罗的Android之旅博客

    作者:罗升阳。基于Android 2.3。老罗的特点是功底深厚,分析深入,对框架层核心模块的理解都很清晰透彻。需要读者有较高的起点,对C和C++部分的分析更为详细,对深入理解框架层非常有用。这本书对Binder驱动、智能指针、Ashmem、键盘消息处理机制、Service、Log系统的分析非常好。建议学习框架层必备。

    2. 《Android的设计与实现:卷1》
 
    作者:杨云君。基于Android4.1。这本书的特点是思路清晰,分析严谨细致,基本没留下什么盲点,对解决实际问题非常有用。对Java部分的分析更为详细。这本书对PackageManager、应用程序安装过程、ActivityManager、消息处理、进程管理、应用程序启动过程、系统启动过程的分析非常好。建议学习框架层必备。

 

vfork()

vfork 出来的子进程里,不能修改任何变量,子进程也不能通过  return/exit() 的方式来退出. 
vfork 出来的子进程唯一能做的事情有两件:
1. 通过 _exit() 来结束
2. 调用 exec 类系统调用(比如 execlp, execvp等)来载入和执行其他程序。
在vfork子进程中执行任何非上述两个以外的动作,得到的结果都是不可预测的。


mkfifo

我也在看国嵌视频,你说的问题我也遇到了,是因为man fifo里有说fifo只能用只读方式打开,以只写方式打开之前管道的另一端必须已被打开(当然是先以只读方式打开的),估计是管道可空不可满,所以限制打开方式吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值