- 博客(12)
- 资源 (16)
- 收藏
- 关注
原创 Linux-0.11 加载操作系统
x86系列CPU可以在16位实模式和32位保护模式下运行,实模式的特点是地址总线只有20位,也就是只有1MB的寻址空间,为了兼容老的CPU,Intel x86系列CPU包括最新的CPU在上电时都运行在16位的实模式下,同时在硬件上强行将CS置成0xF000,IP置成0xFFF0,那么CS:IP就指向0xFFFF0这个地址,也就是上电瞬间代码从该处开始执行,而BIOS恰恰就存储在这个地方,可以想象一
2014-06-30 08:44:36 1992 1
原创 Linux内核当中的互斥锁
Linux可以使用互斥信号量来表示互斥锁,那就是通过宏DECLARE_MUTEX来定义一个互斥信号量,因为DECLARE_MUTEX这个宏,Marcin Slusarz在08年提交的了一个patch,邮件地址为:https://lkml.org/lkml/2008/10/26/74,Marcin Slusarz认为DECLARE_MUTEX宏会误导开发者,所以建议将DECLARE_MUTEX修改成
2014-06-26 12:00:26 12480
原创 并发与竞态
多个执行单元同时、并行的被执行称为并发,而并发对共享资源(临界区)的访问很容易引起竞态,避免竞态的方法主要有两种,信号量和自旋锁。1. 信号量信号量,使用信号量需要包含结构体,信号量结构定义如下:struct semaphore {spinlock_t lock;unsigned int count;struct list_headwait_list;}
2014-06-26 01:30:31 1162
原创 Linux内核中的时间处理
在Linux内核中,高度依赖于时间信息(不管这个时间是精确的或非精确的),比如硬件驱动中的延时、延后访问等等。在内核中通过定时器来精确的度量时间,那么这个定时的时间间隔取决于HZ这个值,它是与体系结构相关的一个常数,在x86平台下,这个值默认为1000,HZ这个时它表示的是定时器中断的频率,也就是说HZ为1000,即1秒钟要发生1000次中断,也就说是定时器定时的时间间隔为1毫秒,HZ值设的越大,
2014-06-20 17:38:34 1943
原创 链表c代码
#include #include struct node { int data; struct node *next;};int datas[] = {1, 2, 4, 8, 16, 32, 64, 128};void list_head_init(struct node *head){ head->data = 0; head->next = NULL;}int
2014-06-18 23:40:43 2861
原创 关于函数按值传递
先看一个例子:#include #include #include void get_memory(char *p){ p = (char *)malloc(16);}int main(void){ char *p = NULL; get_memory(p); printf("%p\n", p); return 0;}p仍然为NULL,why?因为c中函数
2014-06-18 17:54:23 1009
原创 关于链表中头指针和头结点的理解
线性表使用顺序(数组)存储时有个弊端,那就是在插入和删除时需要大量的移动数据,这显示是非常消耗时间的,所以可以采用链式存储,即有一个指针域(单链表),来记录下个结点的存储位置(地址),这样在插入和删除结点时只需要修改指针域即可,从而大量减少移动数据所消耗的时间。来看链表的定义:
2014-06-18 15:33:24 55827 12
原创 uinput模拟鼠标
#include #include #include #include #include #include #include #include #include void mouse_move(int fd, int dx, int dy){ struct input_event ev; memset(&ev, 0, sizeof(struct input_event
2014-06-04 00:28:39 2507 3
原创 atoi函数
#include #include #if 0/* atoi: convert s to integer */int atoi(char s[]){ int i, n; n = 0; for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i) n = 10 * n + (s[
2014-06-03 22:43:42 948
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人