Linux微内核(鸿蒙分析)

Linux微内核(鸿蒙分析),第1张

1、最近鸿蒙炒的火热,19年就说ipc是谷歌fuchsia的5倍,但他当时没有对比宏内核,正常宏内核的ipc效率肯定很高。

我自己觉得微内核确实是体积小了但是外面的那些驱动什么的又需要开发者去开发,这些开发者前期也就只有华为的开发人员去弄

鸿蒙独立了跑到国外谷歌全家桶又是一个不可逾越的鸿沟,GMS用不了国外就没希望,何况fuchsia这个谷歌的备用还在那摆着,所以鸿蒙切入点在国内,以万物互联为主题是最佳发展方式。

个人比较喜欢鸿蒙的一些东西,也相信它一定会成功,或许3年或许更久,但是现在取代安卓是不可能的的,不过打破垄断全新开源,重新定义5G万物互联时代,作为一个学生还是开了眼的。

2、相对与安卓来说全场景、分布式是鸿蒙OS2.0的最大优势,鸿蒙OS2.0首先在分布式能力上经行了提升分布式软总线、分布式数据管理、并提升了分布式安全能力,(手表电视 汽车 中控外加美的九阳老板电器)、EMUI11借鉴了鸿蒙的分布式技术,多屏协同。

3、GPL:谷歌曾提出影响开源世界最大的障碍就是GPL,GPL规定要求代码使用者代码衍生出来的东西永远开源。谷歌为了隔离gpl的开源,提出了Apache(阿帕奇)协议,就是我开源你随便。

谷歌把一个魔改后的linux作为内核封装起来,中间加了一层类库,让其他所有部分对内核的调用,都像是两个软件之间的调用一样,然后把所有涉及到GPL授权的代码全部替换重写,开源并以Apache协议授权。

这就导致linux社区不满,因为它违反了Linux开源精神如果非强制会导致没人愿意开源,2012年安卓在linux分支树上被永远除名

话说回来要不是Apache哪里来的EMUI Flyme Coloros,要是GPL的话那不是给人打工吗。

4、安卓的linux内核包含了权限管理,CPU指令适配、设备驱动等等

微内核简单理解就是:裁剪了一下,更小了,手机平板手表通用,手机摄像头给手表用,内核一样,手机上有摄像头的设备驱动,不同于wifi、蓝牙华为可以通过分布式软总线来实现信息的传递,这一步5G起到了关键作用。关于分布式软总线的介绍在博客最后。

优势1:灵活的全场景适用,不同屏幕大小、功耗和性能要求的设备可以灵活选择,这样一个应用就有可能在多个设备或者华为所说的全设备上运行,这对于5G万物互联来说非常方便

优势2:安全,恶意代码只能在某个模块下运行,不再是宏内核整个root权限下随便运行

5、当前鸿蒙智慧屏上鸿蒙1.0是linux 鸿蒙 liteos三核并存,因为他生存初期必须要保证鸿蒙系统的可用性,他前期要兼容安卓,一点一点替换安卓的驱动等等,开源的世界有现成的就没人会去造轮子。

6、对于鸿蒙的分布式,也就是软硬件资源共享,其实是基于微内核的,宏内核要实现ipc通信就需要用户空间进程调度到内核空间内核空间再到另一个用户进程空间实现资源传递,宏内核的内核空间是共享的,所谓的新建一个进程可以说是只是说新建了自己独立的用户空间,这里面的ipc通信效率目前来说是要比微内核的效率要高的,而华为的分布式ipc是要通过软总线来实现的,如果借助tcp来实现安全可以保证,但是协议繁琐效率降低,这对于我们物联网的交互来说是不可采取的,所以软总线相当于一个魔改的tcp。

分布式软总线将原本计算机网络通讯协议七层结构中的 表示层、会话层、传输层和网络层等协议精简为一层 ,称为 分布式软总线的极简协议 ,能提升有效载荷。

通过报文简化、包头简化、交互简化,基于应用场景的缓冲机制等方式,提升有效的传输负荷、解决传统 TCP/IP 协议过于复杂的协议层次模型、层层增加包头和解包,充分发挥物理通信通道的最大效能。

通过对协议的优化,分布式软总线无线连接、高带宽、低时延、低功耗、安全接入的优点。分布式软总线实现小于20ms的低时延,端到端时延小于20ms,有效吞吐量达到1.2Gbps,抗丢包性达到25%, 高性能IPC将进程间的通信效率提升了5倍 。

简单理解可以把它想象成优化的tcp更快实现资源共享。

开头就说明了这里的 list.h 文件来自 Linux Kernel ( */include/linux/list.h ),只是去除了列表项的硬件预加载部分。

进行宏替换后就是

Note: 没搞懂这里为什么加个 osn 前缀,原本是 list_add ,现在是 osn_list_add 。

可以看到就是个简单的链表节点删除过程,同时把删除节点的前后指针设为无法访问。

