Skip to content

Instantly share code, notes, and snippets.

@caigen
caigen / fork
Created October 28, 2013 13:54
fork面试题通常画二叉树解,理解内核的实现则秒解。如下代码输出2+2+2=8个'-'是因为缓冲区被复制到子进程。使用fflush或'\n'则2+4=6个'-'。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
for (int i = 0; i < 2; i++) {
fork();
printf("-");
// fflush(stdout);
}
@caigen
caigen / interrupt_context
Created October 20, 2013 05:27
内核问题
1, 进程上下文和中断上下文在Linux内核中的区别
process context: 运行中的程序从用户空间进入内核空间,此时内核处于进程上下文并为进程做事。
interrupt context: 硬件中断后,内核执行中断处理程序(上半部)的执行(与后续的下半部),此时内核处于中断上下文。与特定进程无关。
两者细节:暂略。
2, 用户空间和内核空间通信为什么要使用copy_from_user和copy_to_user
copy_from_user: 为了确保进入内核空间的数据正确完整安全的。
copy_to_user: 为将内核空间数据拉到用户空间以便用户空间执行的程序访问。
3, 自旋锁、信号量、互斥锁在Linux内核中的区别
@caigen
caigen / virtual_function
Created October 20, 2013 05:11
C语言实现C++中的虚函数机制
// use c to simulate the mechanism of virtual function in c++.
// designed by [email protected]
#include <iostream>
using std::cout;
using std::endl;
// C: function pointer
void fun1() {
@caigen
caigen / dianping2014_algo1
Created October 19, 2013 10:36
大众点评2014在线笔试题。排序:要求所有的奇数排在偶数前面。
#include <cstdlib>
#include <iostream>
using std::swap;
using std::cout;
using std::endl;
template <typename T>
void print(T a[], int n) {
for (int i = 0; i <= n-2; i++) {
@caigen
caigen / baidu2014_algo1
Created October 13, 2013 14:30
百度2014软件研发笔试题算法题1(上海站)
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
const int NUM = 4;
int data[NUM];
void init(int data[], int n) {
@caigen
caigen / baidu2014_algo2
Last active December 25, 2015 10:38
百度2014软件研发笔试题算法题2(上海站)
// 数组的相邻数据间的差的绝对值为1,找出某个值t在数组中的出现位置
// 本方法找出t在数组中的第一次出现
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
const int NUM = 20;
int data[NUM];
@caigen
caigen / loadkernal
Last active December 24, 2015 23:19
linux内核影像怎么从外存载入内存
问题:
在启动引导试,linux映像是怎么从外存被载入内存的?
细细思考,这里面涉及一些小问题。就目前理解解答如下:
0,当没有驱动时,BIOS用于读外存/外设;
1,从BIOS到引导程序,引导程序在一个固定位置,所以BIOS能找到并加载其到内存中执行;
2,同样的,内核映像也必须在一个引导程序知道的位置处,引导程序将其从外存加载到内存;
3,不使用文件系统的bootsect.s,直接CALL BIOS来加载紧随其后的setup,及紧随setup之后的vmlinux;
4,试用文件系统的其他引导程序,通过其文件系统的vmlinux文件位置,将vmlinux从外存载入内存。
@caigen
caigen / pthread
Last active December 24, 2015 21:39
pthread的底层实现
// 在linux内核源码中,文件include/linux/sched.h说:
/**
* cloning flags:
*/
#define CSIGNAL 0x000000ff /** signal mask to be sent at exit */
#define CLONE_VM 0x00000100 /** set if VM shared between processes */
#define CLONE_FS 0x00000200 /** set if fs info shared between processes */
#define CLONE_FILES 0x00000400 /** set if open files shared between processes */