1、操作系统

1.1、Linux 内核(系统)的组成的部分:

内核主要有:进程调度、内存管理、虚拟文件系统、网络接口和进程通信五个部分组成。

(1)进程调度

进程调度是CPU对多个进程对CPU访问的调度算法,使得进程宏观上并行执行。常用的调度算法有:先来先服务原则、高优先级别优先、短进程优先(谁执行的时间短,就上)、时间片轮训(每个进程都给点时间运行)。

系统所有的进程,都必须使用进程调度算法,所以是处于中心的位置。

(2)内存管理

内存管理的主要作用是管理进程之间内存。

一般对于 32位的 Linux 系统而言,Linux进程都拥有自己独立的4GB的内存空间,0~3GB的用户空间,3~4GB的内核空间。

(3)虚拟文件系统

Linux的虚拟文件系统(VFS)是实际文件系统的一种抽象,为所有的设备统一的接口。显示的文件系统:比如有 FAT16、FAT32、NTFS、YAFFS、JFFS2,ext,ext2,这么多的不同格式的系统,不同的格式有属于自己的一套文件操作数据据结构(file_operation)、那么写应用层代码的时候,难道要对这么多的文件系统做不同的处理操作么么,这个时候,虚拟文件系统就产生了,虚拟文件系统统一管理这些现实的的文件系统,然后提供统一的接口,这样应用层就可以使用统一的open read write 去访问了。

(4)网络接口

网络接口实现了对各种的网络标准的存取和各种网络硬件的支持。所以网络接口可以分为网络协议和网络驱动程序。

网络协议实现的是每一种网络传输协议,比如说TCP/IP协议具体是怎么实现的,

网络驱动:其实就是网络硬件设备的驱动,实现硬件的这部分驱动。

(5)进程通信

Linux进程间通信(IPC),包含:管道(无名管道和有名管道)、信号、消息队列、共享内存、套接字、信号量。

1.2、C库函数与API

对于向外提供的 API 而言,有操作系统的提供的 API 和C库提供的 API。比如对

文件的操作而言: open、write、read、close。而C库提供的接口: fopen、fwrite、fread、fclose。本质上,fopen 就是使用 open 函数进行而二次封装。

对于不同的系统而言,系统提供的 API 几乎都是不同的;而对于 C库 而言,不同的平台只要使用的是 C库,C库 的API 都是一样的,所以对于移植性的话,C库的移植性就高。


2、函数的理解

通常来说,不论大大小小的子函数都是会存在一个返回值,函数的返回值一般都是不会直接使用void 类型。之所以函数即使不会被调用也都是会执行一个返回值:

(1)首先,在C语言中,一般是,返回值为零,一般是正常退出,而返回值为负一的情况的话,就是出现异常,而返回值是正直的话,那么一般就是自己定义的。

return ;
return -;
return ;

(2)return 语句的话,那么就表示函数的代码到这里就已经是全部结束了。

(3)函数的返回值与输入的参数可以理解为原材料以及经过加工(函数体)之后的产品。

3、NULL的理解

(1)NULL 的定义

#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */

当定义了 __cplusplus 宏的时候,则 NULL 为零,也就是当编译器为 C++ 的时候,则 NULL为零;而是 C 编译器的时候,则 NULL 为 (void *)0。这里的零可以理解为:数字零以及地址零,具体的环境具体分析。

(2)NULL 的作用

让野指针指向安全零地址

一般指针定义的时候:

int *p = NULL;

其将 p 指向地址零,因为一般来说零地址都是不可以被随便访问的。

(3)NULL 与 '\0'、'0'、0

'\0' :是一个转义的字符,对应的 ASCII 是
'' : 是一个字符,对应的 ASCII 是
: 是一个数字,本质就是零,对用的 ASCII 也是零。
NULL :是一个表达式,NULL 的本质就是 。

注意:

'\0' : 是字符串的结束的标志。

'0' : 对应零这个字符的 ASCII,一般用于获取零的 ASCII 值。

0 : 数字,

NULL : 一般用于指针。

4、宏的调试

宏的调试的方法是非常的方便,

应用调试:

#ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif

打印当前的文件、函数、行号。

__VA_ARGS__ :是将 DBG 括号里面的转为实际的字符串。当取消了 DEBUG 的定义,则后面的调试信息doing不会被编译进去已经打印出信息。

