2009-11-28
Монгол хэл дээрх wikibook төслийг устгах гэж байна
2009-11-27
Линүксийн цөмийн програмчлал
Юникс (Unix) үйлдлийн систем нь маш их алдар хүндийг олсон боловч академээс гадуур хэрэглэхэд маш их өндөр өртэгтэй худалдагддаг байсан бөгөөд лиценз нь AT&T, Novell зэрэг томоохон компаниудын гар дамждаг байж л дээ. Тиймд хакерууд нээлттэй эх буюу үнэгүй тараагддаг "Юникстэй төстэй" (Unix-like) үйлдлийн системүүдийг хийж эхэлжээ. Ингээд Minix, BSD, Linux, Darwin гэх мэт үйлдлийн системүүд гарч ирлээ. Эдгээрээс Линүкс (Linux) нь нээлттэй эхийн хамт олны дунд маш их амжилтийг олж хөгжүүлэгдэж иржээ. Анхлан Линүкс үйлдлийн системийн цөмийг бичсэн, тухайн үедээ Финланд улсад оюутан байсан Лайнус Тровалдс нь одоог хүртэл Линүксийн цөмийг хөгжүүлэх явцад идэвхтэй оролцсоор байгаа юм.
Линүксийн хөгжүүлэлтэнд бусад нээлттэй эхийн хөгжүүлэлтийн үйл явцын адил байнгын оролцогч цөөн тооны мэргэжилийн хакерууд байх ба илүү олон тооны мэргэжилийн болон сонирхогч програмистууд оролцоно. Гэхдээ эдгээр нь Линүксийн цөм буюу kernel-ийг програмчлан нээлттэй эх кодыг нь kernel.org вэбсайтаар тараана. Үүн дээр үндэслээд хувь хүмүүс, албан байгууллагууд, ашгийн бус байгууллагууд, товчхондоо бол хүссэн хэн боловч өөрийн гэсэн Линүксийг бий болгон хэрэглэж болно. Эдгээрийн жишээ гэвэл: Red Hat Enterprise Linux, Mandriva, Debian, Ubuntu, ArchLinux, Puppy Linux, Knoppix, Damn Small Linux, Backtrack гээд өчнөөнийг дурдаж болно.
Цөмийг нь шинээр суулгахдаа өөрчилж болно. Энд нэгэн жишээг авч үзье.
Эхлээд зарим нэгэн юмыг тодорхой болгъё:
Програм нь хэрэглэгчийн түвшинд ажиллаж болно, эсвэл системийн түвшинд ажиллаж болно. Тиймч учраас хэрэглээний програм болон систеийн програм гэж нэршил байдаг боловуу. Хэрэглээний програм нь системийн дуудлага (system call) ашиглан системийн хэсэг болон техник хангамжтай харьцана. Жишээ нь энгийн C програманд fopen, printf, scanf зэрэг коммандууд нь цаанаа open, write, read системийн дуудлагуудыг ашиглан файл нээх, дэлгэцэнд бичих, дэлгэцнээс үсэгт авах зэрэг үйлдлийг хийнэ.
Юниксийн төрлийн үйлдлийн системүүдэд top гэсэн комманд ашиглаж санамжинд суурьлагдсан процессуудыг харж болдог билээ. Энэ нь Виндовс үйлдлийн системийн Task Manager гэсэн үг л дээ.
Тэгэхээр нэг ийм юм хийж туршиж үзье; системийн дуудлага ашиглан ажилж буй процессийг top дээр харагддаггүй болгодог.
Би Дэбиан (Debian) үйлдлийн систем дээр ажиллаж байгаа. Ингээд доорх коммандуудаар зарим програмуудыг татаж авья. # гэсэн тэмдэг нь root хэрэглэгчээр орсон гэсэн үг. Ер нь бол бүх юмаа тэгж хийсэн.
Програмуудынхаа листийг шинэчилэнэ:
# apt-get update
Линүксийн цөмийг татаж авна. Миний цөм Linux kernel 2.6.26 учир мөн адил цөмийг татна. Хэрэв таны ажилж буй Линүксийн цөм нь өөр бол тохирох цөмийг татаж авна уу.
# apt-get install linux-source
Цөмийг суулгахад хэрэглэгдэх багцыг татаж авна.
# apt-get install kernel-package
Мөн доорх туслах багажуудыг татаж авна:
# apt-get install fakeroot # apt-get install libncurses5-devИнгээд хэрэгтэй зүйлсээ татаад суулгачихлаа. Линүксийн цөмийн эх код /usr/src/ хавтасанд хадгалагдсан байгаа. Түүнийг задална:
# tar xjvf linux-source-2.6.26.tar.bz2 # cd linux-source-2.6.26/usr/src/linux-source-2.6.26 хавтас үүсэх бөгөөд энд Линүксийн хэрэгтэй файлууд бий. Одоо бидэнд тохиргооны .config файл хэрэгтэй. Энэ файлын тусламжтайгаар үйлдлийн систем маань ямар, ямар файл системийг дэмжих үү, ямар ямар техник хангамж дэмжих вэ гэдгийг тохируулж болно. Та өөрийн урьтаж бэлдсэн .config файлыг хэрэглэж болно, эсвэл үйлдлийн системийн /boot/ хавтасанд орших config-2.6.26-x-xxx файлыг хуулж тавиад нэрийг нь .config болгож өөрчилсний дагуу хэрэглэж болно.
mv /boot/config-2.6.26-2-686 /usr/src/linux-source-2.6.26/.configОдоо кодоо өөрчилж эхэлье. Туршилтаа одоо илүү нарийн дэтальчилж доорх шатуудад хуваая:
- Процессийн бүтцэд visible гэдэг шинж чанар өгөөд анхны утгыг 1 гэж өгье
- Тодорхой нэгэн ажилж буй процессийн pid нь өгөгдсөн байхад visible утгыг нь 0 эсвэл 1 болгодог системийн дуудлага хийе
- Ажилж буй процессуудын visible утгуудыг нь шалгаад 1 байвал л top дээр харагддаг болгьё
- Хэрэглээний түвшинд ажиллаад шинэ системийн дуудлагыг ашигладаг шалгах програм бичье
1-р шатны ажилаа хийе. Процессийн бүтэц нь include/linux/sched.h файлан доторх "struct task_struct {}" тодорхойлолтонд багтана. Тэр бүтцийн тодорхойлолтын хамгийн дор нь "int visible;" гээд нэмнэ. Ингэснээр доорх шиг харагдах болно.
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
void *stack;
atomic_t usage;
unsigned int flags;
...
int visible;
};
Шинэ процесс үүсэхэд kernel/fork.c файлан доторх copy_process() функц хэрэглэгдэнэ. Тэнд visible утгаа 1 гэж зааж өгнө. Ингэснээр доорх шиг харагдах болно.
static struct task_struct *copy_process(unsigned long clone_flags,
unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *child_tidptr,
struct pid *pid)
{
...
struct task_struct *p;
...
p = dup_task_struct(current);
p->visible = 1;
...
}
2-р шатны ажилаа хийе.
- Интэл (Intel) чиптэй компьютерт arch/x86/kernel/syscall_table_32.S файлд доорхыг нэмнэ.
long sys_set_visibility
-
include/linux/syscalls.h файлд системийн дуудлагын прототипийг нэмнэ.
asmlinkage int sys_set_visibility(pid_t pid, int flag);
-
arch/x86/include/asm/unistd_32.h файланд системийн дуудлагын бүртгэлийг хамгийн сүүлийн бүртгэлийг нэгээр нэмэгдүүлж оруулна.
#define __NR_... 332 #define __NR_set_visibility 333
-
mycall хавтасыг үүсгээд set_visibility.c файлыг үүсгэж доорхыг нэмнэ.
#include <linux/kernel.h> #include <linux/sched.h> asmlinkage long sys_set_invisibility(pid_t pid, int flag) { struct task_struct *task = &init_task; do { if(task->pid == pid){ task->visible = flag; return 0; } } while ( (task = next_task(task)) != &init_task ); return -1; } -
Эцэст нь цөмийг компайл хийхэд ашиглагдах Makefile-уудад өөрчлөлтүүдээ мэдэгдэнэ. /usr/src/linux-source-2.6.26/Makefile файлд доорхыг нэмнэ.
core-y := ... mycall/
mycall/Makefile үүсгэж доорхыг нэмнэ.obj-y := set_visibility.o
3-р шатны ажилаа хийе. Ажиллаж байгаа хэсгүүдийн /proc хавтасанд үүссэн мэдээллийг авдаг хэсгийн код нь fs/proc/base.c файлын proc_pid_readdir() функцэнд байна. Доорх мэдээллийг нэмж бичнэ:
...
int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
...
struct tgid_iter iter;
...
iter.task = NULL;
...
for (iter = next_tgid(ns, iter);
iter.task;
iter.tgid += 1, iter = next_tgid(ns, iter)) {
if (iter.task->visible == 1) {
filp->f_pos = iter.tgid + TGID_OFFSET;
if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) {
put_task_struct(iter.task);
goto out;
}
}
}
...
}
...
4-р шатны ажилаа хийе. Шалгах програмыг (test.c) бичээд Desktop дээр хадгалаад компайл хйинэ. test.c
#include <sys/unistd.h>
#include <stdio.h>
#define __NR_set_invisibility 328
int main(void) {
int x,y,z=-1;
while (1) {
printf("Hello! You can set visibility of a process with this program.\n");
printf("Enter '<pid> <flag>' and hit! : Process ID, : 0 to make invisible ");
printf("and 1 to make it visible again.\n");
scanf("%d %d", &x, &y);
z = syscall(__NR_set_invisibility, x, y);
if (z == 0) {
printf(">>> Your modification was successful! Please review with 'top'!\n");
} else {
printf(">>> Error! There was a problem. Most probably, the process with this pid doesn't exist!");
}
}
}
Дээрх кодоо компайл хийгээд програм болгочихье.
/home/dagvadorj/Desktop # gcc test.c -o testИнгээд Линүкс цөм дээр хийх өөрчлөлтүүдээ хийж дууслаа. Одоо ингээд Линүкс цөмөө компайл хийе. Эхлээд цөм дээрээ тохиргоогоо хийнэ. Энд Линүксийн ямар техник хангамж, файлын систем дэмжих вэ гэдгийг тохируулж болно.
# cd /usr/src/linux-source-2.6.26 # make menuconfigЖич: Дараа дараагийн алхмуудын дараа шинэ Линүксийн үйл ажиллагаанд ямарваа нэгэн алдаа гарвал хуучин тохиргоогоо
make oldconfig гэсэн коммандаар сэргээж болно.
Дараагийн алхамд хуучин компайлаас үлдсэн зүйлийг устгана.
# make-kpkg cleanЖич: Анх удаа компайл хийж буй тохиолдолд ингэж хийх шаардлагагүй гэдгийг анхаарна уу. Дараа нь Линүксийг компайл хийнэ. Доорх нь 20 минутаас 1 цаг үргэлжилж болно. Энэ хугацаа нь Линүксийн ямар техник хангамж, файл систем дэмжиж ажиллахаар тохируулагдсанаас шалтгаална. Илүү олон зүйл дэмжвэл илүү удна гэсэн үг. "harbin" гэдэг үгийн оронд таны өөрийн дурын нэр байж болно. Монгол хэл дээрх анхны сонин Харбинд хэвлэгдэж байсан, тэнд Гадаад Монголын мэргэжилтэн гар бие оролцож байсныг санан ийн нэрлэсэн билээ.
# fakeroot make-kpkg -initrd -append-to-version=-harbin linux_image linux_headersИнгэсний дараа /usr/src хавтасанд 2 ширхэг .deb өргөтгөлтэй файл үүснэ. Тэдгээрийг доорх коммандуудаар суулгана.
# dpkg -i linux-image-2.6.26-harbin-2.6.26-harbin-10.00.Custom_i386.deb # dpkg -i linux-headers-2.6.26-harbin-2.6.26-harbin-10.00.Custom_i386.deb/boot хавтасанд Линүкс асахад хэрэгтэй initrd.img-2.6.26-harbin, vmlinuz-2.6.26-harbin ба бусад файлууд үүссэн байна. Зарим тохиолдолд /boot/initrd.img-2.6.26-harbin файл үүсээгүй байж болно. Энэ үед:
mkinitramfs -o /boot/initrd.img-2.6.26-harbin/boot/grub/menu.lst файлд доорх эхлүүлэх сонголт нэмэгдсэн байгаа.
title Debian/GNU Linux, kernel 2.6.26-harbin root (hd0,1) kernel /boot/vmlinuz-2.6.26-harbin root=/dev/hda2 ro quiet initrd /boot/initrd.img-2.6.26-harbinОдоо компьютерээ reboot хийхэд эхлэх сонголт дээр harbin гарч ирэх бөгөөд сонгоод орно уу! top програмыг ажиллуулна уу!
# topДоорх дэлгэц гарч ирнэ:
Desktop дээр байгаа test програмыг ажиллуулсны дараа:
1,2,3 бүхий процессууд харагдахгүй байгааг анхаарна уу!
За ингээд Линүксийн цөмийг жаахан ч гэсэн өөрчилөөд ажиллуулж үзлээ.
2009-11-15
Моторолла 6800
org $0000 clra clrb ldaa #6 ; find F6 staa $001E ; n=6 ldaa #1 ; A=F0 ldab #1 ; B=F1 start: staa $001F ; Fn=A aba ; A=A+B dec $001E ; n=n-1 tst $001E ; test if n=0 bne notyet ; if not branch to notyet swi ; software interrupt notyet: ldab $001F ; b=Fn jmp start ; jump to start
2009-11-11
Ассемблэр дээр код бичих
segment .data ; used for assigned variables
msg db "Hello, world!",10
len equ $ - msg ; macro to calculate length of msg
; equ for constant, ($-msg) means substract
; msg's head address location from current address location
segment .text
global _start
_start: ; starting point
mov eax,4 ; print system call
mov ebx,1 ; standard output
mov ecx,msg ; the message to print
mov edx,len ; the length
int 80h ; software interrupt
mov eax,1 ; exit system call
mov ebx,0 ; successful
int 80h ; software interrupt
гэж бичээд foo.asm нэр өгч хадгалья.
Дээрх програмын обьект файлыг Линүксд зориулж үүсгэхдээ:
nasm -f elf foo.asm -o foo.oОдоо доорх коммандаар машины хэл дээрх кодыг нь харья:
nasm -f elf foo.asm -l foo.lisИнгэхэд foo.lis файл үүссэн байна. Агуулгыг нь харвал:
1 segment .data 2 00000000 48656C6C6F2C20776F- msg db "Hello, world!",10 3 00000009 726C64210A 4 len equ $ - msg 5 6 segment .text 7 global _start 8 9 _start: 10 00000000 B804000000 mov eax,4 11 00000005 BB01000000 mov ebx,1 12 0000000A B9[00000000] mov ecx,msg 13 0000000F BA0E000000 mov edx,len 14 00000014 CD80 int 80h 15 16 00000016 B801000000 mov eax,1 17 0000001B BB00000000 mov ebx,0 18 00000020 CD80 int 80hэндээс компьютэрийн RAM санамж дээр бичигдэж ажиллах машины код харагдаж байна. Хэдийгээр эхний хаяг 0x00000000 гэж харагдаж байгаа ч санамжинд хуулагдах үед үйлдлийн систем хоосон буй өөр хаягаа оноож өгнө. Дээрх машины коп нь програмаас гараад software interrupt хийж байгаа учир линкэр ашиглан уншигддаг програм болгож болно:
ld foo.o -o foo -e _startТэгээд шууд
./foo гээд ажиллуулж болно.
Одоо өөр нэг жишээ авч үзье. Доорх жишээнд C хэл дээр бичигдсэн програмаас ассемблэрийн хэл дээр бичигдсэн рутинийг ажиллуулах болно.
bar.c
#includeint star(); int fibo(int k); int main() { int k,i; k = star(); printf("Number is: %d\n", k); k = fibo(5); printf("5-th Fibonacci number is: %d\n", k); for(i=0;i<=8;i++) { printf("%d ", fibo(i)); } printf("\n"); return 0; }
bar.asm
global star global fibo segment .bss sum resb 1 segment .text star: mov ecx,8 mov edx,9 add ecx,edx mov [sum],ecx mov eax,[sum] ret fibo: push ebp mov ebp,esp mov eax,1 mov ebx,1 mov edx,[ebp+8] cmp edx,1 jle fstop dec edx fstep: mov ecx,eax add eax,ebx dec edx mov ebx,ecx cmp edx,0 jne fstep fstop: pop ebp retАжиллуулахдаа:
1 - Ассемблэр кодноос обьект файл үүсгэнэ:
nasm -f elf bar.asm -o barasm.o2 - C кодноос обьект файл үүсгэнэ:
gcc -c bar.c -o barc.o3 - Обьект файлуудыг холбоно:
gcc barasm.o barc.o -o bar4 - Програмыг ажиллуулна:
./bar
USB дээр Damn Small Linux суулгах
- dsl-
[version]-embedded.zip файлыг татаж аваад форматласан USB санамжийн төхөөрөмжид задална - syslinux -ma G: гэж USB төхөөрөмжөө Bootable болгоно
- BIOS дээр компьютерээ USD төхөөрөмжөөс эхэлж Boot хийдэг болгоод асаана
2009-08-10
Android дээр хэрэглээний програм хөгжүүлэх
Android нь анхлан Google-ийн зүгээс хөгжүүлэгдэн нээлттэй эх кодтой болгогдсон гар утсанд зориулагдсан үйлдлийн систем юм.
Android нь Linux кернел дээр ажилладаг. Кодыг Java програмын хэл ашиглан хөгжүүлнэ. SDK нь JSON, SQLite, HttpClient гэх мэт маш хэрэгцээтэй бүтээгдэхүүнүүдийг агуулдаг учир програм хөгжүүлэхэд тун хялбар болгож байна.
Энд Android SDK ашиглан програм хөгжүүлье. Гэхдээ алхам алхам явахгүй, гүйцэд код тайлбарлах маягаар урагшлах болно.
Програм
UBList нь түрээслүүлэх болон зарах үл хөдлөх хөрөнгө хайх Android системтэй үүрэн телефонд зориулсан хэрэглээний програм (үүнээс хойш "програм" гэнэ) юм. UBList програмыг ашиглан ямарваа нэгэн хот дотор дүүрэг, хороолол, хайж буй үл хөдлөх хөрөнгийн төрөл болон үнийн дээд хязраарыг сонгосны (хоосон орхиж болно) дагуу хайлт хийн хайлтан дотроосоо зар сонгон илүү их мэдээллийг олж авах мөн газрын зураг дээр байршлыг нь харах, зар тавьсан этгээдрүү залгах боломжтой. Энэхүү програм нь Улаанбаатар болон дэлхийн бусад том метрополь хотуудад үл хөдлөх хөрөнгө хайгсадад хэрэгцээтэй байх боловуу.Энэ бичлэгийг дуусгаагүй байгаадаа хүлцэл өчье!