linux 内核是啥, 本人有linux基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 内核是啥, 本人有linux基础相关的知识,希望对你有一定的参考价值。

用过linux,但只不过是比较表面的应用,人们都说Linux内核,我想问一下,内核是不是指的就是用shell控制的东西?

Linux内核:Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰 Linus Torvalds为尝试在英特尔x86架构上提供自由的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。

Linux最早是由芬兰人Linus Torvalds设计的。当时由于UNⅨ的商业化,Andrew Tannebaum教授开发了Minix操作系统以便于不受AT&T许可协议的约束,为教学科研提供一个操作系统。

扩展资料:

Linux将标准的GNU许可协议改称Copyleft,以便与Copyright相对照。通用的公共许可(GPL)允许用户销售、拷贝和改变具有Copyleft的应用程序。当然这些程序也可以是Copyright的,但是你必须允许进一步的销售、拷贝和对其代码进行改变,同时也必须使他人可以免费得到修改后的源代码。事实证明,GPL对于Linux的成功起到了极大的作用。它启动了一个十分繁荣的商用Linux阶段,还为编程人员提供了一种凝聚力,诱使大家加入这个充满了慈善精神的Linux运动。

参考资料来源:百度百科-Linux

参考资料来源:百度百科-内核

参考技术A (Linux)内核是(Linux)操作系统的核心,一般包含五大部分:进程管理、存储管理、文件管理、设备管理和网络管理,是一组程序模块,具有访问硬件设备和所有主存空间的权限,是仅有的能够执行特权指令的程序。主要功能是:资源抽象、资源分配、资源共享。(资源是指CPU、内存等。)在内核基础上挂载第三方软件便构成操作系统,Ubuntu、RedHat、Fedora、Debian等都是基于Linux内核(版本号可能不同)的不同操作系统。

内核函数对用户是完全透明的,用户想要调用内核函数只有两种途径:一是 应用程序→系统调用(程序接口)→操作系统;二是 操作命令→系统程序(作业接口)→操作系统。

内核是不是指的就是用shell控制的东西?
shell命令可能是普通的应用程序,也可能是库函数或系统调用(你可以理解为内核函数)。
如果你想查看某命令是普通shell命令,还是库函数或系统调用,可以在终端输入“man 命令”查看。如man open,左上角应该是OPEN(2)。1 表示普通shell命令,2 表示系统调用,3 表示库函数。

注:库函数事实上是内核函数的封装,介于应用程序与内核函数之间。应用程序是不能直接访问内核函数的,必须通过库函数。这是一种保护内核函数的一种机制。

事实上很多时候我们都要用到内核函数,只是我们并不知道而已,如打开文件要调用open()、关闭文件要调用close()等等追问

那么请问人们常说做linux驱动开发,指的是什么?比如说我新开发出一个产品要往里面写系统是不是就是在做驱动开发?

追答

很多硬件设备不安装驱动程序是无法使用的或者性能很差,如音频设备、USB设备、网络设备。linux驱动开发是指开发基于linux系统的驱动程序。

很多嵌入式设备是没有操作系统的,只有简单的驱动程序、控制程序等,如电冰箱、微波炉、部分手机,因为功能简单,没有为其安装操作系统的必要,要安装操作系统的设备往往具有复杂的功能。我想说的是:如果只是系统和驱动是两码事。系统的出现本质上是为了更好更方便更有效率地利用硬件资源,而驱动程序的目的是让硬件设备的性能充分发挥。

本回答被提问者和网友采纳
参考技术B Linux内核就是指Linux本身,就像浏览器说的IE内核。

文摘: 技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
地址:http://baike.baidu.com/view/573460.htm追问

那么fedora, suse, yellowdog就是GNU/Linux了?

参考技术C Linux内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用。

我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序,它们大部分是对外围设备的管理和界面操作。外部管理程序与用户进程所占据的地址空间称为外部空间。
通常,一个程序会跨越两个空间。当执行到内河空间的一段代码时,我们称程序处于内核态,而当程序执行到外部空间代码时,我们称程序处于用户态。 可参考《Linux就该这么学》了解更多Linux相关知识。
参考技术D 操作系统是负责整个系统最基本功能和系统管理,包括内核、设备驱动程序、启动引导程序、命令行shell或其它种类的用户界面、基本的文件管理工具和系统工具。
用户界面是操作系统的外在表象,内核是操作系统的内在核心。
内核由一系列程序组成,包括负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理地址空间的内存管理程序、网络、进程间通信的系统服务程序等。
内核负责管理系统的硬件设备。
内核空间表示内核拥有的内存空间,用户空间表示用户程序执行时的内存空间。
内核拥有直接访问硬件设备的所有权限,用户程序不能直接访问硬件设备,因此用户程序通过系统调用和内核通信来运行。更多Linux知识可参考《Linux就该这么学》。

深入分析Linux内核链表

1. 普通单链表

技术分享

2. 内核链表

技术分享

上图是本人从其他博客盗来的,差点被糊弄过去。

下图是本人自己用KeyNote画的(唉!!画图真的是让人心好累啊!!)。

