1、简述Linux内核的启动流程
Linux内核的启动流程,包含引导过程、内核初始化这2个步骤。
- 1)引导过程:系统上电,CPU自身初始化;然后是BIOS加电自检,加载内核引导程序,内核引导程序加载已经压缩的内核,再对压缩内核进行解压;
- 2)内核初始化:调用start_kernel()完成大部分的初始化工作,调用reset_init()启动内核线程,调用kernel_init()完成设备驱动程序的初始化,调用init_post()来启动用户空间的init进程。
2、libudev的使用场景
libudev是一种函数库,专门用来在Linux上做设备管理的。主要管理/dev目录下的设备节点,同时,也接替devfs、hotplug热插拔的功能,处理添加硬件、删除硬件、加载firmware,以及相关用户空间的行为。
libudev是udev是一种开源实现库,它能根据系统中硬件设备的状态来动态的更新设备文件,包括设备文件的创建、删除等。设备文件通常放在/dev目录下。使用udev后,在/dev目录下就直包含系统中真正存在的设备。udev同时提供了监视接口,当设备的状态发生改变时,监视接口可以发送对应的事件给应用程序。比如,设备插上,会发送add事件;设备拔除,会发送remove事件。
3、对一个整数,进行因式分解
使用C语言,对一个整数,进行因式分解,比如,24=2*2*2*3。
int Factor(int num)
{
for (int i = 2; i < num; i++)
{
while( num != i) {
if(num % i == 0) {
printf("%d * ",i);
num = num/i;
}
else {
break;
}
}
}
printf("%d\n",num);
return num;
}
4、不用中间变量交换整数a和b
a = a+b;
b = a-b;
a = a-b;
5、用条件表达式,判断整数num是否为2的整数幂
((num & (num-1))==0)?true:false;
6、数字0x6F的第3位设置为1
int num = 0x6F | (0x1<<2);
//扩展,由于索引从0开始,
//将第n位置1,则bit=n-1,范围是[0,n-1]
void SetBit(int& num, int bit)
{
num |= (0x1<<bit);
}
7、数字0x6F的第3位设置为0
int num = 0x6F & (~(0x1<<2));
//扩展
//将第n位置0,bit=n-1, [b7,b6,b5,b4,b3,b2,b1,b0]
void ClsBit(int& num, int bit)
{
num &= ~(0x1<<bit);
}
8、运算符new、delete的重载
在C++中new、delete分别是创建对象、释放对象的运算符。
- new主要做三件事:初始化对象、分配空间、返回指针;
- delete主要是删除对象或者指针,释放内存;
#include <iostream>
using namespace std;
class Object{
public:
//重载new运算符
void* operator new(std::size_t size)
{
return std::malloc(size);
}
//重载delete运算符
void operator delete(void* ptr)
{
std::free(ptr);
}
};
int main(){
Object* obj = new Object;
cout<<sizeof(obj)<<endl;
delete obj;
return 0;
}