#if 0
#define DBG(x...) printk(x)
#else
#define DBG(x...) do{}while(0)
#endif

 

内核的调试:

#define DEBUG(fmt, args...)     printk(fmt, ##args)
#else
#define DEBUG(fmt, args...) do {} while (0)
#endif

... : 三点表示的变参,也就是参数的个数是不定的。对于变参的理解在另外的帖子做详细的介绍。

linux 内核(系统)、函数的理解、宏的程序调试的更多相关文章

  1. 【转帖】Linux 内核系统架构

    Linux 内核系统架构   描述Linux内核的文章已经有上亿字了 但是对于初学者,还是应该多学习多看,毕竟上亿字不能一下子就明白的. 即使看了所有的Linux 内核文章,估计也还不是很明白,这时候 ...

  2. [转帖]Linux内核系统体系概述

    Linux内核系统体系概述 https://www.cnblogs.com/alantu2018/p/8447369.html Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来 ...

  3. Linux常用系统函数

    Linux常用系统函数 一.进程控制 fork 创建一个新进程clone 按指定条件创建子进程execve 运行可执行文件exit 中止进程_exit 立即中止当前进程getdtablesize 进程 ...

  4. 对于Linux内核执行过程的理解(基于fork、execve、schedule等函数)

    382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一.实验环境 win10 -> VMware -> Ubuntu1 ...

  5. linux内核常用函数或宏

    1. simple_strtoul 用于将字符串转换为无符号长整数,第3个参数10意味着转换方式是10进制. ival = simple_strtoul(buffer, NULL, 10); 2. 大 ...

  6. linux内核--自旋锁的理解

    http://blog.chinaunix.net/uid-20543672-id-3252604.html 自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对 ...

  7. Linux内核d_path函数应用的经验总结

    问题背景 一个内核模块中,需要通过d_path接口获取文件的路径,然后与目标文件白名单做匹配. 在生产环境中,获取的文件是存在的,但是与文件白名单中的文件总是匹配失败. 问题定位: 通过打印d_pat ...

  8. Linux内核系统体系概述

    Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来负责控制进程对 CPU 资源的使用.所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作. 内存 ...

  9. 标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)

    我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open().close().write().read()等,而标准C语言的库函数中也有一套对文件的操作函数fop ...

随机推荐

  1. vuemock数据

    http://www.jianshu.com/p/ccd53488a61b dev.server.js 61 行 app.use('/mock',express.static('./mock'))

  2. .bat 批处理

    最简单的一个批处理文件 @echo off echo 这是测试内容1 echo 这是测试内容2 pause 输出: 这是测试内容1 这是测试内容2 请按任意键继续. . .

  3. DB迁移:从SQL Server 2005到MySQL

    一.工具选择 依工作需要进行老产品升级,其中一项重要工作就是将SQL Server数据库改为MySQL数据库,故而在对<各种主流 SQLServer 迁移到 MySQL 工具对比>文章学习 ...

  4. Docker(八):私有仓库

    有时候使用Docker Hub这样的公共仓库可能不太方便,用户可以创建一个本地仓库供私人使用. 在安装了Docker之后,可以获取官方的registry镜像来运行,docker-registry是官方 ...

  5. jQuery动态创建form表单并提交到后台(携带一定的数据进行页面跳转)

    今天遇到这么一个需求,携带一个编号一个名字跳转到另一个JSP页面,直接页面跳转(get携带数据)的话不太安全,于是想到到后台转发一下. 第一种:直接以表单提交方式的进行 JS代码: var form ...

  6. 【asp.net】Win7旗舰版IIS配置

    1.IIS配置流程 win7 iis 的配置不需要插入安装盘,可直接在控制面板中开启该功能,步骤如下: (1)"控制面板"-->"程序和功能"--> ...

  7. 在android app中使用STL库(转)

    1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用 ...

  8. Math.ceil()、floor()、round()

    ceil():向上取整,>=某个小数的最小整数,即15.3取16.返回double类型 如果参数小于0且大于-1.0,结果为 -0. floor():向下取整,<=某个小数的最大整数,即1 ...

  9. C#正则表达式replace用法

    Regex构造函数Regex(string pattern)Regex(string pattern,RegexOptions options)参数说明pattern:要匹配的正则表达式模式optio ...

  10. hdu 2680(最短路)

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...