技术分享

差异是不是很明显啊?!

Read The Fucking Source Code

1. 初始化

/* include/linux/types.h */
struct list_head {
    struct list_head *next, *prev;
};

/* include/linux/list.h */
/*××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××*/
// 一. 如何初始化一个链表,初始化后的链表是什么鸟样?
// 链表初始化的3个方法:
// 1.
#define LIST_HEAD_INIT(name) { &(name), &(name) }
// 使用示例: struct list_head test_list = LIST_HEAD_INIT(test_list);

// 2.
#define LIST_HEAD(name) \
    struct list_head name = LIST_HEAD_INIT(name)
// 使用示例: LIST_HEAD(module_bug_list);

// 3.
static inline void INIT_LIST_HEAD(struct list_head *list)
{
    list->next = list;
    list->prev = list;
}
// 使用示例: struct list_head test_list;
        INIT_LIST_HEAD(&test_list);
/*××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××*/

就连一个链表的初始化都想的这么周到!!真屌!!

初始化后,链表就是的鸟样:

技术分享

2. 插入

/*
 * Insert a new entry between two known consecutive entries.
 *
 * This is only for internal list manipulation where we know
 * the prev/next entries already!
 */
#ifndef CONFIG_DEBUG_LIST
static inline void __list_add(struct list_head *new,
                  struct list_head *prev,
                  struct list_head *next)
{
    next->prev = new;
    new->next = next;
    new->prev = prev;
    prev->next = new;
}
#else
extern void __list_add(struct list_head *new,
                  struct list_head *prev,
                  struct list_head *next);
#endif

/**
 * list_add - add a new entry
 * @new: new entry to be added
 * @head: list head to add it after
 *
 * Insert a new entry after the specified head.
 * This is good for implementing stacks.
 */
static inline void list_add(struct list_head *new, struct list_head *head)
{
    __list_add(new, head, head->next);
}


/**
 * list_add_tail - add a new entry
 * @new: new entry to be added
 * @head: list head to add it before
 *
 * Insert a new entry before the specified head.
 * This is useful for implementing queues.
 */
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
    __list_add(new, head->prev, head);
}
/**
* list_add 和 list_add_tail的区别是:
* list_add 始终是在链表头后的的第一个位置进行插入:例如链表:head --> 数据1 --> 数据2 --> 数据3,插入新元素后:head --> new --> 数据1 --> 数据2 --> 数据3
* list_add_tail 始终实在链表末尾插入新元素:例如链表:head --> 数据1 --> 数据2 --> 数据3,插入新元素后:head --> 数据1 --> 数据2 --> 数据3 --> new
*/
/**
* 仔细分析上述函数,可以发现其函数抽象的巧妙。
* __list_add 接收三个参数:分别是new, prev, next。任何位置的双链表插入操作,只需这3个参数。那么new元素一定是在prev和next之间进行插入。
* 所以很明显:list_add是在head和head->next之间插入,那就是链表的第一个元素。
* list_add_tail实在head->prev和head之间插入,那就是链表的最后一个元素。

*/

 3. 删除

/*
 * Delete a list entry by making the prev/next entries
 * point to each other.
 *
 * This is only for internal list manipulation where we know
 * the prev/next entries already!
 */
static inline void __list_del(struct list_head * prev, struct list_head * next)
{
    next->prev = prev;
    prev->next = next;
}

/**
 * list_del - deletes entry from list.
 * @entry: the element to delete from the list.
 * Note: list_empty() on entry does not return true after this, the entry is
 * in an undefined state.
 */
#ifndef CONFIG_DEBUG_LIST
static inline void __list_del_entry(struct list_head *entry)
{
    __list_del(entry->prev, entry->next);
}

static inline void list_del(struct list_head *entry)
{
    __list_del(entry->prev, entry->next);
    entry->next = LIST_POISON1;
    entry->prev = LIST_POISON2;
}
#else
extern void __list_del_entry(struct list_head *entry);
extern void list_del(struct list_head *entry);
#endif

/**
* 上述代码中存在两个宏,在include/linux/poison.h中的定义如下:
*/
/*
 * These are non-NULL pointers that will result in page faults
 * under normal circumstances, used to verify that nobody uses
 * non-initialized list entries.
* 是非空指针,在正常情况下会导致 page faults,用来验证没有人使用未初始化的链表项。
 */
#define LIST_POISON1  ((void *) 0x00100100 + POISON_POINTER_DELTA)
#define LIST_POISON2  ((void *) 0x00200200 + POISON_POINTER_DELTA)

/*
* __list_del_entry 和 list_del 的却别是显而易见的。
*/

   

  至此,内核链表有了本质的认识,那么对于其他的链表操作的分析是非常容易的。

以上是关于linux 内核是啥, 本人有linux基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核开发与Linux驱动开发有啥关系?

Linux基础之Linux简介

Linux Kernel是啥

linux基础学习第二十一天之SElinux

基础第六篇:Linux操作系统线程库性能测试与分析

Linux操作系统基础