linux
LINUX内核是什么?
一、LINUX内核是什么?
Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。[1]
Linux最早是由芬兰 Linus Torvalds为尝试在英特尔x86架构上提供自由的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些 Minix 黑客提供了协助,而如今全球无数程序员正在为该计划无偿提供帮助。
二、linux原始内核是什么?
Linux原始内核是Linus Torvalds于1991年开始开发的一款免费、开源的操作系统内核。它由C语言编写而成,具有高度的可移植性和灵活性,支持多种硬件平台和系统架构。Linux原始内核具有许多特性,如多进程、多用户、虚拟内存和网络协议栈等,使其成为一款高性能、安全、稳定的操作系统内核。同时,它的开源特性吸引了众多开发者的参与,形成了一个开放、活跃的开源社区,不断推动Linux内核的发展和创新。
三、linux内核指的是什么?
Linux内核指的是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
Linux最早是由芬兰Linus Torvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。该计划开始于1991年,该计划的早期有一些Minix黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。
四、Linux kernel是Linux内核,这到底是什么?
系统现象
我们执行 ps 会发现一个叫 ksoftirqd 的线程
ps -ef | grep ksoftirqd
root 6 2 0 8月19 ? 00:01:15 [ksoftirqd/0]
root 14 2 0 8月19 ? 00:01:13 [ksoftirqd/1]
root 20 2 0 8月19 ? 00:00:51 [ksoftirqd/2]
root 26 2 0 8月19 ? 00:00:56 [ksoftirqd/3]
root 31 2 0 8月19 ? 00:00:58 [ksoftirqd/4]
root 36 2 0 8月19 ? 00:00:56 [ksoftirqd/5]
root 41 2 0 8月19 ? 00:01:01 [ksoftirqd/6]
root 46 2 0 8月19 ? 00:01:00 [ksoftirqd/7]
root 51 2 0 8月19 ? 00:00:46 [ksoftirqd/8]
root 56 2 0 8月19 ? 00:00:31 [ksoftirqd/9]
root 61 2 0 8月19 ? 00:00:57 [ksoftirqd/10]
root 66 2 0 8月19 ? 00:01:20 [ksoftirqd/11]
root 71 2 0 8月19 ? 00:01:29 [ksoftirqd/12]
root 76 2 0 8月19 ? 00:00:58 [ksoftirqd/13]
root 81 2 0 8月19 ? 00:00:49 [ksoftirqd/14]
root 86 2 0 8月19 ? 00:00:48 [ksoftirqd/15]
软中断:
从上面的结果可以看出,每个处理器都有一个这样的线程。所有的线程的名字都叫做 ksoftirq/n,区别在于 n,他对应的是处理器的编号。
这个线程就是专门用于处理软中断的程序。
软中断:
UN1X 系统提供软中断机制作为进程通信的一种手段。软中断是通过发送规定的信号到指定进程,对方进程定时地查询有无外来信号,若有则按约定进行处理,处理完毕,返回断点继续执行原来的指令。可见,软中断是对硬中断的一种模拟。软中断存在较大的时延,不象硬中断能获得及时响应。例如,对方进程若处在阻塞队列,那么只有等到该进程执行时才能查询软中断信号。显然,从软中断信号发出到对方响应,时间可能拖得很长。此外,软中断处理程序运行在用户态,硬中断处理程序则运行在核心态。
优先级:
中断>软中断>用户进行
对于软中断,内核会在几个特殊的时机执行(注意执行和调度的区别,调度软中断只是对软中断打上待执行的标记,并没有真正执行),而在中断处理程序返回时处理是最常见的。
代码分析
在 <Softirq.c (kernel)> 中
static int ksoftirqd(void * __bind_cpu)
{
set_user_nice(current, 19);
current->flags |= PF_NOFREEZE;
set_current_state(TASK_INTERRUPTIBLE); //处于等待队伍中,等待资源有效时唤醒(比方等待键盘输入、socket连接、信号等等)
while (!kthread_should_stop()) {
preempt_disable();
if (!local_softirq_pending()) {
preempt_enable_no_resched();
schedule();
preempt_disable();
}
set_current_state(TASK_RUNNING); //正在运行或处于就绪状态
while (local_softirq_pending()) { //当有软中断未解决
// cpu正常可用
if (cpu_is_offline((long)__bind_cpu))
goto wait_to_die;
do_softirq(); //执行软中断 这里一般执行的就是 注册的回调函数,比如epoll
preempt_enable_no_resched(); //抢占cpu计数-1 但不立即抢占式调度
cond_resched(); //在内核态主动让出cpu可以调用cond_resched,让出cpu,此时就是等待调度
preempt_disable(); //cpu抢占计数+1 就是当cpu重新调度到此处时,提高计数
/**
当从内核态返回到用户态的时候,要检查是否进行调度,而调度要看两个条件:
1. preempt_count是否为0
2. rescheduled是否置位
因此上方让出cpu之前先将preempt_count-1(否则cond_resched可能失败),调度到ksoftirq又加回来
*/
}
preempt_enable();
set_current_state(TASK_INTERRUPTIBLE); //执行完一次 标记线程进入等待队列
}
set_current_state(TASK_RUNNING); //这里是为了执行之后的处理 保证本线程正常终止
return 0;
wait_to_die:
preempt_enable();
/* Wait for kthread_stop */
set_current_state(TASK_INTERRUPTIBLE);
//kthread_should_stop()返回should_stop标志。它用于创建的线程检查结束标志,并决定是否退出
while (!kthread_should_stop()) { //只要不接受到结束信号,就继续进行调度
schedule();
set_current_state(TASK_INTERRUPTIBLE);
}
set_current_state(TASK_RUNNING); //这里是为了执行之后的处理 保证本线程正常终止
return 0;
}
小知识
cpu 抢占
在中断或临界区代码中,线程需要关闭内核抢占,因此,互斥机制(如:自旋锁(spinlock)、RCU 等)、中断代码、链表数据遍历等需要关闭内核抢占,临界代码运行完时,需要开启内核抢占。关闭 / 开启内核抢占需要使用内核抢占 API 函数 preempt_disable 和 preempt_enable。
关于抢占 cpu 的几个函数认知
内核抢占API函数说明如下(在include/linux/preempt.h中):
preempt_enable() //内核抢占计数preempt_count减1
preempt_disable() //内核抢占计数preempt_count加1
preempt_enable_no_resched() //内核抢占计数preempt_count减1,但不立即抢占式调度
preempt_check_resched () //如果必要进行调度
preempt_count() //返回抢占计数
preempt_schedule() //核抢占时的调度程序的入口点
线程状态
看完这段代码,要了解一下 linux 线程的状态:
- TASK_RUNNING:正在运行或处于就绪状态:就绪状态是指进程申请到了 CPU 以外的其它全部资源。正所谓:万事俱备,仅仅欠东风。提醒:一般的操作系统教科书将正在 CPU 上运行的进程定义为 RUNNING 状态、而将可运行可是尚未被调度运行的进程定义为 READY 状态。这两种状态在 Linux 下统一为 TASK_RUNNING 状态.
- TASK_INTERRUPTIBLE:处于等待队伍中,等待资源有效时唤醒(比方等待键盘输入、socket 连接、信号等等),但能够被中断唤醒。普通情况下,进程列表中的绝大多数进程都处于 TASK_INTERRUPTIBLE 状态。毕竟皇帝仅仅有一个(单个 CPU 时),后宫佳丽几千;假设不是绝大多数进程都在睡眠,CPU 又怎么响应得过来.
- TASK_UNINTERRUPTIBLE:处于等待队伍中,等待资源有效时唤醒(比方等待键盘输入、socket 连接、信号等等),但不能够被中断唤醒.
- TASK_ZOMBIE: 僵死状态。进程资源用户空间被释放,但内核中的进程 PCB 并没有释放。等待父进程回收.
- TASK_STOPPED: 进程被外部程序暂停(如收到 SIGSTOP 信号,进程会进入到 TASK_STOPPED 状态),当再次同意时继续运行(进程收到 SIGCONT 信号,进入 TASK_RUNNING 状态)。
ksoftirqd 创建过程
inux/init/main.c(do_pre_smp_initcalls)-> linux/kernel/softirq.c(spawn_ksoftirqd)-> linux/kernel/softirq.c(cpu_callback)
五、linux内核源码是什么语言?
Linux内核源码是用C语言编写的。C语言是一种高级编程语言,被广泛应用于系统编程、嵌入式开发、游戏开发等领域。Linux内核源码被设计成高效、可移植、可维护的,因此选择C语言作为开发语言是理所当然的选择。此外,Linux内核也包含了一些汇编代码,用于处理一些底层的硬件操作。总之,Linux内核源码的编写语言是C语言。
六、Linux系统底层内核是什么?
Linux内核[kernel]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持LVM或Quota等文件系统等等,如果内核不认识某个最新的硬件,那么硬件也就无法被驱动,你也就无法使用该硬件。
七、linux 内核版本查询命令是什么?
怎么查看linux内核源代码?
一般在Linux系统中的/usr/src/linux*.*.*(*.*.*代表的是内核版本,如2.4.23)目录下便是内核源代码(如果没有类似目录,是因为还没装置内核代码)。另外还可从互连网上免费下载。注意,不要总到http://www.kernel.org/去下载,最好运用它的镜像站点下载。请在http://www.kernel.org/mirrors/里找一个合适的下载点,再到pub/linux/kernel/v2.6/目录下去下载2.4.23内核。
代码目录结构
在阅览源码之前,还应知道Linux内核源码的全体散布状况。现代的操作系统一般由进程办理、内存办理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,其组成如下(假定相关于Linux-2.4.23目录):
1.arch目录包括了一切和系统结构相关的中心代码。它下面的每一个子目录都代表一种Linux支撑的系统结构,例如i386便是Intel CPU及与之相兼容系统结构的子目录。PC机一般都基于此目录。
2.include目录包括编译中心所需求的大部分头文件,例如与渠道无关的头文件在include/linux子目录下。
3.init目录包括中心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研讨中心怎么工作的好起点。
4.mm目录包括了一切的内存办理代码。与详细硬件系统结构相关的内存办理代码坐落arch/*/mm目录下。
5.drivers目录中是系统中一切的设备驱动程序。它又进一步划分红几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。
6.ipc目录包括了中心进程间的通讯代码。
7.modules目录存放了已建好的、可动态加载的模块。
8.fs目录存放Linux支撑的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的便是ext3子目录。
Kernel内核办理的中心代码放在这儿。同时与处理器结构相关代码都放在arch/*/kernel目录下。
http://9.net目录里是中心的网络部分代码,其每个子目录对应于网络的一个方面。
10.lib目录包括了中心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
11.scripts目录包括用于配置中心的脚本文件。
12.documentation目录下是一些文档,是对每个目录效果的详细阐明。
一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时运用的辅佐文件。仔细阅览这两个文件对弄清各个文件之间的联系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些阐明,同样有利于对内核源码的了解。
在阅览方法或次序上,有纵向与横向之分。所谓纵向便是顺着程序的履行次序逐渐进行;所谓横向,便是按模块进行。它们经常结合在一起进行。关于Linux发动的代码可顺着Linux的发动次序一步步来阅览;关于像内存办理部分,能够独自拿出来进行阅览剖析。实际上这是一个反复的过程,不可能读一遍就了解。
楼主如果想要学习Linux运维这方面的知识的话可以点击下方的卡片领取一份免费的学习资料哦!
2023最新整理云计算运维/开发/网工/必备资料八、Linux Kernel (Linux内核)怎么安装?
1、下载新内核源码:到官网www.kernel.org,下载最新版本linux内核,保存到/usr/src/kernels目录,大约54MB。
2、#cd/usr/src/kernels
3、#tarjvxflinux-2.6.31.5.tar.bz2
4、进入系统原内核目录,把其中的隐藏文件.config复制到新内核目录中。
5、cd进入新内核目录,然后执行#makeoldconfig 此时所有提示均按回车,选项提示都默认。
6、#makexconfig此时弹出一个内核配置窗口,里面全是英文,我看不懂,干脆就直接把这个窗口关掉,继续往下做。
7、#makebzImage&&makemodules&&makemodules_install&&makeinstall第七步编译时间比较长,要30到50分钟不等,要看机器情况了。
8、#uname-r查看内核版本,完成上面步骤后就可以重启系统了,启动时会在GRUB菜单里出现新内核选项了。 此方法安装新内核后同时也会保留旧内核,启动时,可以在新老内核间选择,相当的实用
九、android内核和linux内核的区别?
Android内核和Linux内核的主要区别体现在以下几个方面:
首先,Android内核基于Linux内核并进行了一系列修改。这些修改包括了来自谷歌的特定调整,使得Android内核适用于移动设备等资源受限的环境。其中最显著的区别是Android内核添加了Dalvik/ART虚拟机层,这允许在Android平台上高效地运行Java/Kotlin应用程序。
其次,Android Binder是Android内核中一个关键的组件,它提供了进程间通信(IPC)的功能。与Linux系统中使用D-bus进行IPC的方式不同,Android Binder采用了基于OpenBinder框架的设计,这使得Android平台可以更好地支持多核处理器和分布式系统。
此外,Android内核针对移动设备的特性进行了优化。例如,Android内核中的电源管理模块被设计成更加节能高效,以适应移动设备的电池寿命需求。同时,Android内核还对内存管理进行了调整,以适应移动设备的有限内存资源。
需要注意的是,Android内核基于上游Linux长期支持(LTS)内核进行开发。在谷歌,LTS内核会与Android专用补丁结合,形成所谓的“Android通用内核(ACK)”,这有助于保持Android系统的稳定性和可靠性。
总结而言,尽管Android内核与Linux内核共享许多基本特性,但由于针对移动设备的特殊需求进行了优化和修改,它们之间存在明显的差异。这些差异包括了虚拟机层的加入、IPC机制的改变以及针对移动设备的优化特性。
十、Linux是宏内核还是微内核?
GNU那帮人就是太牛了导致弄不出来内核。
因为 GNU 项目的内核的设计是微内核设计,结果太过于先进而…… 而 Linux 是传统的宏内核设计,这种内核随便找几个认真上课的大本学生就能凑合嘀咕出来一个。结果因为 Linus 选择了 GPL 协议,所以大家的注意力就全都到了 Linux 上面,技术先进的 Hurd 反而成了弃子。Linus 完成的内核其实也不怎么样,那是在一帮疯子的合作下才实现真正成为可用的内核的。还有,GNU 项目是 84 年成立的,Linux 也已经有20年多的历史了。GNU 那帮疯子应该是说 30 年造不出一个内核。其实 hurd 一直就有,但总是没办法拿出来用而只能用于“技术试验”。Debian 有 Hurd 内核的版本。热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...