linux内核编程_linux内核是什么

linux内核编程_linux内核是什么什么是操作系统?指在系统中负责完成最基本功能和系统管理的部分,操作系统有哪些组成部分?内核——操作系统的内在核心 设备驱动程序 启动引导程序 命令行shell 其他种类的用户界面—-操作系统的外在表象 基本的文件管理工具和系统工具Linux内核的组成Linux内核源代码目录结构是什么,各目录有什么含义?arch:包含和硬件体系结构相关的代码,每种平台占一…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

什么是操作系统?

指在系统中负责完成最基本功能和系统管理的部分,

操作系统有哪些组成部分?

  • 内核——操作系统的内在核心
  • 设备驱动程序
  • 启动引导程序
  • 命令行shell
  • 其他种类的用户界面—-操作系统的外在表象
  • 基本的文件管理工具和系统工具

Linux内核的组成

Linux内核源代码目录结构是什么,各目录有什么含义?

  • arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、ARM、PowerPC、MIPS等
  • block:块设备驱动程序I/O 调度。
  • crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
  • Documentation:内核各部分的通用解释和注释。
  • drivers:设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c等。
  • fs:支持的各种文件系统,如EXT、FAT、NTFS、JFFS2 等。
  • include:头文件,与系统相关的头文件被放置在include/linux 子目录下。
  • init:内核初始化代码
  • ipc:进程间通信的代码。
  • kernel:内核的最核心部分,包括进程调度、定时器等,而和平台相关的一部分代码放在arch/*/kernel目录下。
  • lib:库文件代码。
  • mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
  • net:网络相关代码,实现了各种常见的网络协议。
  • scripts:包含用于配置内核的脚本文件。
  • security:主要包含SELinux 模块。
  • sound:ALSA、OSS音频设备的驱动核心代码和常用设备驱动。
  • usr:实现了用于打包和压缩的cpio等

Linux内核的有哪些组成部分?

进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)

Linux内核的的组成部分之间有什么关系?

  • 进程调度与内存管理之间互相依赖。在多道程序环境下,必须为程序创建进程,而创建进程的第一件事情就是将程序和数据装入内存。
  • 进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。
  • 虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK 设备。
  • 内存管理利用虚拟文件系统支持交换,依赖于进程调度完成交换进程(swapd)定期由调度程序调度。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

linux内核编程_linux内核是什么

 

进程调度有什么作用?

调度控制系统中的多个进程对CPU 的访问,使得多个进程能在CPU 中微观串行,宏观并行地执行。

进程调度为什么很重要?

进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程

进程如何在几个状态间切换?

linux内核编程_linux内核是什么

在设备驱动编程中,当请求的资源不能得到满足时会怎样?

驱动一般会调度其他进程执行,其对应的进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。

设备驱动中,如果需要几个并发执行的任务要怎么做?

调用函数int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);启动内核线程。

内存管理的主要作用是什么?

控制多个进程安全地共享主内存区域。当CPU提供内存管理单元(MMU)时,Linux 内存管理完成为每个进程进行虚拟内存到物理内存的转换。

进程的地址空间时怎样划分的?

Linux 的每个进程享有4GB的内存空间,0~3GB属于用户空间,3~4GB属于内核空间

linux内核编程_linux内核是什么

虚拟文件系统有什么作用?

Linux 虚拟文件系统(VFS)隐藏各种了硬件的具体细节,为所有设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象

linux内核编程_linux内核是什么

虚拟文件系统如何描述文件相关信息?

使用超级块super block存放文件系统相关信息,使用索引节点inode存放文件的物理信息,使用目录项dentry存放文件的逻辑信息。

网络接口有什么作用?

提供了对各种网络标准的存取和各种网络硬件的支持。

网络接口包括那两个部分?

网络协议和网络设备驱动程序

网络协议有什么作用?

负责实现每一种可能的网络传输协议

网络设备驱动程序有什么作用?

负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。

进程通信有什么作用?

协助多个进程、多资源的互斥访问、进程间的同步和消息传递

有哪些进程通信机制?

信号量、共享内存、管道、消息队列、Socket通信、Binder通信

ARM处理器有几种工作模式?

  • 用户模式(usr):大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。
  • 快速中断模式(fiq):用于高速数据传输或通道处理。
  • 外部中断模式(irq):用于通用的中断处理。
  • 管理模式(svc):操作系统使用的保护模式。
  • 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
  • 系统模式(sys):运行具有特权的操作系统任务。
  • 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

为什么要划分内核空间和用户空间?

内核可进行任何操作,而应用程序则被禁止对硬件的直接访问和对内存的未授权访问。划分内核空间和用户空间用来区分程序执行的这两种不同状态,它们使用不同的地址空间。

如何实现从用户空间到内核空间的控制转移?

只能通过系统调用和硬件中断完成

Linux内核的编译及加载

内核的配置系统由哪既部分组成?

  • Makefile:分布在Linux 内核源代码中的Makefile,定义Linux 内核的编译规则。
  • 配置文件(Kconfig):给用户提供配置选择的功能。
  • 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供字符界面和图形界面)。这些配置工具都是使用脚本语言编写的,如Tcl/TK、Perl等。

使用make config、make menuconfig等命令后生成一个.config配置文件,有什么作用?

记录哪些部分被编译入内核、哪些部分被编译为内核模块。

在Linux 内核中增加程序需要完成哪些工作?

  • 将编写的源代码复制到Linux 内核源代码的相应目录。
  • 在目录的Kconfig文件中增加新源代码对应项目的编译配置选项。
  • 在目录的 Makefile文件中增加对新源代码的编译条目。

为S3C2410 的LED 编写了驱动,源代码为s3c2410-led.c,为使内核能支持对该模块的编译配置,需要完成哪些工作?

  • 将编写的s3c2410-led.c源代码复制到linux-2.6.15.5\drivers\char 目录。
  • 在目录的Kconfig文件中增加LED 的编译配置选项,如下所示:
config S3C2410_LED
bool "S3C2410 LED Driver"
depends on ARCH_S3C2410
help
LED driver for the Samsung S3C2410.
  •  在目录的 Makefile文件中增加对s3c2410-led.c源代码的编译,obj-$(CONFIG_S3C2410_LED) += s3c2410-led.o

kbuild Makefile的语法中目标定义有什么作用?

目标定义,用来定义哪些内容要作为模块编译,哪些要编译并连接进内核

kbuild Makefile的语法中如何进行目标定义?

  1. 例如:obj-y += foo.o
  2. 根据.config 文件的CONFIG_变量来决定文件的编译方式,如下所示:
 obj-$(CONFIG_ISDN) += isdn.o
 obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o

什么是多文件模块的定义?

如果一个模块由多个文件组成,这时候应采用模块名加-objs后缀或者-y后缀的形式来定义模块的组成文件。

如何进行多文件模块的定义?

///1---如-y形式
obj-$(CONFIG_EXT2_FS) += ext2.o
ext2-y := balloc.o bitmap.o
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o

///2---如-objs的形式:
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

什么是目录层次的迭代?

形如obj-$(CONFIG_EXT2_FS) += ext2/的定义,如果CONFIG_EXT2_FS值为y或m时,kbuild将会把ext2 目录列入向下迭代的目标中,具体ext2 目录下的文件是要作为模块编译还是链入内核由ext2 目录下的Makefile文件的内容决定。

内核配置脚本文件Kconfig的语法中“config”关键字有什么作用?

“config”关键字定义新的配置选项,之后的几行定义了该配置选项的属性。

配置选项的属性有哪些?

类型、数据范围、输入提示、依赖关系(及反向依赖关系)、帮助信息和默认值等

配置选项的类型有哪些?

配置选项都必须指定类型,类型包括bool、tristate、string、hex 和int。

如何指定配置选项的类型?

///方法1---:
bool "Networking support"
///方法2----:
bool
prompt "Networking support"

如何定义数据范围?

range <symbol> <symbol> [if <expr>]

数据范围symbol的值如何指定?

symbol 分为两类,一类是由菜单入口定义配置选项定义的非常数symbol,另一类是作为expr 组成部分的常数symbol。为int 和hex 类型的选项设可以接受的输入值范围,用户只能输入大于等于第一个symbol,小于等于第二个symbol 的值。

如何定义输入提示?
prompt <prompt> [if <expr>]

如何定义依赖关系?

///方法1---
bool "foo" if BAR
default y if BAR
///方法2---
depends on BAR
bool "foo"
default y

depends 能限定一个symbol 的上限,即如果A依赖于B,B的配置如何影响A?

在B被配置为“Y”的情况下,A可以为“Y”、“M”和“N”;在B被配置为“M”的情况下,A可以被配置为“M”或“N”;B在被配置为“N”的情况下,A只能为“N”。

如何定义反向依赖关系?

    select <symbol> [if <expr>]

select能限定一个symbol的下限,若A反向依赖于B,B的配置如何影响A?

A的配置值会高于或等于B(正好与depends 相反)。如果symbol 反向依赖于多个对象,则它的下限是这些对象的最大值。

如何定义多个依赖关系?

多个依赖关系之间用“&&”间隔,

如何定义expr(表达式)?

 <expr> ::= <symbol>
            <symbol> '=' <symbol>
            <symbol> '!=' <symbol>
            '(' <expr> ')''!' <expr>
             <expr> '&&' <expr>
             <expr> '||' <expr>

如何定义帮助信息?

help(或---help---)
开始
…
结束

如何定义配置选项的默认值?

default <expr> [if <expr>]

配置选项的默认值有什么作用?

如果用户不设置对应的选项,配置选项的值就是默认值。

任意多个默认值情况下,如何确定哪个配置选项的默认值是有效的?

存在任意多个默认值情况下,只有第一个被定义的值是可用的。

在菜单树结构中如何确定菜单入口的位置?

  1. 所有处于“menu”和“endmenu”之间的菜单入口都会成为“Network device support”的子菜单。而且,所有子菜单选项都会继承父菜单的依赖关系,比如,“Network device support”对“NET”的依赖被加到了配置选项NETDEVICES的依赖列表中。
  2. 如果菜单选项在一定程度上依赖于前面的选项,它就能成为该选项的子菜单。如果父选项为“N”,则子选项不可见;如果父选项为“Y”或“M”,则子选项可见。MODVERSIONS直接依赖MODULES,如果MODULES不为“N”,该选项才可见。
///方法1---
menu "Network device support"
      depends on NET
      config NETDEVICES
…
endmenu

///方法2---
config MODULES
bool "Enable loadable module support"
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
comment "module support disabled"
depends on !MODULES

在X86 PC上从上电/复位到运行Linux 用户空间,进入与Linux 相关代码之前,会经历哪些阶段?

  1. 当系统上电或复位时,CPU会将PC指针赋值为一个特定的地址0xFFFF0,并执行该地址处的指令。在PC 中,该地址位于BIOS 中,它保存在主板上的ROM 或Flash中。
  2.  BIOS运行时按照CMOS的设置定义的启动设备顺序来搜索处于活动状态,并且可以引导的设备。若从硬盘启动,BIOS会将硬盘MBR(主引导记录)中的内容加载到RAM。MBR 是一个512 字节大小的扇区,位于磁盘上的第一个扇区中(0 道0柱面1 扇区)。当MBR被加载到RAM 中之后,BIOS就会将控制权交给MBR。
  3. 主引导加载程序查找并加载次引导加载程序。它在分区表中查找活动分区,当找到一个活动分区时,扫描分区表中的其他分区,以确保它们都不是活动的。当这个过程验证完成之后,就将活动分区的引导记录从这个设备中读入RAM中并执行它。
  4. 次引导加载程序加载Linux内核和可选的初始RAM 磁盘,将控制权交给Linux内核源代码。
  5. 运行被加载的内核,并启动用户空间应用程序。

Linux下的C 编程

Linux中宏定义、变量名、函数名命名习惯是什么?

#define PI 3.1415926
int min_value, max_value;//单词之间以_相连
void send_data(void);

如何定义零长数组?

struct var_data
{
int len;
char data[0];
};

零长数组有什么作用?

char data[0]仅仅意味着程序中通过var_data 结构体实例的data[index]成员可以访问len 之后的第index 个地址,它并没有为data[]数组分配内存,因此sizeof(structvar_data)=sizeof(int)。

如何利用零长数组访问数据?

struct var_data s;
...
for (i = 0; i < s.len; i++)
{
printf("%02x", s.data[i]);
}

如何使用case语法结构?

//case x…y这样的语法,区间[x,y]的数都会满足这个case的条件,
switch (ch)
{
case '0'... '9': c -= '0';
break;
case 'a'... 'f': c -= 'a' - 10;
break;
case 'A'... 'F': c -= 'A' - 10;
break;
}
//代码中的case '0'... '9'等价于标准C中的如下代码:
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':

什么是语句表达式?

包含在括号中的复合语句看做是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方

如何定义和使用语句表达式?

#define min_t(type,x,y) ({ type _ _x = (x); type _ _y = (y); _ _x < _ _y ? _ _x: _ _y; })
int ia, ib, mini;
float fa, fb, minf;
mini = min_t(int, ia, ib);
minf = min_t(float, fa, fb);

typeof 关键字有什么作用?

typeof(x)语句可以获得x 的类型

如何使用typeof 关键字?

通过代码行(void) (&_x == &_y)的作用是检查_x 和_y的类型是否一致

#define min(x,y) ({ const typeof(x) _x = (x); const typeof(y) _y = (y); (void) (&_x == &_y); _x < _y ? _x : _y; })

如何定义可变参数的宏?

arg 表示其余的参数可以是零个或多个,这些参数以及参数之间的逗号构成 arg 的值,在宏扩展时替换arg,使用“##”的原因是处理arg 不代表任何参数的情况,这时候,前面的逗号就变得多余了。使用“##”之后,GNU C预处理器会丢弃前面的逗号。

#define pr_debug(fmt,arg...) printk(fmt,##arg)
//例如下列代码:
pr_debug("%s:%d",filename,line)
//会被扩展为:
printk("%s:%d", filename, line)

如何使用当前函数名?

_ _FUNCTION_ _保存函数在源码中的名字,_ _PRETTY_FUNCTION_ _保存带语言特色的名字

void example()
{
printf("This is function:%s", _ _FUNCTION_ _);
}
//代码中的_ _FUNCTION_ _意味着字符串“example”

什么是特殊属性声明?

GNU C允许声明函数、变量和类型的特殊属性,以便进行手工的代码优化和定制代码检查的方法。

如何进行特殊属性声明?

指定一个声明的属性,只需要在声明后添加__attribute__(( ATTRIBUTE ))。其中ATTRIBUTE 为属性说明,如果存在多个属性,则以逗号分隔。

//noreturn
# define ATTRIB_NORET _ _attribute_ _((noreturn)) ....
asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET;
//format
asmlinkage int printk(const char * fmt, ...) _ _attribute_ _ ((format(printf, 1, 2)));
//aligned,表示该结构类型的变量以4 字节对界。
struct example_struct{
char a;
int b;
long c;
} _ _attribute_ _((aligned(4)));
//packed
struct example_struct{
char a;
int b;
long c _ _attribute_ _((packed));
};

有哪些特殊属性?

  • noreturn 属性作用于函数,表示该函数从不返回。这会让编译器优化代码,并消除不必要的警告信息
  • format属性也用于函数,表示该函数使用printf、scanf 或strftime 风格的参数,指定format属性可以让编译器根据格式串检查参数类型
  • unused属性作用于函数和变量,表示该函数或变量可能不会被用到,这个属性可以避免编译器产生警告信息。
  • aligned属性用于变量、结构体或联合体,指定变量、结构体或联合体的对界方式,以字节为单位,
  • packed属性作用于变量和类型,用于变量或结构体成员时表示使用最小可能的对界,用于枚举、结构体或联合体类型时表示该类型使用最小的内存

do{}while(0)有什么作用?

保证宏定义的使用者能无编译错误地使用宏,它不对其使用者做任何假设。

用于错误处理的goto使用时需要注意什么?

需保证在错误处理时注销、资源释放的顺序与正常的注册、释放申请的顺序相反。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184494.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Python对字典根据键值分组进行排序

    Python对字典根据键值分组进行排序

    2021年11月22日
  • 增强的for语句可以方便地遍历数组_java遍历字符串

    增强的for语句可以方便地遍历数组_java遍历字符串增强for循环快捷键:iter+回车键。for增强for循环和普通for循环的区别普通for循环可以没有遍历的目标,增强for循环。缺点不能在这个增强循环里动态删除集合里面的内容,获取下标等。使用场景增强for循环主要就是为了方便遍历。…

  • C语言中函数指针和回调函数的详解「建议收藏」

    C语言中函数指针和回调函数的详解「建议收藏」函数指针:指向函数的指针变量。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数…

  • java动态代理中的invoke方法是如何被自动调用的「建议收藏」

    java动态代理中的invoke方法是如何被自动调用的「建议收藏」Java中动态代理的实现,关键就是这两个东西:Proxy、InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的。        首先,invoke方法的完整形式如下: Java代码  public Object invoke(Object proxy, Method m

  • Linux运维必备技能:如何在 Vim 中删除多行?

    Linux运维必备技能:如何在 Vim 中删除多行?我们都会犯错,犯错是人之常情,改进它也很重要。如果你在Vim中出错,你可以dw在普通模式下使用删除一个单词。您键入dd它会删除当前行。如果要在Vim中删除多行,可以使用相同的ddVim命令,将行数添加到该命令中。因此,10dd将从光标底部删除10行(包括光标所在的行)。让我们详细了解如何在以效率着称的编辑器中删除一行或多行。删除单行以下是在Vim中删除单行文本的步骤:按Escape(Esc)键进入Normal模式确保光标位于要删除的行上。快速按下dd这

  • 接口自动化面试题目(python自动化面试题)

    json和python中字典的区别?Json是轻量级的数据交互格式,以key-value的键值对形式来保存数据,结构清晰,可以说是目前互联网项目开发中最常用的一种数据交互格式。字典,同样是以key-value的键值对来保存数据,是python中的一种数据类型。你做接口自动化测试时,测试数据放哪里?1)对于一些基础配置比如数据库配置可以放到properties文件(yaml文件)2)接口测试需要…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号