大家好,今天小编关注到一个比较有意思的话题,就是关于linux内核协议栈学习的问题,于是小编就整理了4个相关介绍Linux内核协议栈学习的解答,让我们一起看看吧。
- 装完后串口无法使用,请问在LINUX下如何装串口驱动。谢谢?
- Linux是如何记录进程资源的?你能从C语言源代码层面分析下吗?
- Linux内核中哪个部分最复杂,能否给出一个复杂度排名?
- 怎样在Linux下编程?需要什么技术?
装完后串口无法使用,请问在LINUX下如何装串口驱动。谢谢?
当然是串口。
串口硬件电路简单,不需要任何驱动以及软件,且可以根据需要提供硬件加载各个阶段的调试信息(如bootloader或Linux内核启动阶段的调试信息)。
而以太网接口首先硬件设计较为复杂,软件上也需要驱动和协议栈支持,往往需要等待系统启动进入正常工作状态后才可提供调试信息。
从灵活性上来讲,两者实际上差不太多,串口也只需要一根U***转串口线就可使用。另外因为电脑上有多个u***口,可以连接多个设备同时调试。
串口的速度劣势在调试场合时不明显,不如说以太网的速度用作调试完全是浪费。
据我所知,在嵌入式设备上,串口一直是最主流的调试接口。
Linux是如何记录进程***的?你能从C语言源代码层面分析下吗?
谢邀。
其实简单来说,进程无非就是处于运行期的程序及其相关***的总和。这里读者应该注意“相关***”一词,Linux 在内核中是如何记录进程的***的呢?
首先应该明白,Linux 内核大都是***用C语言编写的,因此要弄清楚内核如何记录进程***,只需要查看相关的C语言代码就可以了。事实上,Linux 内核是使用 task_struct 结构体描述进程的***的,它的C语言部分代码如下,请看:
task_struct 结构体很长,在我手中的 Linux 内核C语言源代码中,它占用了280行。当然了,这其中包含很多条件编译部分,在 32 位机器上,task_struct 大约要占用 1.7 KB 的内存空间,不过考虑到它可以管理完整的进程,1.7kB 其实并不算大了。
鉴于 task_struct 结构体过长,这里不可能将其成员一一介绍清楚。如果读者和我一样好奇,粗略的浏览 task_struct 结构体,应该能够发现一些比较令人熟悉的成员,例如:
通过C语言注释以及成员的变量名,能够看到 task_struct 结构体包含了文件系统,线程结构体,以及进程打开的文件等信息,这就与上一节文章的内容对应上了。其他成员在我之后的文章中会涉及到,这里暂不赘述。
在创建进程时,Linux 通过 slab 分配器分配 task_struct 结构,这样可以避免动态分配和释放带来的开销,提高内存的使用效率。
根据我手上的内核C语言源代码,Linux 中还有一个结构体 thread_info,它的其中一个成员 task 指针正好适合用于索引 task_struct 结构体,在X86_64平台上,thread_info 的相关C语言代码如下,请看:Linux 通常会在内核栈底或者栈顶保留 thread_info 结构,而内核栈通常大小都是可知的,因此每个进程都能方便的从自己的栈中找到 thread_info 结构,进而找到 task_struct 结构。
查找当前进程的 thread_info 结构,可以调用 current_thread_info() 函数,它的C语言代码如下,请看:
可见,current_thread_info() 函数其实就是通过进程栈计算的,因此它的实现与平台架构有关,上述C语言代码其实只是 arm 平台的实现方法,其他平台的实现方法,读者可自行查阅。
Linux内核中哪个部分最复杂,能否给出一个复杂度排名?
Linux中最复杂的模块,我觉得按复杂度可以分为如下几种:
N01:网络通信
Linux网络通信模块首先需要实现各种网路协议栈,IPV4、IPV6、mac8021、无线WIFI、有线ethernet等,首先看懂这些都是一个很难完成任务。
No2:进程调动
Linux进程调度的优先级策略、进程调度的算法、进程的睡眠唤醒都会直接影响一个[_a***_]的好坏,这直接影响你的手机或平板系统的卡顿,功耗。Linux的进程调度系统可以说很优秀的,目前安卓手机底层都是基于Linux系统的。
No3:内存管理
Linux 物理内存、虚拟内存,用户空间和内核空间,这些地址映射和实现 看起来都让人崩溃。
No4:硬件子模块抽象话
Linux系统是开源可移植的,为什么可移植。因为Linux系统将硬件模块底层的驱动框架全部抽象成一个个子系统,代码都是重复可迭代的。每一个硬件模块的驱动都根据统一的框架和接口来实现,这样就能实现平台的可移植性。想想硬件模块那么多种类、那么多类型,实现这个框架还是比较需要功力的。
No5:文件管理系统
Linux是基于文件的系统,把设备(硬盘、软驱、光驱等)都看作文件,文件夹也看作文件。
文件与文件的关系、文件的挂载,通过文件来驱动底层硬件,这都是比较复杂的系统。
以上就是Linux中最复杂的几个模块,当然还有其它很多复杂的模块,可以一起交流一下了!
怎样在Linux下编程?需要什么技术?
在Linux下编程不需要什么特别的技术,你只需要掌握Linux操作系统的使用方法,然后在里面安装你所需要编程语言的IDE即可。
Linux系统下是兼容大部分编译软件的,比如java语言应用最广泛的是eclipse,它具备Linux版本,而且用起来和windows下差别不大。
Linux生态圈还有一款广为人知的可以写代码的软件,那就是vim,如果你在Linux下跑过C语言程序,那一定用过vi这个指令。它类似于Windows上的notepad,功能强大。
Linux入门,个人推荐一本书:《Linux鸟叔的私房菜》。
其实和Windows下面编程流程差不多,唯一的区别就是你需要先熟悉一下Linux环境(毕竟没有Windows使用起来那么方便),其次,还有就是你需要熟悉一下常用的shell命令及vim等编辑器,下面我简单介绍一下:
熟悉常用的Linux Shell命令:这个是使用Linux的基础,像常见的ls,cd,find,mdkir,rm,top,grep,sed,awk,su等,简化版的Linux就只Terminal终端而已,如果你连基本的命令都不会,就不要想着还能操作Linux:
熟悉一下vim,emacs等编辑器的使用,可能在迷你版的Linux下,就只是一个vim编辑器,你所有的编程工作都只能在这个环境下进行,wq!命令,这个你会经常用到,如果是桌面版的,可能还有相关IDE可供使用:
最后就是编程了,这个根据自己的编程语言安装对应的包或编译器就行(gcc,Java,python等),无非就是vim编辑,命令行编译,调试运行而已(和windows平台可能会有差异),开始使用起来不舒服,后面熟悉后,也就没啥了,当然,有些IDE是跨平台的,也有Linux平台的版本,使用起来和windows的差异不会太大:
就分享这么多吧,可能有些乱,初学编程的话,如果对Linux不熟悉的话,建议还是在Windows环境下面进行,使用起来能更方便一些,熟悉后,可在Linux下面进行,当然,直接在Linux下面也行,不过有个熟悉的过程,建议初学者,还是下载一个桌面版的Linux,不至于直接一个终端命令行,使用起来很迷茫,不知所措,以后很多服务器都是基于Linux平台的,Linux的应用也很广泛,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言。
到此,以上就是小编对于linux内核协议栈学习的问题就介绍到这了,希望介绍关于linux内核协议栈学习的4点解答对大家有用。