- 博客(52)
- 收藏
- 关注
原创 我的学习之旅 keybaord.h和keyboard.c
/*键盘中断处理程序*/void keyboard_interrupt(void){ /*1、从端口 0x60读取扫描码 2、写控制寄存器端口0x61,复位键盘触发器 3、复位8259,以便接收下一个键盘中断信号 */ unsigned char scan_code; scan_code = inb_p(0x60)
2015-04-23 16:40:14
633
原创 我的学习之旅keyboard.h和keyboard.c
/*按下alt之后的key与ascii的映射表 */static unsigned char g_key2ascii_alt_map_table[] = { 0, 0, 0, '@', 0, '$', 0, 0, '{', '[', ']', '}', '\\', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '~', 10, 0,
2015-04-23 16:35:24
1790
原创 我的学习之旅 keyboard.h和keyboard.c
简化处理,只支持基本常用的按键操作。keyboard.h源代码:#ifndef __KEY_BOARD_H__#define __KEY_BOARD_H__/*shift键的按下和释放*/#define press_left_shift 0x2a#define press_right_shift 0x36#
2015-04-23 16:32:31
1246
原创 我的学习之旅(20)console.h和console.c
void console_write(void *tty, char *buf ){ unsigned int number = 0; unsigned char ch; unsigned char *up; if( !tty || !buf ) return; /* 统计当前write_q队列中的字符
2015-04-23 15:26:53
566
原创 我的学习之旅(19)console.h和console.c
/*屏幕向上翻一行,等同于屏幕向下移动一行*/static void screen_up(void){ int i; unsigned char *src; unsigned char *dest; unsigned int len; /*是否需要整个屏幕向上翻一行*/ if ( g_screen_top == 0 && g_sc
2015-04-23 15:22:35
397
原创 我的学习之旅(18)console.h和console.c
//设置屏幕的起始位置static void set_screen_origin(unsigned char flag){ if( flag ) cli(); outb_p(12, REG_PORT); outb_p(0xff&((g_screen_origin - DISP_BASE_ADDR) >> 9), VALUE_PORT);
2015-04-23 15:18:58
658
原创 我的学习之旅(17)console.h和console.c
console打印的思想基本参考linux0.1console.h的源代码:#ifndef __CONSOLE_H__#define __CONSOLE_H__#define COLOR_VGA_MODE/*不检查显卡模式,强制写死*/#ifdef COLOR_VGA_MODE#define DISP_BASE_ADDR 0xB8000 /* 0x
2015-04-23 15:07:08
869
原创 我的学习之旅(43)asm.s
/*软中断响应函数和硬中断类时,区别是不做jiffies计数器的刷新,调用的do_syscall_timer()函数做软切换*/system_call_interrupt: push %ds push %es push %fs push %gs pushl %ebp pushl %edi pushl %esi pushl %edx pu
2015-02-02 09:07:21
317
原创 我的学习之旅(41)sched.c
//每个任务堆栈的初始化,其中cs必须是0x08, ss则是0x10 eflags是0x206unsigned int *task_stk_init(void (*task)(), unsigned int *task_stk ){ unsigned int *stk; int i; int j; stk = task_stk; *stk-
2015-02-02 09:06:35
305
原创 我的学习之旅(40) sched.c
if(c) { break; } for(i=0;i p = &g_task_tbl[i]; if( p->task_id == i && p->task_func_p ) { if( p->sleep_time == 0 )
2015-02-02 09:05:41
307
原创 我的学习之旅(45)pcnet32.c
pcnet32.c得放在driver目录中按linux驱动的做法先是扫描pci设备,这个当前不搞,直接使用通过lspci命令得到的bus 、slot和func号。根据网上pcie配置空间的读取方法实现几个读取配置空间int,short和byte的函数。具体还可以参考linux 代码中的early.cunsigned int read_pci_config(unsigned char bus
2015-01-31 12:00:31
453
原创 我的学习之旅(44)小节和下一步准备
至此整个任务调度起来了,从打印也可以观察到每个任务都已经开始跑了。1、任务堆栈初始化时的eflag需要注意配置成enable interrupt,否则任务切换就做不了了。根据start32.s中 gdt的设定,cs的值必定是0x8,其他的段寄存器必定是0x10,esp的值则指向每个任务的栈顶。2、bochs网卡设定搞不定,根据网上的说明下的命令居然无用,打印不出网卡信息,没办法接下来的网卡
2015-01-31 11:29:25
430
原创 我的学习之旅(42)asm.s
asm.s只要实现软、硬中断发生后的响应。代码主要模仿linux的asm.s实现。asm.s:-------------.globl default_handle, timer_interrupt, restore_esp, system_call_interrupt /*全局变量*/default_handle: /*中断发生后的默认处理*/ call do_default_
2015-01-31 11:13:44
547
原创 我的学习之旅(39) sched.c
for(i=0;i p = &g_task_tbl[i]; if( p->task_id == i && p->task_func_p ) { if( p->sleep_time == 0 ) p->counter = 10; els
2015-01-31 10:26:20
305
原创 我的学习之旅(38) sched.c
sched_init()应该在kernel_start()中先初始化好。接下来的就是任务调度当前的调度不考虑优先级,只是平均的对每个任务做好时间片的切分,支持任务的sleep主要流程:逐个扫描任务表中的每个任务,如果该任务没有启动,则跳过,如果该任务有安排sleep,则刷新sleep时间;扫描完成后试着找出所有任务中counter计数器最大的那个任务,如果有这个任务,返回该任务的id,如果
2015-01-31 09:49:42
310
原创 我的学习之旅(37) sched.c
//为每个要启动的任务设置初始堆栈地址。void start_another_task(unsigned char task_id, void *pdata ){ if( task_id >= MAX_TASK_NUMBER ) return; if( !g_task_tbl[task_id].task_func_p || !g
2015-01-31 09:32:34
492
原创 我的学习之旅(36) sched.c
/*硬中断时候触发调用*/void do_timer(void){ unsigned int task_id; int ret; static long tmp = 0; /*扫描timer列表并处理timer对应的fn()*/ if (next_timer) { next_timer->jiffies--;
2015-01-31 09:25:38
682
原创 我的学习之旅(35)sched.c
void add_timer(long jiffies, void (*fn)(void)){ struct timer_list * p; if (!fn) return; cli(); if (jiffies <= 0) (fn)(); else { for (p = timer_list ; p < timer_list + TIME_REQUEST
2015-01-31 09:24:16
410
原创 我的学习之旅(34) sched.c
sched.c主要实现任务表初始化、任务调度、定时器、以及每个任务的处理。其中定时器部分直接拷贝linux sched.c的代码。sched.c源代码:#include #include #include #include #include #include #include #include #include #include #include
2015-01-31 09:03:21
494
原创 我的学习之旅(32)
setup.s并没有打开页功能,当前cpu只支持32位保护模式,这意味着访问的都是实际的物理地址。前面1M的内容不好乱动,所以内存都是从1M即:0x100000处开始分配使用。等网卡驱动的时候再考虑这个事情。现在先把任务调度功能跑起来再说。任务调度基本原理是:定时器触发中断,对应的中断相应函数保留当前现场(即:记录所有寄存器的值)后恢复之前的现场(即:加载上次记录的所有寄存器的值)。现场的
2015-01-30 15:18:32
351
原创 我的学习之旅(31) schedule和tools目录下的Makefile
INCLUDE = ../include CC = gcc -march=i386LD = ldAS = asCCFLG = -O2 -c -nostdinc -fno-builtin -fstrength-reduce -fomit-frame-pointer -finline-functions -I$(INCLUDE) -I. %.o: %.c @echo M
2015-01-30 15:12:42
377
原创 我的学习指旅(30) Makefile
boot_partition: @echo @echo Making boot... (cd boot; make clean; make;)kernel: $(OBJS) $(LIBS) $(DRIVERS) @echo @echo Making kernel... @$(LD) $(LDFLAGS) $(OBJ_DIR)start32.o $(OBJS) $(LI
2015-01-30 15:09:54
269
原创 我的学习之旅(29)Makefile
调整好目录后还要补充增加最外边的Makefile,主要功能是进入到boot、init、schedule、tools、drivers目录编译并做连接后用build_image工具打包成一个image整个image分布应该是这样:0~0x200:boot.s0x200~0x600: setup.s0x600~0x10000 kernel (setup.s 中加载kernel方法限制了当
2015-01-30 14:41:51
419
原创 我的学习之旅(33) sched.h
sched.h主要定义了时钟频率、任务数据结构、和sleep宏。sleep宏的实现主要功能是设置当前任务的sleep_time,然后通过软中断0x80做任务软切换。#ifndef __SCHED_H__#define __SCHED_H__#define HZ 100#define delay(ticks) __asm__ __volatile__ ("cli"::); \
2015-01-30 14:40:45
983
原创 我的学习之旅(28) 目录结构调整
kernel_start()函数增加对trap_init()的调用。void kernel_start(void){ clear_screen(DISP_FG_WHITE + DISP_BG_BLACK); (void)printk_init(); (void)trap_init(); return ;}文件越来越多,没办法了
2015-01-30 14:18:34
264
原创 我的学习之旅(27)io.h
IO.h代码主要涉及对端口的访问,大部分代码拷贝linux源代码io.h:#ifndef __IO_H__#define __IO_H__/*borrow source code from linux 1.1 source code: io.h*/#define outb(value,port) \__asm__ ("outb %%al,%%dx"::"a" (value)
2015-01-30 14:16:21
387
原创 我的学习之旅(26)system.h
#define lidt(_idt) \ __asm__ __volatile__ ( \ "lidtl (%%ebx)" \ : \ :"b"(_idt) \ ) #define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n))
2015-01-30 14:13:58
408
原创 我的学习之旅(25)system.h
#define int80() __asm__ ("int $0x80"::)/*copy from linux source code:system.h*/#define move_to_start_task() \__asm__ ("movl %%esp,%%eax\n\t" \ "pushl $0x10\n\t" \ "pushl %%eax\n\t" \ "push
2015-01-30 14:10:34
478
原创 我的学习之旅(24)system.h
system.h主要定义一些常用的x86汇编宏和字节序的处理。大部分都是拷贝linux中源代码.system.h源代码:#ifndef __SYSTEM_H__#define __SYSTEM_H__#ifndef NULL#define NULL 0#endiftypedef unsigned short u16;typedef unsigned ch
2015-01-28 09:40:16
1421
原创 我的学习之旅(23)traps.c和 start32.h
接下来就要先初始化中断向量。如书上所说,intel默认保留使用了0~31个中断给自己使用。这些中断目前不想处理。所以这些中断的处理函数只是打印一下就可以。traps.c源代码:#include #include #include void default_handle(void);void do_default_handle(){ /*do nothi
2015-01-28 09:33:42
315
原创 我的学习之旅(22)Makefile
case 'd': case 'i': flags |= SIGN; case 'u': str = number(str, va_arg(args, unsigned long),
2015-01-28 09:27:52
349
原创 我的学习之旅(20)vsprintf.c
switch (*fmt) { case 'c': if (!(flags & LEFT)) { while (--field_width > 0) { *str++ = ' '; }
2015-01-28 09:25:42
320
原创 我的学习之旅(21)vsprintf.c
case 'd': case 'i': flags |= SIGN; case 'u': str = number(str, va_arg(args, unsigned long),
2015-01-28 09:25:38
268
原创 我的学习之旅(22)vsprintf.c
switch (*fmt) { case '-': flags |= LEFT; goto repeat; case '+': flags |= PLUS; goto repeat; case ' ': flags |=
2015-01-28 09:21:40
280
原创 我的学习之旅(22)vsprintf.c
if (type & SPECIAL) { if (base == 8) { *str++ = '0'; } else if (base == 16) { *str++ = '0'; *str++ = digits[33]; } } if (!(t
2015-01-28 09:14:59
236
原创 我的学习之旅(21)vsprintf.c
static char * number(char *str, int num,int base, int size, int precision, int type){ char c, sign, tmp[36]; const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i;
2015-01-28 09:10:45
283
原创 我的学习之旅(16)stdarg.h和vsprintf.c
//格式化字符串实现在stdarg.h和vsprintf.c,stdarg.h和vsprintf.c文件沿用linux的stdarg.h文件。stdarg.h源代码:#ifndef __STDARG_H__#define __STDARG_H__typedef char *va_list;/* Amount of space required in an argumen
2015-01-27 17:56:39
474
原创 我的学习之旅(15)tty.c
模仿linux tty,建立一个console,通过对console的写操作完成字符的显示。tty.c源代码:#include #include #include #include #include static tty_struct_t g_tty_table[MAX_CHANNEL_ID];void tty_init(void){ int i
2015-01-27 17:55:46
354
原创 我的学习之旅(14)printk.c
void clear_row(unsigned char y,unsigned char color){ unsigned char *p; unsigned char i; p = (unsigned char *)(DISP_BASE_ADDR + (unsigned short)(y*DISP_MAX_X * 2) ); for( i =0;
2015-01-27 17:50:18
266
原创 我的学习之旅(13) printk.c
printk.c主要实现字符和字符串的打印包括x和y坐标以及字符的颜色。具体功能是:printk_char()在指定坐标打印字符;console初始化前调试打印使用。printk_string()在指定坐标处开始打印字符串;console初始化前调试打印使用。printk()在当前坐标(g_x,g_y)处开始打印字符串;snprintf()格式化字符串具体代码:#inclu
2015-01-22 16:34:30
516
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人