删除节点后初始化,前后指针都指向自己

从A链表删除后头插法插入B链表

从A链表删除后尾插法插入B链表

先对 list 判空,非空就把 list 链表除头节点外裁剪到 head 头节点在的链表中。函数不安全, list 节点可以继续访问其他节点。

多了一步 list 重新初始化的过程。

(unsigned long)(&((type *)0)->member))) 将0x0地址强制转换为 type * 类型,然后取 type 中的成员 member 地址,因为起始地址为0,得到的 member 的地址就直接是该成员相对于 type 对象的偏移地址了。

所以该语句的功能是:得到 type 类型对象中 member 成员的地址偏移量。

先将 ptr 强制转换为 char * 类型(因为 char * 类型进行加减的话,加减量为 sizeof(char)*offset , char 占一个字节空间,这样指针加减的步长就是1个字节,实现加一减一。)

整句话的意思就是:得到指向 type 的指针,已知成员的地址,然后减去这个成员相对于整个结构对象的地址偏移量,得到这个数据对象的地址。

就是从前往后,从后往前的区别

Note: 从head节点开始(不包括head节点!)遍历它的每一个节点!它用n先将下一个要遍历的节点保存起来,防止删除本节点后,无法找到下一个节点,而出现错误!

已知指向某个结构体的指针pos,以及指向它中member成员的指针head,从下一个结构体开始向后遍历这个结构体链

Note: 同理,先保存下一个要遍历的节点!从head下一个节点向后遍历链表。

list.h使用说明

linux内核list.h分析(一)

linux内核list.h分析(二)

【Linux内核数据结构】最为经典的链表list

如何查询Linux内核版本

终端下输入

[xxxx@ ~]uname -r

3.5.0-34-generic

查看内核版本命令:

1) [root@q1test01 ~]# cat /proc/version

Linux version 2.6.9-22.EL *** p (bhpile@crowe.devel.redhat.) (g version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1 SMP Mon Sep 19 18:00:54 EDT 2005

2) [root@q1test01 ~]# uname -a

Linux

q1test01 2.6.9-22.EL *** p #1 SMP Mon Sep 19 18:00:54 EDT 2005 x86_64

x86_64 x86_64 GNU/Linux3) [root@q1test01 ~]# uname -r2.6.9-22.EL *** p

如何查询Linux内核函数

如果要看这两个函数在标准库中的定义用ctags或cscope生成索引.h,cscope,可以跳转到函数定义,man malloc,声明见stdlib。

如果仍然找不到,可以用ctags,si或grep。

windows下用source insight也可,然后查找函数定义,用grep -r 搜索关键字,atoi和malloc在C的标准库中有定义。

1.安装ctags

在源代码目录下运行

ctags -R

这样,会递归生成当前目录下及其子目录的tags文件。

2.使用VIM根据tags文件查找函数或结构定义。

1.在源码目录下查找

vi -t tagname

2.如果要在任意位置使用,则需要把该tags文件添加到~/.vimrc文件中

set tags=/home/money/sda8/2.6232/tags

3.如果要在代码中实时跟踪,则光标移动到函数名上,使用CTRL+]键,按CTRL+t可以返回。

如果要跟踪系统函数,使用shift+K可以自动跳转道光标所在函数的手册。

如何分析LINUX内核2.6.29版本

uname -a 显示版本号,是这意思吗?

这个问题太大了,近似于说:请教下我怎么编写一个Linux内核。

分析内核唯一可以做的就是一行行看代码,Linux早期版本有完整的代码分析,如果是指定2.6.29的话,那估计有人做出来就可以出书收钱了……

如何根据linux内核判断linux版本

在Linux内核的顶层Makefile中,顶端就有,格式为

VERSION = 3

PATCHLEVEL = 0

SUBLEVEL = 8

EXTRAVERSION =

NAME = Sneaky Weasel

以上的版本号就是3.08

如何修改linux内核版本号

得重新编译内核,之前修改源代码的顶层目录下的Makefile文件,比如2.6.29.1内核的Makefile中:

VERSION = 2

PATCHLEVEL = 6

SUBLEVEL = 29

EXTRAVERSION = .1

在Qt C/C++中怎样查询Linux内核版本号

查询Linux内核版本号可以调用uname函数,uname函数的函数原型是这样的:

int uname(struct utsname *name)

uname函数在调用时需要向它传递一个utsname结构体指针(或地址),uname函数会写入name参数指向的utsname结构体,Linux的内核版本号就保存在utsname结构体的release成员里面,代码就像下面这样:

struct utsname uts

if(uname(&uts) >= 0) {

printf("The version is %s\n", uts.release)

}

注意,使用uname函数需要包含sys/utsname.h头文件:

#include <sys/utsname.h>


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

原文地址: http://outofmemory.cn/tougao/6060644.html

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

发表评论

登录后才能评论

评论列表(0条)

保存